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
UIScrollView的自动布局
- 我们先将约束分为以下几类(仅指子控件与UIScrollview之间的约束)
- 1.间距类:既子控件到父控件上下左右的间距
- 2.宽高类:既子控件与父控件的宽高比
- 3.居中类:既子控件在父控件中水平或者垂直居中
注意
在autolayout中,所有的间距类约束,并非相对于父控件本身的,而是相对于父控件的内容视图的(比如UIScrollview的contentSize),由于普通view的内容视图与本身大小一样,所以可以看成相对于它自身scrollView在加载时,会自动根据内部子控件来计算contentSize的值(仅指通过xib\sb加载的控件,或者massrry)。
参考
阿里云社区
简书
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- UIScrollView的属性总结
- 好朋友的工具合集
- SSM_mybatis入门学习总结
- [Git] 使用....
- Win10下MySQL_Workbench连接远程主机MySQL5.7
- 2018秋招 搜狐 简化路径
- UIScrollView的总结
- vue 三目运算
- 程序媛:数据库操作(sqlite3)
- Java300StudyNote(2)反射-常用泛型操作(参数泛型、返回值泛型)
- zookeeper总结
- java 基础知识总结
- 题1
- 学习计算机视觉资源
- 如何查看本机的外网IP