2016-10-02 134 views
4

我在遇到一個問題,即當您觸摸屏幕左邊緣時,第一次調用touchesBegan:withEvent:UIViewUIViewController會延遲。這似乎是iOS 10的一個新問題,並且只發生在使用3D Touch(iPhone 6s和更新版本)的設備上。事實上,如果您在「常規」 - >「輔助功能」中禁用3D Touch,問題就會消失。`touchesBegan:withEvent:`在屏幕左邊緣延遲了

但是,當您使用UIGestureRecognizers時,問題似乎不會發生。我目前的解決方法是創建一個覆蓋touches*方法的UIGestureRecognizer子類,並將它們轉發給我的舊實現。

這只是一個錯誤,或者有沒有辦法擺脫延遲?

回答

5

嘗試將此添加到viewdidappear方法。這可能會解決這個問題。它也發生在我身上,但是我從堆棧溢出中得到了這個代碼,解決了我的問題。希望它可以幫助你

let window = view.window! 
let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer 
let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer 
gr0.delaysTouchesBegan = false 
gr1.delaysTouchesBegan = false 
+0

嗯我看到,將如何解決眼前的問題,但與系統手勢識別搞亂好像它會導致更多的問題上下行 – Jayson

+0

我沒有更多的一些調查,這似乎是目前最佳的解決方案。 這些手勢識別器是'_UISystemGestureGateGestureRecognizer'的實例,似乎主要用於確保您的應用與系統手勢(如控制中心或3D觸摸應用切換)更好地交互。對於左邊緣,我認爲延遲是爲了防止用戶在嘗試切換應用程序時意外的應用程序交互而產生的,但在我的情況下,我需要在左側邊緣進行響應式觸摸,並且在用戶嘗試切換應用程序時觸摸觸發。 – Jayson

1

Purteeek解決方案似乎也適用於我的情況。這是SpriteKit一個Objective-C語言實現:

- (void)didMoveToView:(SKView *)view { 

    UIGestureRecognizer* gr0 = view.window.gestureRecognizers[0]; 
    UIGestureRecognizer* gr1 = view.window.gestureRecognizers[1]; 

    gr0.delaysTouchesBegan = false; 
    gr1.delaysTouchesBegan = false; 

} 

這不亂用其他手勢識別,以及系統3D觸控仍然正常工作。我想知道爲什麼這不是默認行爲。

+0

此修補程序不再有效... – alasker

0

像danialias我正在一個遊戲。我發現的解決方案(目前正在開發中,已經在支持3D Touch的iPhone上進行測試,在這一點上這是一個真正的問題..)適用於這兩種遊戲/應用程序:

看起來UITapGestureRecognizer不會遭受這個延遲,所以簡單地添加一個到你的視圖,並用它來處理水龍頭。

在我的遊戲,我倒是存儲和處理他們在每個時間間隔更新,所以我推翻

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

在那裏我存儲在UITouch實例,並沒有返回。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    [self.touches addObject:touch]; 
    return NO; 
}