ScrollView原理

contentInset

contentInset的实质是改变了scrollview的bounds,并将滑动的最小距离改变为设置的contentInset的值。因为我们通过自定义的scrollview,改变以下代码scrollViewOne.bounds = CGRectMake(-64.f, 0.f, self.view.eocW, 200.f);CGFloat minimumOffset = -64.f;就可以实现contentInset的效果,自定义scrollview代码请参考事件传递机制案例

ScrollView原理_第1张图片

automaticallyAdjustsScrollViewInsets

iOS7以后的方法,默认为YES,会将scrollview的内容自动移动到导航栏下面,从而实现毛玻璃的效果,当有多个scrollview的时候,只会对第一个scrollview生效。当只有一个scrollview的时候,如果将automaticallyAdjustsScrollViewInsets设为YES,尽管将scrollview的frame和contentSize设置为一样,scrollview还是能滚动,因内容下移了导航栏的距离,导致内容没有显示完全。

手势叠加,手势的touch是无序的

多个带着手势的view的叠加,你会发现手势的touch事件调用次序是不一定的。



但最后肯定是点击的哪个view就是响应的哪个手势

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

这个是手势是否改变状态,起作用,也就是action
事件是否响应。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

这个是gesture的touch是否接受响应

  • 两个带有手势的view的叠加,本身不会从一个view的手势传递到另外一个view去的,而两个UIscrollView能传递手势,这是内部来实现的,这个我通过自己实现UIScrollView可以看得到手势的传递

叠加手势

  1. 手势的touch事件是传递下去了的

  2. 两个带有手势的view叠加,那么牵扯到手势的
    共存和互斥的

  3. 先手势的touch识别,再才是view的touch识别

  4. 通过自定义一个scrollview(继承UIView,添加手势
    修改bounds来实现),可以发现手势enable为NO,
    那么事件传递的时候基本就忽略它的存在了,不会调用手势的代理和手势的touch方法了。

总结

  1. UIScrollView的事件不传递给它的superView是通过在touch四个方法里不写[super ***]几个方法来实现

  2. 两个带有手势的view的叠加,本身不会从一个view的手势传递到另外一个view去的,而两个UIscrollView能传递手势,这是内部来实现的,这个我通过自己实现UIScrollView可以看得到手势的传递

  3. 子view有自己的手势,那么要它来响应父view的手势,需要在手势代理里面实现或者禁止掉子view的手势

  4. UIScrollView的实现本质就是通过Bounds来改变的,大家可以在ScrollViewDidScroll里打印ScrollView的bounds,可以看得到

  5. contentInset的本质其实就是修改view的bounds来达到的

  6. 多个带着手势的view的叠加,你会发现手势的touch事件调用次序是不一定的。

你可能感兴趣的:(ScrollView原理)