2009-06-01 88 views
8

我有一個應用程序在幾個視圖控制器中使用UIWebViewsUIWebViews用於呈現本地生成的html,不需要慢速網絡訪問。延期viewWillAppear,直到webViewDidFinishLoad

爲了節省內存,我只根據視圖控制器viewWillAppear回調的提示加載這些內存。 (並卸載屏幕外實例以響應didReceiveMemoryWarning消息。)

問題是用戶看到正在呈現的html,有時伴隨着樣式和其他各種令人不快的工件的閃爍。我更願意在屏幕外完成渲染,並在準備就緒時展示完全渲染的視圖。

在UIWebView完全呈現之前,能夠讓viewWillAppear不返回將會非常整齊。但是如何?

我通過發送loadHTMLString:baseURL:消息告訴UIWebView要呈現什麼。這是異步的,一段時間(不久)webview的委託被回叫webViewDidFinishLoad

我嘗試在viewWillAppear內運行runloop,運行NSDefaultRunLoopModeUITrackingRunLoopMode。這部作品在模擬器(它抱怨到日誌

[CATransaction同步]稱爲事務

內,但不工作),但在設備上它死鎖,與webViewDidFinishLoad從來沒有被調用。

(此外,它似乎像UIWebView裝載屬性不起作用。我打電話loadHTMLString:baseURL:和獲取回調之前這不是真的,至少,後)。

+0

「加載」屬性確實有效,但只有當UIWebView在屏幕上時(如果您跟蹤`webViewDidStartLoad`和`webViewDidFinishLoad`),纔會實際觸發加載。技巧傾向於說:「將其添加到屏幕的不透明度爲0.01」,但這對於不在屏幕上的視圖控制器沒有幫助...... – 2013-05-29 19:20:51

回答

3

很多的解決方案在這裏,我想。快速的一個是加載你的UIWebView,它的隱藏屬性設置爲YES。然後設置你的UIViewController爲UIWebViews中的代表和執行:

- (void)webViewDidFinishLoad:(UIWebView *)webView

你設置屬性回NO。

需要注意的一點是,如果您有框架/嵌入內容,webViewDidFinishLoad將觸發多次。所以你必須跟蹤這個。如果您正在加載本地內容,應該不是真正的問題。

+0

此解決方案使用戶在頁面顯示時查看空白顯示畫外屏。 (對於我的應用程序,我有一個背景,即透明頁面將呈現在前面,所以這是一些可以看的東西,但是...) 對其他顯示控件元素的應用程序進行建模會更好(按鈕或列表項)在頁面呈現時按下,然後纔將完全呈現的視圖設置爲動畫效果。 – cluesque 2009-06-03 16:20:48

+0

然後讓按鈕的目標/選擇器驅動渲染,並在完成時提前頁面(webViewDidFinishLoad:按照monowerker的建議) – 2009-06-04 00:56:51

0

我最喜歡monowerker的解決方案,但另一種解決方案是始終堅持已經呈現的UIWebView(在比視圖控制器更持久的對象中)。我只會這樣做,如果monowerker的解決方案的外觀太破壞性。