2009-06-01 6 views
8

여러 뷰 컨트롤러에서 UIWebViews을 사용하는 응용 프로그램이 있습니다. UIWebViews은 로컬에서 생성 된 html을 렌더링하는 데 사용되며 느린 네트워크 액세스는 필요하지 않습니다.webViewDidFinishLoad까지 viewWillAppear 연기하기

메모리를 절약하기 위해 viewcontroller viewWillAppear 콜백 메시지가 표시되면 요청시에만로드합니다. didReceiveMemoryWarning 메시지에 대한 응답으로 오프 스크린 인스턴스를 언로드합니다.

문제는 사용자가 렌더링되는 html을 보게되고 때로는 스타일이 깜박이고 불쾌한 여러 가지 유물이 함께 표시된다는 것입니다. 나는 오히려 렌더링이 화면 밖에서 이루어지기를 바라며, 준비가 완료되면 완전히 렌더링 된 뷰를 표시합니다.

UIWebView가 완전히 렌더링 될 때까지 viewWillAppear이 돌아 가지 않도록하려면 매우 정돈되어야합니다. 그러나 어떻게?

나는 UIWebView에게 무엇을 렌더링 할지를 loadHTMLString:baseURL: 메시지로 보냅니다. 이것은 비동기식이며, 얼마 후 (곧) webview의 델리게이트는 webViewDidFinishLoad으로 다시 호출됩니다.

NSDefaultRunLoopMode 또는 UITrackingRunLoopMode을 실행하는 내부의 런 루프를 실행하여 실험했습니다. 이 (가 거래

내에서 호출 로그

[CATransaction의 동기화]에 불평하지만, 작업을 수행)하지만 장치가 webViewDidFinishLoad가 호출되고 있지 않습니다와 함께, 교착 시뮬레이터에서 작동합니다.

합니다 (UIWebView 로딩 속성이 나는 loadHTMLString:baseURL:를 호출하고 콜백을 얻기 전에 그것은 사실이 아니에요 적어도, 후. 작동하지 않는 것처럼 또한, 그것은 보인다.) 솔루션의

+0

"loading"속성이 작동하지만 UIWebView가 화면에 나타나면로드가 실제로 트리거됩니다 (webViewDidStartLoad 및 WebViewDidFinishLoad 추적). 팁은 "0.01의 불투명도로 화면에 추가"라고 말하지만 아직 화면 상에 있지 않은 viewcontroller에는 도움이되지 않습니다 .... –

답변

3

많이 나는 여기 생각합니다. 빠른 하나는 숨겨진 속성을 YES로 설정하여 UIWebView를로드하는 것입니다. 그런 다음 UIWebViews의 대리자로의 UIViewController를 설정하고 구현 : 당신이 NO로 다시 속성을 설정

- (void)webViewDidFinishLoad:(UIWebView *)webView

합니다.

프레임 된/포함 된 콘텐츠가있는 경우 webViewDidFinishLoad가 두 번 이상 실행됩니다. 그래서 이것을 추적해야합니다. 로컬 컨텐트를로드하는 경우에는 실제로 문제가되지 않아야합니다.

+0

이 솔루션은 사용자가 빈 화면을보고있는 동안 페이지가 화면 밖으로 그려. (내 응용 프로그램의 경우 투명한 페이지가 앞에 그려지기 때문에 배경을 보게됩니다.) ... 컨트롤 요소를 표시하는 다른 응용 프로그램을 모델링하는 것이 좋습니다 (단추 또는 목록 항목)를 누른 다음 페이지가 렌더링 될 때만 누른 다음 완전히 렌더링 된 뷰가 애니메이션으로 나타납니다. – cluesque

+0

그런 다음 버튼의 대상/선택기를 사용하여 렌더링을 구동하고 완료되면 페이지를 넘깁니다 (webViewDidFinishLoad : monowerker가 제안한대로) –

+0

webViewDidFinishLoad : UIWebView가 화면 위로 이동 될 때까지 호출되지 않습니다. –

0

나는 monowerker의 솔루션이 가장 좋지만 다른 솔루션은 이미 렌더링 된 UIWebView를 항상 보류하는 것입니다 (보기 컨트롤러보다 더 영구적 인 개체에서). monowerker의 해결책이 너무 파괴적이라면 나는 그것을 할 것입니다.

+0

UIWebView는 많은 양의 메모리를 사용하며 메모리 부족 경고가 표시되면 가장 먼저 발생합니다. 나의 사용 사례 중 하나는 목록보기에서 선택한 개체의 세부 정보를 렌더링하는 것입니다 (예 : 메일 목록에 메시지 목록이 표시되고 하나를 가볍게 치고 전체를 읽음). 그래서 어떤 개체인지 알 때까지 렌더링 할 수 없습니다. 볼 수 있습니다. – cluesque

관련 문제