zoukankan      html  css  js  c++  java
  • iOS9 TableView和ScrollView滚动不响应问题


    今天开始适配iOS9,发现在有UITableView或是ScrollView的界面滚动不灵敏有些卡顿,研究了下是因为tableview的cell里有可以相应点击事件的Button,当我点击到Button上滑动的时候,tableview不滚动!!!!什么情况这是,后来看看scrollview的官方文档API里有这两个属性

    @property(nonatomic) BOOL delaysContentTouches;       // default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:
    @property(nonatomic) BOOL canCancelContentTouches;    // default is YES. if NO, then once we start tracking, we don't try to drag if the touch moves

    UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理:

    当手指触摸到UIScrollView内容的一瞬间,会产生下面的动作:

    • 拦截触摸事件
    • tracking属性变为YES

    • 一个内置的计时器开始生效,用来监控在极短的事件间隔内是否发生了手指移动

      case1:当检测到时间间隔内手指发生了移动,UIScrollView自己触发滚动,tracking属性变为NO,手指触摸下即使有(可以响应触摸事件的)内部控件也不会再响应触摸事件。

      case2:当检测到时间间隔内手指没有移动,tracking属性保持YES,手指触摸下如果有(可以响应触摸事件的)内部控件,则将触摸事件传递给控件进行处理。

       

    有很多新闻类的App顶部都有一个滑动菜单栏,主要模型可能是由一个UIScrollView包含多个UIButton控件组成;当你操作的时候,手指如果是很迅速的在上面划过,会发现即使手指触摸的地方有UIButton,但是并没有触发该UIButton的任何触摸事件,这就是上面提到的case1;当你手指是缓慢划过或根本就没动,才会触发UIButton的触摸事件,这是case2的情况。

    上面的工作原理其实有一个属性开关来控制:delaysContentTouches。默认值为YES;如果设置为NO,则无论手指移动的多么快,始终都会将触摸事件传递给内部控件;设置为NO可能会影响到UIScrollView的滚动功能。

    再看另一个BOOL类型的属性canCencelContentTouches,从字面上理解是“可以取消内容触摸“,默认值为YES。文档里的解释是这样的:

    A Boolean value that controls whether touches in the content view always lead to tracking.

    If the value of this property is YES and a view in the content has begun tracking a finger touching it, and if the user drags the finger enough to initiate a scroll, the view receives a touchesCancelled:withEvent: message and the scroll view handles the touch as a scroll. If the value of this property is NO, the scroll view does not scroll regardless of finger movement once the content view starts tracking.

    翻译为中文大致如下:

    这个BOOL类型的值控制content view里的触摸是否总能引发跟踪(tracking)

    如果属性值为YES并且跟踪到手指正触摸到一个内容控件,这时如果用户拖动手指的距离足够产生滚动,那么内容控件将收到一个touchesCancelled:withEvent:消息,而scroll view将这次触摸作为滚动来处理。如果值为NO,一旦content view开始跟踪(tracking==YES),则无论手指是否移动,scrollView都不会滚动。

    简单通俗点说,如果为YES,就会等待用户下一步动作,如果用户移动手指到一定距离,就会把这个操作作为滚动来处理并开始滚动,同时发送一个touchesCancelled:withEvent:消息给内容控件,由控件自行处理。如果为NO,就不会等待用户下一步动作,并始终不会触发scrollView的滚动了。

    那我直接在代码里都设置为YES不就OK了,但是设置后还是不行,后来在发现UIScrollView中有个UIPanGestureRecognizer也有类似的属性

    delaysTouchesBegan,然后也设置成YES

    _mTableView.panGestureRecognizer.delaysTouchesBegan = _mTableView.delaysContentTouches;

    终于解决这个问题了,这个应该是iOS9的Bug吧,希望Apple后面的版本能修复这个问题

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879050.html
Copyright © 2011-2022 走看看