Сделайте UIWebView как высоту, так как ее содержимое с помощью Auto Layout

У меня есть веб-представление, встроенное в представление прокрутки, и я хочу, чтобы веб-представление было "расширено", чтобы показать весь его контент, который затем я хочу просмотреть с помощью прокрутки.

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

Итак, как мне изменить размер веб-представления, чтобы он занимал все пространство, необходимое для показа содержащегося в нем контента?

И после этого, как сделать, чтобы супервизор (вид прокрутки) изменял размер в соответствии с размером веб-представления?

1

2

Ответы

Ответ 1

Для выполнения этой работы вам необходимо выполнить следующие действия:

  • Подключите UIWebView от ниба к розетке в контроллере просмотра.
  • Отключить прокрутку в веб-представлении
  • Задайте ограничения на UIScrollView, UIView поверх веб-представления (в моем примере я пропустил все метки в этом представлении) и UIWebView.
  • Подключите ограничение UIWebView height к розетке в вашем контроллере просмотра.
  • Установите контроллер вида как UIWebViewDelegate
  • В webViewDidFinishLoad установите константу ограничения высоты в высоту contentSize прокрутки в веб-представлении.
  • Начать отслеживание ключевых значений в contentSize для изменения высоты, когда высота веб-представления должна измениться, поскольку сегменты веб-страницы меняют свой размер без перезагрузки страницы (например, аккордов или меню).

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

введите описание изображения здесь

Итак, вот код:

import UIKit

var MyObservationContext = 0

class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    @IBOutlet weak var webviewHeightConstraint: NSLayoutConstraint!
    var observing = false

    override func viewDidLoad() {
        super.viewDidLoad()
        webview.scrollView.scrollEnabled = false
        webview.delegate = self
        webview.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.de/intl/de/policies/terms/regional.html")!))
    }

    deinit {
        stopObservingHeight()
    }

    func startObservingHeight() {
        let options = NSKeyValueObservingOptions([.New])
        webview.scrollView.addObserver(self, forKeyPath: "contentSize", options: options, context: &MyObservationContext)
        observing = true;
    }

    func stopObservingHeight() {
        webview.scrollView.removeObserver(self, forKeyPath: "contentSize", context: &MyObservationContext)
        observing = false
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        guard let keyPath = keyPath else {
            super.observeValueForKeyPath(nil, ofObject: object, change: change, context: context)
            return
        }
        switch (keyPath, context) {
        case("contentSize", &MyObservationContext):
            webviewHeightConstraint.constant = webview.scrollView.contentSize.height
        default:
            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
        }
    }
}

extension ViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(webView: UIWebView) {
        print(webView.request?.URL)
        webviewHeightConstraint.constant = webview.scrollView.contentSize.height
        if (!observing) {
            startObservingHeight()
        }
    }
}

Ответ 2

Отличное решение из @joern. Прекрасно работает для меня. Я просто адаптировал его код к быстрому 3.

Свифт 3:

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

import UIKit

var MyObservationContext = 0

class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    @IBOutlet weak var webviewHeightConstraint: NSLayoutConstraint!
    var observing = false

    override func viewDidLoad() {
        super.viewDidLoad()
        webview.scrollView.isScrollEnabled = false
        webview.delegate = self
        webview.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.de/intl/de/policies/terms/regional.html")!))
    }

    deinit {
        stopObservingHeight()
    }

    func startObservingHeight() {
        let options = NSKeyValueObservingOptions([.new])
        webview.scrollView.addObserver(self, forKeyPath: "contentSize", options: options, context: &MyObservationContext)
        observing = true;
    }

    func stopObservingHeight() {
    if observing {
        webView.scrollView.removeObserver(self, forKeyPath: "contentSize", context: &MyObservationContext)            
        observing = false
    }
}

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    guard let keyPath = keyPath,
        let context = context else {
        super.observeValue(forKeyPath: nil, of: object, change: change, context: nil)
        return
    }
    switch (keyPath, context) {
    case("contentSize", &MyObservationContext):
        webviewHeightConstraint.constant = webview.scrollView.contentSize.height
    default:
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }

}
}

extension ViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(_ webView: UIWebView) {
        print(webView.request?.url ?? "nil")
        webviewHeightConstraint.constant = webview.scrollView.contentSize.height
        if (!observing) {
            startObservingHeight()
        }
    }
}