UIWebView - не изменяет ли размер содержимого при изменении поворота? - PullRequest
7 голосов
/ 06 марта 2012

Итак, у меня есть UIWebView, который отображает статический html-контент.

Когда я запускаю ViewController в портретной ориентации и переключаюсь в альбомную ориентацию, он корректно изменяет размер содержимого.

Но,когда я запускаю страницу в альбомной ориентации и переключаюсь в портретную ориентацию, она не изменяет размер моего содержимого, и для просмотра всего содержимого требуется прокрутка.

Это ошибка?Есть ли решение для принудительного изменения размера содержимого UIWebView?

Ответы [ 5 ]

10 голосов
/ 06 марта 2012

У вас есть 2 варианта:
Добавьте это в HEAD раздел вашего HTML-файла:

<meta name="viewport" content="width=device-width" />

Или позвоните [myWebView reload] при изменении ориентации

3 голосов
/ 14 мая 2018

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

<meta name="viewport" content="width=device-width" />

Но он все равно не изменил ширину страницы после изменения ориентации между альбомной и альбомной ориентацией на моем устройстве. Затем я добавил эту строку в func viewDidLoad (), и она отлично работала. У меня iOS 11.4

myWebView.autoresizingMask = UIViewAutoresizing.flexibleWidth
3 голосов
/ 18 марта 2012

У меня была похожая проблема.Я решил это, выполнив код JavaScript, чтобы сгенерировать событие, которое обновляет ориентацию страницы, когда UIViewController закончил вращение:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [webView stringByEvaluatingJavaScriptFromString:@"var e = document.createEvent('Events'); "
                                                    @"e.initEvent('orientationchange', true, false);"
                                                    @"document.dispatchEvent(e); "];
}
2 голосов
/ 26 марта 2013

Этот вопрос старый, но его следует решить:

myWebView.scalesPageToFit = YES;

В качестве альтернативы, если вы используете Интерфейсный Разработчик, вы можете установить флажок под Атрибутом Атрибутов, который говорит: «Страница продаж соответствует».

Надеюсь, это поможет.

0 голосов
/ 15 марта 2017

В итоге я воспользовался вторым подходом @Sergey Kuryanov, так как первый мне не помог.Я использовал метод loadHTMLString UIWebView, так что вы увидите это в коде, но вы можете заменить его любым методом, который вы используете для загрузки данных в UIWebView.

Первое, что нужно сделать, это подписаться на ротацию.уведомления.Для этого я последовал ответу @ clearwater82 по этому вопросу в этом вопросе: Как обнаружить вращение для программно сгенерированного UIView
Я переписал его ответ для Swift 3, вы можете найти его на той же странице.

Как только это было сделано, было легко перезагрузить данные в UIWebView, используя loadHTMLString.Мой подход заключался в том, чтобы обернуть UIWebView внутри пользовательского представления, чтобы я мог также обрабатывать некоторое форматирование HTML непосредственно внутри своего пользовательского представления.Это позволило очень просто добавить функцию «перезагрузить при вращении».Вот код, который я использовал, более подробно в связанном ответе:

// Handle rotation
UIDevice.current.beginGeneratingDeviceOrientationNotifications()
NotificationCenter.default.addObserver(
    self,
    selector: #selector(self.orientationChanged(notification:)),
    name: NSNotification.Name.UIDeviceOrientationDidChange,
    object: nil
)

// Called when device orientation changes
func orientationChanged(notification: Notification) {
    // handle rotation here
    self.webView.loadHTMLString(self.htmlText, baseURL: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
    UIDevice.current.endGeneratingDeviceOrientationNotifications()
}

Я просто хочу указать на две вещи:

  • self.htmlText - это переменная, содержащая HTMLтекст, который я хочу загрузить, который я добавил в свой пользовательский вид
  • использование UIDevice.current.endGeneratingDeviceOrientationNotifications() подходило для моей ситуации, оно может не подходить для вашего

Вот и все, ура

...