uiwebview youtube, начиная с уменьшенного пейзажа, изменяет размер при вращении - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть навигационный контроллер с таблицей. Когда вы нажимаете на одну из ячеек, она выдвигает представление с uiwebview на нем. Вы попали на страницу YouTube.

Когда вы находитесь в табличном представлении в портретной ориентации и нажимаете на ячейку, вы видите страницу YouTube в портретной ориентации. При изменении ориентации миниатюра видео не обновляется. Так что уменьшенное изображение меньше. Это отлично. Я на самом деле предпочитаю это меньше. Весь контент, который будет занимать 2 строки, будет занимать 1 строку. Другими словами, все остальное подстраивается под новые размеры.

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

[webVIew refresh];

работает, но, очевидно, снова загружает всю страницу. Таким образом, в зависимости от соединения, будет мерцание или, возможно, сайт станет белым до тех пор, пока не закончится загрузка (при более медленных соединениях).

Я также пытался загрузить сайт в iframe. Я задал похожий вопрос вчера, это было для местных страниц, которые я создавал. Ответ на этот вопрос должен был поставить <meta name='viewport' content='width=device-width; initial-scale=1.0; maximum-scale=1.0;'> в голову. Так что я попробовал это с помощью iframe, собирающего страницу. Сначала это казалось глупым хаком, но я был готов пойти туда. Это даже не загрузит страницу вообще. Я думаю, потому что страница YouTube я загружаю перенаправления на еще одну страницу. После дальнейших исследований казалось, что с iframe были и другие проблемы, такие как прокрутка.

Итак, мой вопрос: как я могу: A. Получить только миниатюру, чтобы изменить размер / перезагрузить при изменении ориентации ИЛИ ЖЕ Б. Получите миниатюру для загрузки в тех измерениях, которые она будет загружать в портретном режиме все время, даже если она была запущена в альбомной ориентации.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Я нашел ответ, может быть, кто-то может объяснить это или предложить лучшее решение. Была также дополнительная ошибка, над которой мне пришлось поработать.

  1. Я убедился, что в uiwebview делегат установлен на владельца файла.
  2. Я изменил родительский вид, когда он выдвинул вид на форму из:

    [self.navigationController pushViewController: контроллер анимирован: ДА];

до (важная часть - 320, я ограничиваю изображение портретом):

[self.navigationController pushViewController:controller animated:YES];
controller.webView.hidden = YES;
controller.webView.frame=CGRectMake(0, 0, 320,367);

3.В веб-просмотре я загружаю URL, как всегда:

NSURL *url = [NSURL URLWithString:sUrl];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];

4.В webviewdidfinishload у меня теперь есть:

if (self.interfaceOrientation ==
               UIInterfaceOrientationLandscapeLeft || 
               self.interfaceOrientation ==
               UIInterfaceOrientationLandscapeRight) {
        self.webView.frame=CGRectMake(0, 0, 480,227);

    }
    self.webView.hidden = NO;
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Все это, как правило, решило бы мою проблему, но потом я обнаружил, что URL-адрес gdata, который я получаю от сервиса youtube, фактически разрешается до 2-го URL. Тогда я думаю, что YouTube изменил формат URL, поэтому он пересылается на 3-й URL. Это означает, что мой код didfinishload вызывался до загрузки окончательного URL. Чтобы решить эту проблему, я добавил:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if ([[[NSString stringWithFormat:@"%@",request.URL] substringWithRange:NSMakeRange(0, 26)] isEqualToString:@"http://m.youtube.com/watch"]) {
        NSString *sUrl=[NSString stringWithFormat:@"%@",request.URL];
        sUrl = [sUrl stringByReplacingOccurrencesOfString:@"http://m.youtube.com/watch?" withString:@"http://m.youtube.com/#/watch?"];

        NSURL *url = [NSURL URLWithString:sUrl];

        NSURLRequest *requestObj  = [NSURLRequest requestWithURL:url];

        [self.webView loadRequest:requestObj];
        return NO;
    }
    //NSLog(@"request:%@",request.URL);
    return YES;
}

Что наверняка может быть лучше, но в основном я говорю об этом, чтобы игнорировать 2-й URL и внести свои изменения, чтобы перейти к 3-му URL.

0 голосов
/ 06 апреля 2011

Вы должны переопределить этот метод в вашем классе UIViewController и выполнить его изменение:

  • (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) длительность;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...