iOS - ScrollView滚动详解

有两种滚动ScrollView的方法:

1.用户手动滚动,即用户手势识别——主要识别两种手势:

drag(拖拽)手势和flick(轻弹)手势区别:flick(轻弹)手势是drag(拖拽)手势的一个变种。flick(轻弹)手势在用户手指离开屏幕后有一个惯力,该惯力在手势结束后使scrollView继续减速滑动。在scrollView减速滑动期间,用户触摸屏幕会停止scrollView的减速滑动。
问题:flick(轻弹)手势会产生一个惯力,该惯力由拖动的速度决定,该速度可以由

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

方法中的velocity参数获取,最终停止位置由targetContentOffset参数获取,即可以根据targetContentOffset和当前scrollView的contentOffset推断出减速滑行距离;减速速率可以由scrollView的decelerationRate得到;速度、滑行距离和减速速率这三个参数之间应该由某个公式或准确关系决定,求知晓该公式的网友赐教该公式或准确关系。

2.代码滚动:编写代码直接滚动到某个位置

scrollView的重要的状态属性

状态属性描述
tracking当用户手指与设备屏幕接触的时候为YES
dragging当用户手指与设备屏幕接触并产生移动时为YES
deceleratingflick手势之后或拖动超过滚动区域并回弹后产生减速时为YES
zooming捏放手势使zoomScale改变的时候为YES
contentOffsetscrollView的bounds的左上角位置

使用代码滚动scrollView

  1. 滚动到特定位置–设置scrollView滚动到一个特定的contentOffset
    方法:setContentOffset:animated:
  • 当animated为YES 时, 以一定的速率滚到到指定的位置,滚动完成后, 回调delegate的该方法:
    ‘scrollViewDidEndScrollingAnimation:‘
  • 当animated为NO 时, scrollView直接将contentOffset设置到指定的位置,没有任何动画效果,也不会回调scrollViewDidEndScrollingAnimation:方法
  1. 使某个区域可视方法: scrollRectToVisible:animated:
  • 当animated为YES 时, 以一定的速率滚将指定区域滚动到可视视图中,滚动完成后, 回调delegate的该方法:
    scrollViewDidEndScrollingAnimation:
  • 当animated为NO 时, scrollView直接将指定区域设置到可视视图中,没有任何动画效果,也不会回调scrollViewDidEndScrollingAnimation:方法
注意:1)指定区域本身可视,scrollView不会产生滚动 2)指定区域不可视或部分不可视,将指定区域滚动到最近的可视范围内

关于指定区域的大小分为三种情况:

  • 第一种情况:指定区域的高度和宽度都小于或等于可视区域的高度和宽度
  • 第二种情况:指定区域的高度和宽度,其中一个小于或等于可视区域对应的长度,其中一个大于可视区域的长度
  • 第三种情况:指定区域的高度和宽度都大于可视区域的高度和宽度
第一种情况演示:

在这里插入图片描述
在这里插入图片描述

第一种情况变体演示1:

在这里插入图片描述
在这里插入图片描述

第一种情况变体演示2:

在这里插入图片描述
在这里插入图片描述

第一种情况变体演示3:

在这里插入图片描述
在这里插入图片描述

3.点击状态栏滚动到顶部

scrollView默认点击状态栏,当前视图中的scrollView滚动到顶部。
该功能主要由代理方法scrollViewShouldScrollToTop:返回YES或NO
决定是否开启,默认为YES,开启该功能。
当该功能开启,并点击状态栏滚动到顶部后,会回调scrollViewDidScrollToTop:方法。

注意:

1)代码滚动时即上述三种滚动,scrollView的属性tracking和dragging为NO, 因为屏幕上没有触摸(对应tracking)或者触摸在屏幕上移动(对应dragging) ;
2)scrollViewDidScroll:在每次contentOffset改变的时候都会回调

用户操作滚动scrollView

在这里插入图片描述

注意:

在用户操作回调流程图中并没有列出scrollViewDidScroll:方法,scrollViewDidScroll:是在contentOffset改变的时候回调,在用户操作回调流程图中该方法并不会固定在某个步骤,在该流程图中只要有改变contentOffset的地方都会回调scrollViewDidScroll:方法

分析用户操作回调流程图中的重要步骤

  1. 用户触摸屏幕时, scrollView的tracking属性立即变为YES,只要用户的手指保持和屏幕的接触, tracking一直为YES, 不管是否手指在屏幕上移动。
    注意:当用户的手指保持不动的时候,内容视图能够响应该触摸事件和处理该触摸事件,如果在用户的手指离开屏幕之前未被scrollView识别为拖动,该情况下不会进入到用户操作回调流程图中第二步–产生拖动
  2. 如果用户移动手指,并为scrollView识别为拖动,则scrollView的dragging属性立即变为YES,回调scrollViewWillBeginDragging:方法。
    注意:当用户操作被识别为拖动时,手势识别的cancelsTouchsInView属性为YES, 内容视图处理该触摸事件的过程会被取消,即会发送touchesCancelled: withEvent:消息,这里的内容视图指的是UIView视图或其子视图,如果是UIControl控制子视图,表现可能不一样,这里涉及到了手势与触摸事件的冲突,具体可以参考网上关于手势与触摸事件的冲突的文章
  3. 手指离开屏幕, scrollView的tracking属性立即变为NO, dragging属性立即变为NO
  4. 手指离开屏幕后,会调用scrollViewWillEndDragging:withVelocity: targetContentOffset:方法,根据手指离开屏幕后scrollView是否可以继续滑动,以decelerate参数的不同来回调scrollViewDidEndDragging:willDecelerate:方法。手指离开屏幕后scrollView继续滑动的情况分为两种:轻弹手势在手指离开屏幕后产生惯力和拖动超过可滚动区域后产生回弹。
  5. 如果scrollViewDidEndDragging:willDecelerate:方法的decelerate参数为NO,手指离开屏幕后scrollView不会继续滑动,该情况下用户操作滚动scrollView的回调流程结束。
  6. 如果scrollViewDidEndDragging:willDecelerate:方法的decelerate参数为YES,手指离开屏幕后scrollView继续滑动,该情况下用户操作滚动scrollView的回调流程继续。
  7. scrollView开始减速,decelerating属性为YES
  8. scrollView减速结束, decelerating属性为NO。如果在减速的过程中,用户触摸屏幕会使减速立即停止。至此该用户的滚动操作回调流程结束。
注意:

zoom缩放也会产生滚动,zoom缩放的情况下回调中zooming属性为YES, tracking属性和dragging属性可能一直为NO,关于该情况在ScrollView缩放详解中探讨

总结

该文章主要探讨ScrollView的滚动,有两种方式导致ScrollView滚动(这里的两种方式不包括zoom缩放产生的滚动,zoom缩放产生的滚动只会调用scrollViewDidScroll:方法,其他用户操作回调流程图的回调方法不会调用):用户手动滚动和代码滚动ScrollView, 分别剖析了
1)代码滚动ScrollView的方法以及产生的回调;
2)用户手动滚动代码的回调流程。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android中的ScrollView滚动监听可以通过设置OnScrollChangeListener来实现。具体步骤如下: 1. 在布局文件中添加ScrollView控件,并设置其id。 2. 在Java代码中获取ScrollView控件,并设置OnScrollChangeListener。 3. 在OnScrollChangeListener中实现滚动监听的逻辑。 示例代码如下: XML布局文件: <ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 添加需要滚动的内容 --> </ScrollView> Java代码: ScrollView scrollView = findViewById(R.id.scrollView); scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { // 在此处实现滚动监听的逻辑 } }); 在onScrollChange方法中,可以获取ScrollView滚动位置scrollX和scrollY,以及上一次的滚动位置oldScrollX和oldScrollY。通过这些参数,可以实现各种滚动监听的逻辑,例如:滚动到底部加载更多数据、滚动到顶部显示“回到顶部”按钮等。 ### 回答2: Android的ScrollView控件是一个可以放置多个子控件的视图容器,用于实现可滚动的UI界面。在Android中,我们可以通过设置ScrollView滚动监听来监听ScrollView控件的滚动状态,从而对UI界面进行动态的调整和处理。 ScrollView控件的滚动监听主要包括两个方面:滚动状态的监听和滚动位置的监听。 滚动状态的监听可以通过设置ScrollView的setOnScrollChangeListener()方法来实现。该方法会在ScrollView滚动状态改变时被调用,并传递当前ScrollView滚动状态、滚动距离以及滚动速度等相关参数。我们可以根据这些参数来动态地调整UI界面的布局和显示效果。 例如,我们可以利用滚动状态的监听来实现下拉刷新的效果:当用户下拉ScrollView时,我们可以通过监听ScrollView滚动状态来判断用户已经下拉到了一定的距离,并在这个状态下展示一个带有下拉箭头的刷新提示框。当用户松开手指,ScrollView返回到原来的位置时,我们可以通过滚动状态的监听来判断滚动是否已经停止,并执行数据更新的操作。 滚动位置的监听可以通过重写ScrollView的onScrollChanged()方法来实现。该方法会在ScrollView滚动位置发生改变时被调用,并传递当前ScrollView相对于顶部的偏移量。我们可以根据这个偏移量来实现一些动态的效果,比如浮动的导航栏、滚动到一定位置后自动展开的菜单等。 总之,ScrollView滚动监听在Android中是非常常用的功能,尤其是对于需要实现可滚动界面的应用程序。通过设置滚动监听,我们可以实现一些非常丰富和动态的UI效果,让应用程序的用户体验更加流畅和便捷。 ### 回答3: Android ScrollView是一个常用的控件,用于在屏幕上展示超过屏幕高度的内容。随着用户向下或向上滑动,这些内容会随之滚动。 在某些情况下,我们希望在用户滚动过程中对ScrollView进行一些操作。这时,就需要使用ScrollView滚动监听功能。 ScrollView滚动监听可以通过setOnScrollChangeListener()方法来实现。该方法需要传入一个OnScrollChangeListener接口,该接口中包含一个onScrollChange()方法,可以在ScrollView滚动时被调用。下面是一个简单的示例: scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { // 在此处添加需要执行的操作,例如: if(scrollY > oldScrollY) { Log.d("ScrollView", "向下滚动"); } else { Log.d("ScrollView", "向上滚动"); } } }); 在onScrollChange()方法中,我们可以获取ScrollView当前的滚动位置(即scrollX和scrollY)。如果要执行某些需要在滚动过程中不断改变的操作,例如某个View的透明度或位置,我们可以在此处进行计算并实时更新View的状态。 除此之外,我们还可以通过ScrollView的getScrollX()和getScrollY()方法来获取ScrollView当前的滚动位置。此外,我们可以从onScrollChange()方法中获取被滚动的View对象(即ScrollView本身)。这些方法都可以在我们需要在滚动过程中对ScrollView进行控制时有很大帮助。 总体而言,ScrollView滚动监听功能为我们在ScrollView滚动过程中添加各种操作提供了便利。结合其他Android UI控件,我们可以创建出更灵活、更多样化且物美价廉的用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值