最近做项目遇见一个问题:UIScrollView上有许多UIButton,要实现既能点击UIButton,又能滑动UIScrollView,这个实现没有问题,不需要做额外的touch管理,UIScrollView能识别是点击的UIButton还是滑动本身,但是有一个效果上的问题,就是点击UIButton时间短的话,不会高亮,但是确实是触发点击了,这样就造成了假象,给人一种UIButton没有被点击的感觉。如果点击时间长的话没有问题,会高亮。

这么看来,导致这样现象应该就是时间长短的问题,顺着这个问题想下去,就追寻到UIScrollView的touch原理,当UIScrollView接收到一个touch时,它会在一段时间(好像是150ms)内监听该touch是否移动了,假如移动了(应该有一个移动范围),则取消将touch发送到其子视图(例如UIButton),UIScrollView自身接受该touch,进行滑动。看来应该就是这段判断时间惹的祸了(这里其实我还想不明白为什么明明点击了Button,也确实触发了点击,却没有高亮状态,哪位大神知道的话请指教),那要解决问题是不是就应该把这段时间取消掉呢,不要这个判断时间,那么UIButton应该就会立即响应并产生高亮状态吧。正好UIScrollView中有一个属性叫delaysContentTouches,官方文档对它的解释是:

If the value of this property is YES, the scroll view delays handling the touch-down gesture until it can determine if scrolling is the intent. If the value is NO , the scroll view immediately calls touchesShouldBegin:withEvent:inContentView:. The default value is YES.

意思就是设置为NO就不会存在那个150ms的判断时间了,直接执行后续操作。那么咱们设置为NO来试试呗。结果确实如所想那样,UIButton立即响应并高亮。

但是…..别高兴太早,虽然这个问题解决了,但是新的麻烦又产生了,螳螂捕蝉黄雀在后!你会发现UIScrollView滑动不像以前那样了,假如touch down的那点落在UIButton上然后再滑动手指,UIScrollView不会滑动,但是UIButton仍然触发,当然,这样的结果也是应该的,你想想,设置delaysContentTouches为NO后,只要手指点在UIButton上,UIScrollView就会立即判定为这是点击UIButton,而不会再等待看手指是否移动来决定是否要滑动本身了。

那么如何解决这个问题呢?你会想,有没有什么方法可以在touch到UIbutton上并滑动时不触发UIButton而让UIScrollView自己滑动呢,强大的iOS没有让你失望,UIScrollView中有一个方法:touchesShouldCancelInContentView:,来看它的解释:

The scroll view calls this method just after it starts sending tracking messages to the content view. If it receives NO from this method, it stops dragging and forwards the touch events to the content subview. The scroll view does not call this method if the value of the canCancelContentTouches property is NO.

意思就是当UIScrollView将touch事件交给子view后,当手指发生滑动时,调用此方法,假如返回NO,则将touch事件交给子view,如果返回YES,则交给UIScrollView处理,产生滑动。(但是前提是UIScrollView的canCancelContentTouches属性是YES才会调用这个方法,只要不是UIControll的子类,这个属性默认是YES。)所以只要重写UIScrollView的这个方法并返回YES就可以啦。

到此问题就解决了。既能立即响应UIButton,也能自由滑动UIScrollView。

本人初学ios一个多月,很多东西还都没有明白,如果有什么地方说的不对,请指教,另外本人语言表达能力太差,文章写的逻辑不清楚,请见谅…..

UIButton on the UIScrollView highlighted delayed相关推荐

  1. iOS中在UIViewController中的UIButton被点击后展示Highlighted状态有延迟的解决办法

    问题 如果在UIPageview中的子View中有UIButton,这时候会遇到一个问题:UIButton被触摸时切换到Hightlighted状态会有延迟. 解决办法 其实在UIScrollView ...

  2. UIButton高光状态(highlighted)时阴影效果

    解决办法: 将button的type改为Custom (Custom点击时没有阴影,选择System时有阴影效果)

  3. UIbutton在UIScrollview中highlighted延迟

    IOS开发之 ---- UIButton on the UIScrollView highlighted delay 转载▼ 最近做项目遇见一个问题:UIScrollView上有许多UIButton, ...

  4. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  5. UIButton添加到IOS7的UITableviewCell上时Highlighted效果不起作用

    UIButton添加到IOS7的UITableviewCell上时Highlighted效果不起作用.在ios6下就highlighted有效果: 我的代码如下:     [_isLoginBtn s ...

  6. iOS如何保持UIButton的Highlighted状态

    方法1: - (void)highlightButton:(UIButton *)b { [b setHighlighted:YES]; }- (IBAction)onTouchup:(UIButto ...

  7. ios uitableviewcell 添加uibutton无法Highlighted问题

    [tableView setDelaysContentTouches:NO]; for (UIView *currentView in tableView.subviews) { if ([curre ...

  8. 关于UIButton的highlighted状态的总结

    前两天写项目的时候纠结于button的highlighted属性不能保证它的高亮状态,最后用反复更新Default的背景图片的方法解决的 今天找到原因了, 在api中关于highlighted有这样的 ...

  9. iOS UIButton Highlighted是指点击还没有松开的状态

最新文章

  1. 爬虫架构师得逆袭之路
  2. MySQL5日期类型DATETIME和TIMESTAMP相关问题详解
  3. 通过WM_COPYDATA消息完成进程间通信
  4. Weave Scope安装
  5. Python+Appium实现APP自动化测试
  6. 用一把吃鸡的时间,免费上云搭建网站应用
  7. Linux 打包 压缩 解压缩 命令
  8. vue:无法将“vue”识别为脚本_Vue3将带来巨大的性能提升
  9. MapReduce编程模型简介和总结
  10. java计算机毕业设计蔚蓝在线学习平台源码+系统+数据库+lw文档+mybatis+运行部署
  11. 【MCMC】基于贝叶斯优化的自适应MCMC算法仿真
  12. Excel如何合并相同项单元格
  13. uni-app的基本使用
  14. jbb是什么梗_太阳星座是什么意思
  15. 2022年5个人工智能趋势
  16. 网页安全证书错误但无法安装证书的解决办法
  17. 【Matplotlib】plt.imshow() cmap色彩表
  18. 百度地图SDK配置与使用
  19. 把Windows给印度人做,微软大佬都去搞小工具了
  20. Phonics 自然拼读法 sm sn sl sw sp st sc sk all ew y 小结与回顾

热门文章

  1. 搭载展锐春藤8521E芯片的米兔儿童手表 小米全渠道销售额破600万
  2. 4种DNS安全协议对比:DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS
  3. 三国志战略版:Daniel_蔡文姬_武锋阵_1.13日更新分析
  4. easyui 中datagrid的列合并mergeCells,改变表头颜色
  5. 微信小程序入门项目-做一个马马虎虎的计算器
  6. javaSE之类和对象(1)
  7. 计算机二级vf vc,计算机二级VF:实战VC时间控制函数
  8. Apollo Routing模块源代码分析
  9. 一种责任——读余华的小说《活着》的优秀读后感3100字
  10. C# Winform MessageBox的用法 各种类型弹出框