小胖说事10------iOS scrollview作用原理(一个大的scrollview包含一个小的scrollview,如何滑动小的scrollview的时候,大的scrollview滑动小的不动
2015-05-14 17:19
573 查看
今天做了一个项目,有这样一个需求,就是一个大的scrollview包含一个小的scrollview,如何滑动小的scrollview的时候,大的scrollview滑动,小的srollview不滑动。
我们知道当多个视图进行叠加的时候,touch事件是作用到最上面的视图上,但是如果父视图是UIScrollView,如果默认,可能touch子视图会造成UIScrollView的滚动。
UIScrollView滚动的原因,可以看UIScrollView
原理。
我在这里简单的描述一下,UIScrollView的工作原理,当手指touch的时候,UIScrollView会拦截Event,会等待一段时间,在这段时间内,如果没有手指没有移动,当时间结束时,UIScrollView会发送tracking events到子视图上。在时间结束前,手指发生了移动,那么UIScrollView就会进行移动,从而取笑发送tracking。
那么,UIScrollView的子类想要接受touch事件,就是用户点击UIScrollView上的视图时,要先处理视图上的touch,而不发生滚动。这时候就需要UIScrollView的子类重载touchesShouldBegin:withEvent:inContentView: ,从而决定自己是否接受子视图中的touch事件。
重写了- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view方法和- (BOOL)touchesShouldCancelInContentView:(UIView *)view方法。
其中(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view,是用户点击小的scrollview区域内,先触发这个方法,当返回YES时,touch事件作用到小的scrollview视图上(不滑动),当返回no时,大的scrollview可以上下滚动,小的scrollview不滑动。
-(BOOL)touchesShouldCancelInContentView:(UIView *)view是发送tracking前,先作用这个方法。
最后scrollview初始化的时候还要设置一下几个属性:
我们知道当多个视图进行叠加的时候,touch事件是作用到最上面的视图上,但是如果父视图是UIScrollView,如果默认,可能touch子视图会造成UIScrollView的滚动。
UIScrollView滚动的原因,可以看UIScrollView
原理。
我在这里简单的描述一下,UIScrollView的工作原理,当手指touch的时候,UIScrollView会拦截Event,会等待一段时间,在这段时间内,如果没有手指没有移动,当时间结束时,UIScrollView会发送tracking events到子视图上。在时间结束前,手指发生了移动,那么UIScrollView就会进行移动,从而取笑发送tracking。
那么,UIScrollView的子类想要接受touch事件,就是用户点击UIScrollView上的视图时,要先处理视图上的touch,而不发生滚动。这时候就需要UIScrollView的子类重载touchesShouldBegin:withEvent:inContentView: ,从而决定自己是否接受子视图中的touch事件。
- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { NSLog(@"用户点击了scroll上的视图%@,是否开始滚动scroll",view); //返回yes 是不滚动 scroll 返回no 是滚动scroll return YES; } - (BOOL)touchesShouldCancelInContentView:(UIView *)view { NSLog(@"用户点击的视图 %@",view); //NO scroll不可以滚动 YES scroll可以滚动 return NO; }
重写了- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view方法和- (BOOL)touchesShouldCancelInContentView:(UIView *)view方法。
其中(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view,是用户点击小的scrollview区域内,先触发这个方法,当返回YES时,touch事件作用到小的scrollview视图上(不滑动),当返回no时,大的scrollview可以上下滚动,小的scrollview不滑动。
-(BOOL)touchesShouldCancelInContentView:(UIView *)view是发送tracking前,先作用这个方法。
最后scrollview初始化的时候还要设置一下几个属性:
//NO 发送滚动的通知 但是就算手指移动 scroll也不会动了 YES 发送通知 scroll可以移动 [myScrollview setCanCancelContentTouches:YES]; [myScrollview setBounces:NO]; // NO 立即通知touchesShouldBegin:withEvent:inContentView 看是否滚动 scroll [myScrollview setDelaysContentTouches:NO]; // 这句是关键,默认为YES,不设为NO则touchesShouldBegin:withEvent:inContentView:可能不被回调好了,这样就完美的解决了上述问题。
相关文章推荐
- RunLoop学习笔记,从CF层面了解由于CFRunLoopMode机制iOS程序ScrollView的滑动为何如此平滑的原因。还有介绍AFNetworking如何单独发起一个global threa
- iOS点击状态栏回到顶部(一个控制器中包含多个scrollview,系统自带的回到顶部失效)
- iOS开发之如何做一个可上下左右滑动的页面
- 小胖说事21------如何利用开发者账号重签ipa文件,并部署到IOS设备做测试(ipa重新签名)
- 如何让一个scrollview中包含的listview拥有上拉刷新功能而不冲突
- 一个iOS项目中包含多个xcodeproj文件,如何运行其中的一个项目
- iOS 10中如何搭建一个语音转文字框架
- 内部类的作用?1、抽象类中包含一个内部接口如何实现与调用 ;2、接口中包含一个内部抽象类如何调用
- iOS 10中如何搭建一个语音转文字框架
- 一个 ScrollView 里面包含 viewpager 嵌套 listview 或 RecyclerView 极少代码实现的流畅滑动效果 处理一个两层滑动 view 的自定义布局,以最少的代码实现,
- iOS 10中如何搭建一个语音转文字框架
- ios右滑返回时候与scrollview滑动冲突的问题
- IOS如何在StoryBoard中添加竖向滑动的ScrollView
- iOS 10中如何搭建一个语音转文字框架
- iOS开发经验--ios右滑返回时候与scrollview滑动冲突的问题
- IOS上如何判断一个NSString 包含的字符数
- iOS 10中如何搭建一个语音转文字框架
- iOS开发经验--ios右滑返回时候与scrollview滑动冲突的问题
- 整理--iOS如何把一个包含自定义对象的数组序列化到磁盘
- 【如何快速的开发一个完整的iOS直播app】(编解码原理)