最近遇到一個iOS11上的bug,Present UIAlertController后不能點擊,整個界面無響應,而iOS10及以下版本工作正常。又測試通過presentModalViewController彈出普通VC,存在相同問題。
經(jīng)過調試發(fā)現(xiàn)點擊事件并沒有傳到被彈出的視圖上面。只能子類化UIWindow,重寫- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法,看一下點擊事件被誰接收了。發(fā)現(xiàn)是present動畫執(zhí)行時出現(xiàn)的maskView接收了事件,正常情況下,maskView在動畫執(zhí)行完畢會被移除。而該bug下,maskView一直存在,動畫好像停止了。
突然想到彈出Alert前,該模塊會通過以下代碼,暫停內部視圖的動畫。但是不應該影響到新彈出來的view,二者除了在同一個UIWindow的視圖樹內,無任何關聯(lián)。
- (void)pauseView:(UIView *)view {
CFTimeInterval pausedTime = [view.layer convertTime:CACurrentMediaTime() fromLayer:nil];
view.layer.speed = .0f;
view.layer.timeOffset = pausedTime;
}
排查線上版本在iOS11上工作正常,無任何問題。而本次迭代,除了在被暫停動畫的視圖底部加了一個UIImageView做背景,無任何改動。經(jīng)過測試:
- 移除背景imageView,工作正常;
- 空imageView,imageView.image = nil,出現(xiàn)bug;
- 隱藏空imageView或者設置alpha = 0,相同bug;
- imageView的圖片不為空,工作正常;
看來在iOS11上不要添加空的imageView,特別是有動畫暫停的場景。
該bug非常奇怪,估計是iOS11系統(tǒng)的bug或者專門做了某種限制。