uniapp开发ios,scroll-view横向滚动失效,给scroll-view添加flex-row样式、内部子元素添加一个flex-row的父容器即可

更正——这个问题有了最新的解决方案:
给scroll-view添加flex-row样式、内部子元素添加一个flex-row的父容器即可。经验证,ios、安卓段子展示均正常。
示例代码:

<!-- 头部二级导航 -->
<scroll-view
class="header flex_wrap flex_row flex_left flex_middle"
scroll-x="true"
:scroll-into-view="scroll_into_view0"
scroll-with-animation="true"
show-scrollbar="false"
>
<view class="flex_row">
<text
class="btn f12 border_radius30"
@click="headerNavClick(index)"
v-for="(item, index) in topNavList"
:key="index"
>
{{ item.sub_rack_name }}
</text>
</view>
</scroll-view>

如上, flex_row,flex_left,flex_middle均为封装好的样式,即横向、水平靠左、垂直居中布局。、


以下是老方法,操作有点复杂,不建议使用了!

这是老bug了,官方一直没有解决掉。已经摸索到完美解决方案,遇到这个问题的可以看下。

本文以三级导航页面中的二级横向滚动导航为例,说明如何做到不同宽度子元素的横向滚动。

bug定位:

本来横向滚动只要子元素宽度大于scroll-view固定宽度就可以滚动的,但是IOS App开发中子元素高度必须要大于scroll-view宽度才能滚动,应该是拿错参数了。
解决方案:
scroll-view内部添加一个宽度为1像素的透明的占位View把内部容器的高度撑大即可(下图红色线条所示),高度为子元素的总宽度(下图蓝框),这样无论有多少个子元素,都能做到自适应滚动了。

具体操作如下:

  1. ScrollView里边的子元素必须有一个父容器,没有的话先添加一个,并设置为横向布局。
  2. 在获取到子元素数据之后通过dom.getComponentRect来获取子元素父容器的总宽度。
  3. 添加一个与子元素父容器同级的宽度为1像素的透明的占位view,高度设置为子元素父容器的宽度。

如此即可,问题完美解决,横向可以滚动了,也不影响界面展示。

由于是动态获取子元素总宽度作为占位View的高度,所以即使子元素是动态数据,也能做到自适应滚动的。
示例代码如下:

<scroll-view class="header flex_wrap flex_center bg_grey flex_top on" scroll-x="true" :scroll-into-view="scroll_into_view0" scroll-with-animation="true" show-scrollbar="false">
    <!--占位用-->
    <view id="navStart" style="width:1rpx;background-color: transparent;" :style="{ height: subNavWidth * 2 + 'rpx' }"></view>
    <!--子元素父容器,获取总宽度用-->
    <view ref="subNav" class="flex_row">
        <text :id="'nav' + index" class="btn f12 border_radius30" :class="activeIndex2 == index ? 'active bg_grey' : 'bg_white'" @click="headerNavClick(index)" v-for="(item, index) in topNavList" :key="index">
            {{ item.sub_rack_name }}
        </text>
    </view>
</scroll-view>
var refDom = this.$refs.subNav;
var result = dom.getComponentRect(refDom, option = >{
    this.subNavWidth = option.size.width;
});

PS:即使是固定内容的横向滚动,也要添加高度不小于滚动内容总宽度的,如果已经知道具体数值可以直接写,不用再通过dom获取。

posted on 2024-03-22 17:08  逍遥云天  阅读(32)  评论(0编辑  收藏  举报

导航