Предварительная загрузка UIWebView, избегая белой экранной вспышки

Я работаю над приложением, которое имеет навигацию по таблицам, чтобы в конечном итоге перейти к UIWebView, который отображает различную информацию. Однако переход от slickness UITableView к медленной неуловимости UIWebView для пользователя затруднен, поэтому я хочу улучшить этот опыт, но я могу.

В частности, фон страниц tableViews и UIWebView имеет черный фон, но когда я открываю UIWebView, он мигает пустой белый примерно на секунду (это происходит как для локальных, так и для удаленных HTML файлов.) Как я могу (в идеале) предварительно загрузить этот процесс или (по крайней мере) сделать "флеш" все черным, а не всем белым? Я попытался сделать вид /webView фоном черным, но это, похоже, не помогло.

В моем приложении прямо сейчас, когда пользователь выбирает ячейку, приложение просто загружает подкласс UIWebView и толкает его в стек навигации. Подкласс UIWebView имеет индикатор активности, который запускает и останавливает анимацию на WebViewDidStartLoad и WebViewDidFinishLoad, который отлично работает, но ничего не помогает, чтобы помочь "белой вспышке".

Ответ 1

Я тестировал его... Я отправляю два метода, которые я использовал...

 - (void)viewDidLoad {
        [super viewDidLoad]; //objWebView is the outlet of UIWebView
        [objWebView loadHTMLString:@"<html><body style=\"background-color:black;\"></body></html>" baseURL:nil];

        //the more the delay the errors will be less so within 0.1-0.3 would be fine
        [self performSelector:@selector(loadURL:) withObject:nil afterDelay:0.1]; 
    }

-(void)loadURL:(id)sender{
    [objWebView stopLoading]; //added this line to stop the previous request
    NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [objWebView loadRequest:req];
}

здесь я выполняю запрос через 0,1 сек, другой мудрый он будет выглядеть белым, как в вашем случае. Или вы можете дать свое время задержки в зависимости от времени. Приветствия:)

Ответ 2

Попробуйте использовать

    -(void)viewDidLoad{
       myWebView.hidden = YES;

Тогда в

    -(void)loadURL:(id)sender{  
        myWebView.hidden = NO;

Ответ 3

Я использовал:

[webView setHidden:YES];  
[webView setDelegate:self];

при создании моего webView и выполнении запроса, а затем добавлен этот метод делегата для обработки завершенных запросов:

- (void) webViewDidFinishLoad:(UIWebView*)webView{  
    [webView setHidden:NO];  
}

Ответ 4

Успешно сделал это. Сначала вы должны создать представление в Interface Builder. Затем загрузите html в webview с помощью initWithFrame в init вашего ViewController, который содержит веб-просмотр (здесь происходит волшебство):

CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
webView = [[UIWebView alloc] initWithFrame:webFrame];

Затем просто загрузите webView в представление в viewWillAppear:

[viewWeb addSubview:webView];

Это действительно вопрос проектирования интерфейса, который быстрее краска непосредственно на представление или краска в подвью и затем нарисовать это подвью в представлении?

Ответ 5

Я решил эту проблему несколько лет назад, используя общий метод скрытия UIWebView за UIImageView, а затем удалив UIImageView после задержки.

Но он внезапно вернулся, я думаю, на iOS 7.0.4. Это происходило на совершенно новом iPad Air, а также на старом iPad mini non-retina. После двух дней вытягивания волос я наконец нашел обход.

Скажем, у вас есть веб-просмотр, который ограничен ориентацией ландшафта, инициализируется следующим образом:

WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024.0f, 768.0f)];

И затем вы делаете его видимым после предварительной загрузки, например, например, bringSubviewToFront или setHidden: НЕТ на веб-просмотре (или, альтернативно, с помощью setHidden: YES или removeFromSuperview в UIImageView). Но вместо того, чтобы плавно переключать виды, вспышка и цвет фона мигают примерно полсекунды.

Исправление состоит в том, чтобы немного изменить размер вашего веб-представления:

WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024.01f, 768.0f)];

Проблема и исправление очень воспроизводимы. Он работает с небольшим изменением в четвертом знаке после запятой (1024.0001f). В пятом знаке после запятой (1024.00001f) вспышка возвращается. Значение высоты (768.0f) не имело значения.

Ответ 6

Или вместо того, чтобы обойти проблему, вы можете просто установить цвет фона вашего веб-сайта на любой цвет фона, который вы используете. Если вы не используете изображение, конечно.