2015-10-21 8 views
15

Ho una vista web incorporata in una vista di scorrimento e voglio che la vista web sia "espansa" per mostrare tutto il suo contenuto, che poi voglio scorrere con la mia vista di scorrimento.Crea un UIWebView all'altezza del suo contenuto con Auto Layout

Il motivo per cui utilizzo una vista di scorrimento come una super vista e non solo l'uso della vista Web come una vista di scorrimento è perché ho etichette sopra la visualizzazione Web che voglio includere nel processo di scorrimento (vedi screenshot).

Quindi, come faccio a ridimensionare la visualizzazione Web in modo da occupare tutto lo spazio necessario per mostrare il contenuto che contiene?

E in seguito, come faccio a ridimensionare la panoramica (la vista di scorrimento) in base alla dimensione della visualizzazione Web?

1

2

risposta

26

Per fare questo lavoro è necessario effettuare le seguenti operazioni:

  1. collegare il UIWebView dal pennino a una presa di corrente nella vostra controller di vista
  2. Disabilita scorrimento nella vista Web
  3. Impostare i vincoli su UIScrollView, UIView nella parte superiore della visualizzazione Web (nel mio esempio ho omesso tutte le etichette in quella vista) e lo UIWebView.
  4. Collegare il vincolo height di UIWebView a una presa nel controller di visualizzazione.
  5. Impostare il controller della vista come UIWebViewDelegate
  6. Nel webViewDidFinishLoad impostare il vincolo di altezza costante l'altezza del contentSize della vista di scorrimento all'interno della vista web.
  7. Avvia valore-chiave Osservando sul contenutoDimensioni per modificare l'altezza, quando l'altezza della vista Web deve cambiare perché i segmenti della pagina Web cambiano le loro dimensioni senza ricaricare la pagina (come accordi, o menu).

Non spiegherò i vincoli in dettaglio come sembri aver già capito da soli. Ecco uno screenshot dei vincoli:

enter image description here

Quindi, ecco il codice:

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() 
     } 
    } 
} 
+0

Ehi! Ho visto la tua risposta quando l'hai pubblicata inizialmente, ma ho deciso di risolvere il problema quando lavoravo alla seconda versione della mia app. Grazie mille, ho solo provato a sistemare tutto e ha funzionato molto bene.Ho dovuto solo correggere alcuni valori di vincoli per compensare verticalmente la scrollView (dato che ho anche una barra di navigazione in alto, non è esattamente una superview vuota). Questa è la prima volta che uso il codice con gli osservatori, quindi dovrò esaminarlo più da vicino, ma per ora funziona! Grazie –

+0

Grazie per il tuo feedback, sono contento che ti abbia aiutato. – joern

+0

Grazie mille per questo – bitsoverflow

2

grande soluzione da @joern. Funziona bene per me. Ho appena adattato il suo codice a swift 3.

Swift Code 3 Aggiornamento:

ho anche modificare stopObservingHeight per prevenire rimuovere osservatore prima che fosse creare.

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() 
     } 
    } 
}