最近在開(kāi)發(fā)一個(gè)簡(jiǎn)單的功能時(shí)黔帕,被iOS11系統(tǒng)坑了一把确憨,在此做個(gè)記錄鄙信,后續(xù)嘗試研究這個(gè)問(wèn)題的解決方案
問(wèn)題已解決瞪醋,需要的小伙伴拿去
簡(jiǎn)單描述下問(wèn)題:
有一個(gè)UIButton,需要同時(shí)監(jiān)聽(tīng)UIControlEventTouchDown
和UIControlEventTouchUpInside
的事件響應(yīng)装诡,以便在長(zhǎng)按時(shí)做相應(yīng)的業(yè)務(wù)處理银受,這個(gè)button的定位是底部是對(duì)齊屏幕的底部践盼。然后詭異的事情就發(fā)生了,button的上半部分能正常的速度響應(yīng)這個(gè)touchdown的事件宾巍,而下半部分需要等待2s左右時(shí)間??????
然而這個(gè)問(wèn)題按照正常的邏輯去排查原因的話(huà)你只會(huì)發(fā)現(xiàn)根本無(wú)法理解咕幻,本著探索的精神,接下來(lái)我經(jīng)歷了一段長(zhǎng)時(shí)間懵逼的研究探索:
- 圖層關(guān)系沒(méi)問(wèn)題顶霞,無(wú)遮擋無(wú)超出superview肄程,而且事件也能響應(yīng),所以跟這個(gè)沒(méi)什么關(guān)系
- 新建了一個(gè)button选浑,做同樣的響應(yīng)處理蓝厌,放在同一水平線(xiàn)上(對(duì)比之前的button看有沒(méi)有隱藏的坑),然并卵
- 復(fù)制一模一樣的button古徒,放到靠上的位置拓提,就正常了。隧膘。摸頭中代态,難道我手機(jī)有問(wèn)題,底部區(qū)域屏幕不太好用了疹吃?拿來(lái)另外一臺(tái)手機(jī)測(cè)試蹦疑,無(wú)果
到這里基本上確定了就是將button定位到底部區(qū)域才出現(xiàn)這樣的問(wèn)題,但一時(shí)間想不出個(gè)所以然萨驶,所以按以往的慣例歉摧,我碰到這種問(wèn)題的做法都是,先睡一覺(jué)篡撵,明天就好了判莉!
恩,今天就從調(diào)整frame入手育谬,把button放在scrollview上券盅,一點(diǎn)一點(diǎn)拖動(dòng)看效果,最終發(fā)現(xiàn)是距離底部大概30pt的地方膛檀,蜜汁反應(yīng)慢锰镀。。突然一下清醒咖刃,拿來(lái)上古時(shí)代的iphone5一測(cè)試泳炉,哈哈,哈哈嚎杨。就是跟iOS系統(tǒng)有關(guān)啊花鹅。。具體的就不說(shuō)啦枫浙,相信大家都知道是iPhoneX的底部手勢(shì)區(qū)域刨肃,還沒(méi)去做iPhoneX適配的我就這樣踩進(jìn)了這么個(gè)巨坑9潘!
12.14繼續(xù)更新
在iPhoneX上Home Indicator
作為系統(tǒng)級(jí)別的手勢(shì)真友,理論上不應(yīng)該對(duì)非iPhoneX的iPhone手機(jī)造成影響黄痪,覺(jué)得這應(yīng)該是被蘋(píng)果所忽略的bug。但作為開(kāi)發(fā)者怎么樣也得把自己先把這個(gè)坑給填了盔然。
解決辦法很簡(jiǎn)單桅打,WWDC 2017
之后對(duì)UIKit在iOS系統(tǒng)下新增了一些API,下面這個(gè)值得注意
這個(gè)方法表明了屏幕邊緣的手勢(shì)動(dòng)作(Screen Edge Gesture),一般來(lái)說(shuō)都是由系統(tǒng)管理的愈案,在控制器下重寫(xiě)這個(gè)方法挺尾,可以讓自己的手勢(shì)優(yōu)先被調(diào)用,在這里的遇到的實(shí)際情況刻帚,我們應(yīng)該使用
UIRectEdgeBottom
這個(gè)枚舉值潦嘶,問(wèn)題完美解決??
2018.1.2更新 大家新年快樂(lè)~
近期有小伙伴反應(yīng)說(shuō),以上方法放在自己項(xiàng)目里無(wú)效崇众,今天花了些時(shí)間研究,基本上可以確定是開(kāi)啟了側(cè)滑返回手勢(shì)導(dǎo)致的航厚,會(huì)發(fā)現(xiàn)屏幕的中間以左的底部區(qū)域還是無(wú)法正常工作顷歌,目前還沒(méi)有完整的解決方案,可以考慮先禁用掉當(dāng)前頁(yè)面的返回手勢(shì)幔睬,也同樣能解決問(wèn)題眯漩,看如何取舍吧,當(dāng)然其他小伙伴有招的也可以支個(gè)招麻顶,畢竟此種方法也是指標(biāo)不治本????
self.navigationController.interactivePopGestureRecognizer.enabled = NO;