2012-10-18 26 views
0

我在iPad應用程序中使用大圖片(2000x2000,500kb)作爲大多數視圖控制器的背景圖像。如何提高加載大型UIImage時的用戶體驗?

問題是,應用程序似乎凍結了父視圖控制器,而第一次加載子ViewController與這樣的圖像(後來它由於我假設緩存更快)。

我會加載它在一個單獨的線程,並顯示加載時的一些指標,但我知道所有UI相關的操作應該在主線程上完成。

有沒有一種方法可以改善用戶體驗,所以應用程序似乎不會凍結約。 2秒? (在我的情況下平鋪圖像不是一種選擇)

回答

5

所有的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的第一個塊內的主隊列中。

+0

這樣做的工作,感謝您的快速響應!是的,在談論圖像加載時,我的意思是繪製圖像 – Gytis

相關問題