UIScrollView的总结

来源:互联网 发布:微信配图软件 编辑:程序博客网 时间:2024/06/06 15:43

概述

  • UIScrollView可以展示比设备屏幕更大区域的内容,我们可以通过手指滑动来查看内容视图的每一部分内容,也可以通过手指捏合来对内容视图进行缩放操作,它是 TableView
    UITextView
    的父类。

属性与方法

注: 本文中所说的”内容视图”在官方文档中称作”content view”,表示UIScrollView中可以用来展示内容的部分

内容视图相关

// 内容视图的大小,默认为CGSizeZero@property(nonatomic) CGSize contentSize;// 为内容视图周围增加可滚动区域,默认为UIEdgeInsetsZero@property(nonatomic) UIEdgeInsets contentInset;// 内容视图的原点相对于scrollView的原点的偏移量(左上方向偏移为正数),默认为CGPointZero@property(nonatomic) CGPoint contentOffset;// 设置内容视图的原点相对于scrollView的原点的偏移量- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

滚动相关

// 是否允许滑动,默认为YES@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;// 是否只允许同时滑动一个方向,默认为NO,如果设置为YES,用户在水平/竖直方向开始进行滑动,便禁止同时在竖直/水平方向滑动(注: 当用户在对角线方向开始进行滑动,则本次滑动可以同时在任何方向滑动)@property(nonatomic, getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;// 是否允许点击状态栏让距离状态栏最近的scrollView滑动到顶部,默认为YES(注: 在iPhone中如果有多个将该属性设置为YES的scrollView,则该方法无效;在iPad中则将距离状态栏最近的scrollView滑动到顶部)@property(nonatomic) BOOL scrollsToTop;// 是否按页数进行滑动,默认为NO,如果设置为YES,则在滑动时只会停止在scrollView的bounds的倍数处@property(nonatomic, getter=isPagingEnabled) BOOL pagingEnabled;// 是否有触底反弹效果,默认为YES@property(nonatomic) BOOL bounces;// 是否总是有触底反弹效果(即使内容视图小于scrollView的大小),默认为NO(注: 生效的前提条件为bounces = YES)@property(nonatomic) BOOL alwaysBounceHorizontal;@property(nonatomic) BOOL alwaysBounceVertical;// 指定用户手指离开屏幕后滑动减速的比率,默认为UIScrollViewDecelerationRateNormal(慢慢停止),其余可选项为UIScrollViewDecelerationRateFast(快速停止)@property(nonatomic) CGFloat decelerationRate;// 将指定区域滑动到刚好可见处(即距离边缘最近处)- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

指示条

// 指示器样式,默认为UIScrollViewIndicatorStyleDefault(黑内容白边框,适用于任何背景),其余可选项为UIScrollViewIndicatorStyleBlack(全黑)和UIScrollViewIndicatorStyleWhite(全白)@property(nonatomic) UIScrollViewIndicatorStyle indicatorStyle;// 为指示器周围增加可滚动区域,默认为UIEdgeInsetsZero@property(nonatomic) UIEdgeInsets scrollIndicatorInsets;// 是否在滑动时指示器可见,默认为YES@property(nonatomic) BOOL showsHorizontalScrollIndicator;@property(nonatomic) BOOL showsVerticalScrollIndicator;// 闪一下指示器(注: 建议在scrollView展示给用户时调用一下,以提醒用户该处可滑动)- (void)flashScrollIndicators;

事件相关

SrollView处理触摸事件原理

当用户在UIScrollView的一个子视图上按下时,UIScrollView并不知道用户是想要滑动内容视图还是点击对应子视图,所以在按下的一瞬间,事件UIEvent从UIApplication传递到UIScrollView后,其会先将该事件拦截而不会立即传递给对应的子视图,同时开始一个150ms的倒计时,并监听用户接下来的行为

  • 当倒计时结束前,如果用户的手指发生了移动,则直接滚动内容视图,不会将该事件传递给对应的子视图;

  • 当倒计时结束时,如果用户的手指位置没有改变,则调用自身的-touchesShouldBegin:withEvent:inContentView:方法询问是否将事件传递给对应的子视图(如果返回NO,则该事件不会传递给对应的子视图,如果返回YES,则该事件会传递给对应的子视图,默认为YES)

  • 事件被传递给子视图后,如果手指位置又发生了移动,则调用自身的-touchesShouldCancelInContentView:方法询问是否取消已经传递给子视图的事件

/ 返回是否用户已经触碰了内容视图准备进行滑动(注: 该值被设置为YES的时候可能用户只是触碰了内容视图,但是并没有开始进行滑动)@property(nonatomic,readonly,getter=isTracking) BOOL tracking;// 返回是否用户已经开始滑动内容视图(注: 该值被设置为YES之前可能需要先滑动一段时间或距离)@property(nonatomic,readonly,getter=isDragging) BOOL dragging;// 返回是否处于减速状态(即手指已经离开屏幕,但scrollView仍然处于滑动中)@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;// 是否延迟事件传递,默认为YES,如果设置为NO,scrollView会立即调用-touchesShouldBegin:withEvent:inContentView:方法以进行下一步操作@property(nonatomic) BOOL delaysContentTouches;// 是否可以取消内容视图被触摸,默认为YES,如果设置为NO,则一旦开始跟踪事件,即使手指进行移动也不会取消已经传递给子视图的事件@property(nonatomic) BOOL canCancelContentTouches;// 在UIScrollView的子类中重写该方法,用于返回是否将事件传递给对应的子视图,默认返回YES,如果返回NO,该事件不会传递给对应的子视图- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;// 在UIScrollView的子类中重写该方法,用于返回是否取消已经传递给子视图的事件,默认当子视图是UIControl时返回NO,否则返回YES(注: 该方法被调用的前提是canCancelContentTouches = YES)- (BOOL)touchesShouldCancelInContentView:(UIView *)view;

缩放相关

当用户使用两个手指进行缩放操作时,我们调整内容视图的偏移量和缩放比例(注: 用户两个手指操作结束后,有可能仍然有一个手指在操作,这时不会将事件传递给子视图)

// 最小缩放比例,默认为1.0@property(nonatomic) CGFloat minimumZoomScale;// 最大缩放比例,默认为1.0(必须大于minimumZoomScale才能正常工作)@property(nonatomic) CGFloat maximumZoomScale;// 缩放比例,默认为1.0@property(nonatomic) CGFloat zoomScale;// 设置缩放比例- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated;// 缩放到指定区域- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated;// 是否允许触底反弹,默认为YES@property(nonatomic) BOOL bouncesZoom;// 返回是否正在缩放@property(nonatomic,readonly,getter=isZooming) BOOL zooming;// 返回是否正在触底反弹@property(nonatomic,readonly,getter=isZoomBouncing) BOOL zoomBouncing;

键盘相关

// 隐藏键盘模式,默认为UIScrollViewKeyboardDismissModeNone(不隐藏键盘),其余可选项为UIScrollViewKeyboardDismissModeOnDrag(当拖拽scrollView时隐藏键盘)和UIScrollViewKeyboardDismissModeInteractive(当拖拽键盘上方时隐藏键盘)@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode;

代理

滑动相关

// 当scrollView的contentOffset发生变化时调用- (void)scrollViewDidScroll:(UIScrollView *)scrollView;// 将要开始拖拽时调用(注: 该方法可能需要先滑动一段时间或距离才会被调用)- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;// 当用户停止拖拽时调用(注: 应用程序可以通过修改targetContentOffset参数的值来调整内容视图content view停止的位置)- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset;// 当用户停止拖拽时调用(注: 如果内容视图content view在停止拖拽后继续移动,则decelerate参数为YES)- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;// 将要开始减速时调用(仅当停止拖拽后继续移动时才会被调用)- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;// 已经结束减速时调用(仅当停止拖拽后继续移动时才会被调用)- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;// 返回是否允许点击状态栏让scrollView滑动到顶部,如果未实现该方法,则默认为YES(仅当scrollsToTop属性为YES时才调用)- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;// 当scrollView已经滑动到顶部时调用(仅当点击状态栏让scrollView滑动到顶部才调用)- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;// 当-setContentOffset:animated:/-scrollRectVisible:animated:方法动画结束时调用(仅当animated设置为YES时才调用)- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

缩放相关

// 当缩放比例更改时调用- (void)scrollViewDidZoom:(UIScrollView *)scrollView;// 参与缩放的子视图- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;// 将要开始缩放时调用- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view;// 已经结束缩放时调用- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scal
属性 作用 CGPoint contentOffSet 控目前滚动的位置 CGSize contentSize 滚动范围的大小 UIEdgeInsets contentInset 视图在scrollView中的位置 iddelegate 设置协议 BOOL directionalLockEnabled 指定控件是否只能在一个方向上滚动 BOOL bounces 控制控件遇到边框是否反弹 BOOL alwaysBounceVertical 控制垂直方向遇到边框是否反弹 BOOL alwaysBounceHorizontal 控制水平方向遇到边框是否反弹 BOOL pagingEnabled 控制控件是否整页翻动 BOOL scrollEnabled 控制控件是否能滚动 BOOL showsHorizontalScrollIndicator 控制是否显示水平方向的滚动条 BOOLshowsVerticalScrollIndicator 控制是否显示垂直方向的滚动条 UIEdgeInsets scrollIndicatorInsets 指定滚动条在scrollerView中的位置 UIScrollViewIndicatorStyleindicatorStyle 设定滚动条的样式 float decelerationRate 改变scrollerView的减速点位置 BOOL tracking 监控当前目标是否正在被跟踪 BOOL dragging 监控当前目标是否正在被拖拽 BOOL decelerating 监控当前目标是否正在减速 BOOL delaysContentTouches 控制视图是否延时调用开始滚动的方法 BOOL canCancelContentTouches 控制控件是否接触取消touch的事件 float minimumZoomScale 缩小的最小比例 float maximumZoomScale 放大的最大比例 float zoomScale 设置变化比例 BOOL bouncesZoom 控制缩放的时候是否会反弹 BOOL zooming 判断控件的大小是否正在改变 BOOL zoomBouncing 判断是否正在进行缩放反弹 BOOL scrollsToTop 控制控件滚动到顶部

UIScrollView的自动布局


  • 我们先将约束分为以下几类(仅指子控件与UIScrollview之间的约束)

  • 1.间距类:既子控件到父控件上下左右的间距
  • 2.宽高类:既子控件与父控件的宽高比
  • 3.居中类:既子控件在父控件中水平或者垂直居中

注意

在autolayout中,所有的间距类约束,并非相对于父控件本身的,而是相对于父控件的内容视图的(比如UIScrollview的contentSize),由于普通view的内容视图与本身大小一样,所以可以看成相对于它自身scrollView在加载时,会自动根据内部子控件来计算contentSize的值(仅指通过xib\sb加载的控件,或者massrry)。

参考

阿里云社区

简书

原创粉丝点击