UIScrollView的总结_大燕codeblog的博客-程序员ITS304

技术标签: 文档  uiscrollview  ios  

概述

  • 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)。

参考

阿里云社区

简书

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiangriikui/article/details/78014377

智能推荐

MySQL学习之子查询、合并查询结果、别名_MakerGaoGao的博客-程序员ITS304

学习峰哥java教程自学笔记:http://www.java1234.com/javaxuexiluxiantu.html表结构如下:t_book:t_booktype:t_price:1、带in关键字的查询(在后面的查询结果中查询前面的)SELECT * FROM t_book WHE

checkbox实现全选的多种方法_墙角的爬山虎的博客-程序员ITS304_checkbox全选

&lt;script language=javascript&gt; //第一种方法 function selectall1() { var a = document.getElementsByTagName("input"); if(a[0].checked==true){ for (var i=0; i&lt;a.length; i++) if (a[i].type == "checkbox") a[i].checked = false; }

Oracle弃用Nashorn JavaScript引擎_糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖的博客-程序员ITS304

Oracle通过JDK增强提案(JEP)355宣布弃用Nashorn JavaScript引擎,最终将从未来所有的JDK中删除。ECMAScript的语言结构变化太快,Oracle发现,维护Nashorn JavaScript引擎变得非常困难。\\Nashorn最初是在JDK 8中引入的,用于取代Rhino脚本引擎。当其发布时,Nashorn是ECMAScript-262 5.1的完整实现,增强了...

pajek06-09:中心度_qq_34322002的博客-程序员ITS304

1、局部中心度2、整体中心度3、Network&gt;Create Vector&gt;Centrality&gt;Degre&gt;All4、中心度:点的中心度中心势:网络的中心度

7.(开发工具篇kibana)Kibana安装与启动_地图之家家长的博客-程序员ITS304_kibana开发工具

听老人家说:多看美女会长寿前言:Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。1、Kibana官方下载地址https://www.elastic.co/cn/downloads/kibana一定要装与El

性能优化——内存泄漏(3)代码分析篇_GitLqr的博客-程序员ITS304

一、简述在上一篇《性能优化——内存泄漏(2)工具分析篇》中,介绍了如何使用工具帮助我们检查APP中是否存在内存泄漏、及如何定位到内存泄漏,但项目并不能完全依赖工具来检查,毕竟定位内存泄漏比较麻烦,还不如在开发时就考虑到内存泄漏问题,尽可能减少内存泄漏,后续优化才不会那么痛苦。下面就来看看开发中,哪些代码可能造成内存泄漏,及避免内存泄漏的对应解决方案。二、代码分析1、静态变量引起的内存泄露1)错误示例

随便推点

ffmpeg代码分析(1)--编译裁剪_茜茜她老爹的博客-程序员ITS304_ffmpeg 裁剪编译

我们很少使用到ffmpge完整的功能库,大部分时候,只需要特定的编解码 传输协议,那么该怎么裁剪ffmpeg呢?答案就是configure命令。configure 是一个文本文件,打开以后我们会发现它有很多命令,如下Help options:  --help                   print this message  --list-decoders        

Unity项目常见Lua解决方案性能比较_weixin_33946605的博客-程序员ITS304

测试说明Unity不支持热更新这事情一直是谜一样的痛点,特别是在作者第一个项目上线之后,发现每次更新代价实在太大,可惜官方Roadmap上迟迟没有出现这个功能。UWA之前分享过 Android平台热更新解决方案,直接替换dll是一种解决方式(但iOS上因为使用IL2CPP故而无法实现,而且这事本质上为商业原因而非技术问题)。除此之外还有一个比较常见的...

使用Git连接Gitee进行Unity开发项目_funny囧t的博客-程序员ITS304_gitee unity

将项目上传到Gitee进行协同开发如图建立一个仓库下载并安装Git,可看网上的教程在所需上传到Gitee的项目文件目录右键并选择Git Bash输入git init,将该文件目录作为本地git库,此时会生成两个隐藏文件,目录出现master分支输入git.remote add Project https://gitee.com/rookiestudios/Project(这个Project是你在Gitee新建的仓库名称).git,将git关联到仓库并且命名输入git pull Project

算法竞赛入门经典——高效算法——巨人与鬼_qq_27559181的博客-程序员ITS304

巨人与鬼:题目:一组n个巨人正与n个鬼进行战斗,每个巨人的武器是一个质子炮, 它可以把一串质子流射中鬼而把鬼消灭。质子流沿直线行进,在击中鬼时就终止。巨人决定采取下述策略。他们寻找鬼配对,以形成n个巨人─鬼对,。然后每个巨人同时向他选取的鬼射出一串质子流。我们知道,让质子流互相交叉是很危险的。因此巨人选择的配对方式应该使质子流都不会交叉。假定每个巨人和每个鬼的位置都是平面上的一个固定点,并且没有三...

ofbiz项目编译及idea启动_东泽312的博客-程序员ITS304_ofbiz启动

idea2021版启动ofbiz项目1 进入项目根目录2 通过ant清理项目3 通过ant编译项目4 需要确保编译成功5 idea引入ofibz项目记录下来idea是如何导入和启动ofbiz项目的1 进入项目根目录2 通过ant清理项目3 通过ant编译项目4 需要确保编译成功5 idea引入ofibz项目确认下根路径没有问题几个要修改的地方添加vm选项-server -XX:PermSize=512M -XX:MaxPermSize=1024m编译完成后

推荐文章

热门文章

相关标签