我在iPad應用程序中使用大圖片(2000x2000,500kb)作爲大多數視圖控制器的背景圖像。如何提高加載大型UIImage時的用戶體驗?
問題是,應用程序似乎凍結了父視圖控制器,而第一次加載子ViewController與這樣的圖像(後來它由於我假設緩存更快)。
我會加載它在一個單獨的線程,並顯示加載時的一些指標,但我知道所有UI相關的操作應該在主線程上完成。
有沒有一種方法可以改善用戶體驗,所以應用程序似乎不會凍結約。 2秒? (在我的情況下平鋪圖像不是一種選擇)
我在iPad應用程序中使用大圖片(2000x2000,500kb)作爲大多數視圖控制器的背景圖像。如何提高加載大型UIImage時的用戶體驗?
問題是,應用程序似乎凍結了父視圖控制器,而第一次加載子ViewController與這樣的圖像(後來它由於我假設緩存更快)。
我會加載它在一個單獨的線程,並顯示加載時的一些指標,但我知道所有UI相關的操作應該在主線程上完成。
有沒有一種方法可以改善用戶體驗,所以應用程序似乎不會凍結約。 2秒? (在我的情況下平鋪圖像不是一種選擇)
所有的UIKit操作都應該在主線程上完成是錯誤的!只有在繪製的操作應該在主線程上執行。完全保存是將UIImage加載到單獨的線程中,然後將其交給主線程。但是我不認爲裝載需要很長時間。我認爲這可能是需要時間的繪圖。
但是:作爲UIActivityIndicatorView
運行在它自己的線程中(就像所有的CoreAnimation動畫一樣),它會保持動畫效果,即使在添加指示符後阻塞主線程。試試這個:
UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityIndicator startAnimating];
[self addSubview:activityIndicator];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage* image = [UIImage imageNamed:@"MyImage"];
UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
[self addSubview:imageView];
[activityIndicator removeFromSuperview];
});
這將啓動一個UIActivityIndicator
並開始加載在下次運行循環週期的圖像。添加圖像後,它將刪除超級視圖。也許你必須再次發送刪除活動指示符,以便UIKit有時間繪製圖像。在這種情況下,[activityIndicator removeFromSuperview]
可以在另一個dispatch_async
的第一個塊內的主隊列中。
這樣做的工作,感謝您的快速響應!是的,在談論圖像加載時,我的意思是繪製圖像 – Gytis