iOS — WKWebView некорректно добавлен в свой подраздел в iPhone 6

#ios #swift #xcode #uiview #wkwebview

#iOS #swift #xcode #uiview #wkwebview

Вопрос:

Я пытаюсь программно добавить a WKWebView к моему webViewContainer (type = UIVIew ) как a subView . Приведенный ниже код отлично работает, когда я тестирую его на iPhone 11 iOS 13.3, но не на iPhone 6 iOS 11.0.1. Проблема в том, что webViewContainer имеет leading (значение = 10) и trailing (значение = 10) пробелы с self.view . Когда я запускаю его на iPhone 6, leading соблюдается только значение, а не значение trailing also. Когда я отлаживаю, webViewContainer и мой добавленный webView получает тот же кадр, что и он webViewContainer .

В чем может быть проблема?

        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.frame.size = self.webViewContainer.frame.size
        webView.uiDelegate = self
        webView.navigationDelegate = self
        self.webViewContainer.addSubview(webView)
  

Комментарии:

1. не могли бы вы поделиться своими кодами ограничений, если не возражаете?

2. @sekoyaz Я создаю ограничения из файла xib

3. перед добавлением в качестве подраздела put и WebView.translatesAutoresizingMaskIntoConstraints = false, можете ли вы проверить?

4. @sekoyaz хорошо, я проверю это сейчас

5. @sekoyaz нет проблем. Спасибо 🙂

Ответ №1:

Свойство рамки любого вида представления состоит из четырех свойств: x, y, width и height. В вашем коде единственное, что вы делаете, это устанавливаете свойства width и height с помощью следующего кода;

 webView.frame.size = self.webViewContainer.frame.size
  

Я полагаю, что ваш webViewContainer имеет значения x: 0 и y: 0, и поскольку вы инициализировали свой WebView с помощью .zero frame, значения одинаковы. Однако это может быть не всегда.Это вызовет проблемы при запросе изменения фрейма webViewContainer.

Если я не ошибаюсь, вы бы хотели, чтобы ваш WebView находился точно в том же месте, что и ваш webViewContainer. Для достижения этого необходимо объяснить разницу между свойствами фрейма и границ.

Рамка — это относительное положение представления по отношению к его родительскому представлению. Однако свойство bounds относится к его координатам относительно его собственного пространства.

С учетом этих различий, для достижения того, что вы хотите сделать, относительно безопаснее просто заменить эту строку;

 webView.frame.size = self.webViewContainer.frame.size
  

со следующим;

 webView.frame = webViewContainer.bounds
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  

свойство маски автоматического изменения размера изменит фрейм вашего веб-просмотра при изменении границ супервизора (в данном случае webViewContainer).