小胖说事10------iOS scrollview作用原理(一个大的scrollview包含一个小的scrollview,如何滑动小的scrollview的时候,大的scrollview滑动小的不动

今天做了一个项目,有这样一个需求,就是一个大的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
{
    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:可能不被回调

好了,这样就完美的解决了上述问题。

时间: 2024-12-08 10:46:14

小胖说事10------iOS scrollview作用原理(一个大的scrollview包含一个小的scrollview,如何滑动小的scrollview的时候,大的scrollview滑动小的不动的相关文章

iOS动态的判断一个对象中是否包含一个属性

<span style="font-family:Arial, Helvetica, sans-serif;">有时候我们可能会需要判断一个对象是否有这个属性,那么我们可以用下面这个方法</span> <span style="font-family: Arial, Helvetica, sans-serif;"> </span> <span style="font-family: Arial, Hel

java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积

需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: public void printAreas(Cirlce c, int times) 在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积.例如,times为5,则输出半径1,2,3,4,5,以及对应的圆面积. 在main方法

OneExerciseOne创建一个类,它包含一个int域,一个char域,他们都没有初始化,验证Java执行了默认初始化

在学习<Thinking In java>时,遇到Chapter 2的Exercise 1,问题是这么说的"/**创建一个类,它包含一个int域,一个char域,他们都没有初始化,将他们的值打印出来,验证Java执行了默认初始化".刚拿到这道题目我是这么写的. 1. package Two; public class ExerciseOne {public static void main(String [] args){int a;char c;System.out.pr

小胖说事35-----Terminating app due to uncaught exception &amp;#39;CALayerInvalidGeometry&amp;#39;, reason: &amp;#39;CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

================================================================================== [1 序言] 侧滑删除的轮子网上有很多,最初在github上看过一个,还是ListView时代,那是一个自定义ListView 实现侧滑删除的,当初就觉得这种做法不是最佳,万一我项目里又同时有自定义ListView的需求,会增加复杂度. 写这篇文章之前又通过毒度搜了一下,排名前几的CSDN文章,都是通过自定义ListVIew和Vie

小胖说事35-----Terminating app due to uncaught exception &#39;CALayerInvalidGeometry&#39;, reason: &#39;CALayer posi

2011-06-11 15:19:17.167 ***[930:707] *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]' *** Call stack at first throw: ( 0   CoreFoundation                      0x3365d64f __exce

创业的时候只能专心致志做好一件事。什么叫“一件事”?只能开发一个游戏,只能做一个产品

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:王统伟链接:http://www.zhihu.com/question/19550531/answer/15183706来源:知乎 这是我在商界招商网看到天使投资人曾李青(原腾讯公司五位创始人之一)对早期创业公司的看法 ,觉得对你蛮有帮助的,你可以参考下!曾李青:早期创业公司九种死法第一,跨行业创业 比如原来做游戏的人要做电商,原来做互联网社区的要做游戏.现在的互联网环境下,这种跨行业创业失败概率都会比较高. 在演讲中,他

李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算机.手机等硬件设备)进行交互.由于我们的最终目的是学习iOS开发,学习iOS开发的话必须在Mac系统下,因此我就在Mac系统环境下开发C语言程序,而不是在Windows环境下. 接下来,就在Mac系统环境下编写第一个C语言程序,最后把程序运行起来,跟计算机做一个小小的互动 一.编写第一个C语言程序-

ios之申请后台延时执行和做一个假后台的方法

转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385   居然话sis hu ok.com违禁 嗨~~~   想看原文请把空格去掉 我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)ap