![](/img/trans.png)
[英]How to detect a UIScrollView has finished scrolling when animation is false?
[英]How to detect when UINavigationController animation has finished?
我希望這是一個簡單的問題。 如果我有一個UINavigationController並且我將一個新的視圖控制器推入到具有動畫過渡的堆棧中,我如何檢測動畫何時完成並且新的視圖控制器在屏幕上?
我有幾個場景,我需要推送一個新的控制器,然后必須進行長時間運行。 我想首先推送新視圖,所以在我開始長時間阻止主線程之前屏幕上有一些東西。 如果我在我的長期運行任務之后立即執行推送,則視圖將不會顯示,直到兩者完成后,主線程才能再次處理事件。
因此,一旦動畫完成並且視圖在屏幕上,我想要做的就是能夠在新控制器中檢測到,然后啟動任務。
+ @ DHamrick建議不要阻止主線程。
要回答原始問題,您可以在兩個位置檢測viewController更改:
您剛剛推送的viewController將接收viewWillAppear:和viewDidAppear: messages。 如果您想知道特定viewController何時出現,請實現這些方法。
navigationController:didShowViewController:animated:
@Mike Z提到的方法被發送到navigationController的委托 。 您需要將對象指定為該委托才能接收此消息。 然后, 每次 viewController出現時您都會知道。
您應該使用GCD隊列,而不是阻塞主線程,而是在另一個線程內部進行長時間運行操作,甚至更好。
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL);
dispatch_async(backgroundQueue, ^{
// Do your long running code
dispatch_async(dispatch_get_main_queue(), ^{
//Update your UI
});
});
您可以將此代碼放在viewDidLoad:
這樣您就知道您的UI已經加載了。 這也意味着您不必依賴動畫的時間。
我自己沒有測試或實現過,但文檔聽起來像:
navigationController:didShowViewController:animated:
描述為:在導航控制器顯示視圖控制器的視圖和導航項屬性后立即發送到接收器。
除此以外,
setAnimationDidStopSelector:
可能適合你。
描述為:設置動畫停止時發送給動畫委托的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.