2013-07-07 15 views
29

In den letzten paar Tagen versuche ich ein ziemlich einfaches (zumindest sollte es) Layout mit Auto-Layout-Einschränkungen zu erreichen, aber ohne Erfolg.Dynamische UIView Höhe mit automatischem Layout in iOS 6

Meine Ansichtshierarchie ist:
UIScrollView
- UIView (Container Ansicht)
----- UILabel (Multirow label)
----- ----- UIWebView
UILabel
----- UIButton

View hierarchy in IB

die gewünschte functionallity ist der Behälter V iew sich je nach der Größe des Inhalts zu erweitern. Um die Höhe der UIWebView Ich verwende den folgenden Code zu erhöhen:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.webView sizeToFit]; 
} 

ich viele verschiedene Zwänge versucht, mit den meisten Vernünftigen sein:
1. Pin oben Raum von Superview für das erste Etikett (Ereignis Titel)
2. Pin vertikaler Abstand zum ersten Etikett und die UIWebView
3. Pin vertikaler Abstand für die übrigen Elemente (dh UIWebView - UILabel (Datum der Veranstaltung) und UILabel (Datum der Veranstaltung) - UIButton)
4. Containeransicht hat niedrige Priorität (1) untere vertikale Raumbeschränkung mit seiner Superansicht

Das Ergebnis, das ich bekommen ist folgende: enter image description here

Die UIWebView erweitert aber das Eventdatum Etikett nicht nach unten drücken und die Taste, sowie die Container Ansicht erweitern auch nicht.

Jede Hilfe würde sehr geschätzt werden.

Sie können die Probe Xcode Projekt from here.

Antwort

71

Sie setzen die Höhe contraint Ihrer webView als 266. herunterladen Das ist, warum die Höhe der Web-Ansicht noch fixiert ist.

Sie können diese Höhenbeschränkung als IBOutlet, zum Beispiel erstellen:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint; 

Und dann kann man die Konstante der Höhenbeschränkung ändern, wenn die Web-Ansicht den Inhalt heruntergeladen wird. Die Web-Ansicht selbst besteht aus Scroll-Ansicht nach innen, so dass, wenn Sie die Gesamthöhe des Inhalts erhalten möchten:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height; 
} 

Oder anscheinend diese funktioniert auch:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.webView sizeToFit]; 
    self.webViewHeightConstraint.constant = self.webView.frame.size.height; 
} 
+1

Vielen Dank für Ihre Antwort. Es hat funktioniert wie ein Zauber! – Gerhat

+1

Ich wünschte, ich könnte das millionenfach verbessern ... Ihre Antwort endete gerade 4 Stunden lang mit meinem Kopf auf meiner Tastatur. – shulmey

+0

Ich habe ein viel einfacheres Problem und kann es einfach nicht funktionieren. Es ist nur ein "Label" in einer "Content View" in einer "Scroll View" in der "main" "View" und ich mache wie Sie sagen, dass ich die Beschränkung auf die "label.frame.size.height" setze, ist es aber nicht Arbeiten. Wie ich verstehe, sollte die 'contentSize' automatisch" wachsen ".Kode hier: http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

1

Sie könnten eine Verzögerung benötigen, bevor Aktualisieren der Größe von WebView-Inhalten Und masonry ist nützlich für die Verwendung von automatischen Layouts.

-(void)webViewDidFinishLoad:(UIWebView *)webview{ 
    [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.001]; 
} 

-(void)checkContentOnDelay:(UIWebView *)webview{ 
    CGSize contentSize = webview.scrollView.contentSize; 
    if (contentSize.height > 2) { 
     [webview updateConstraints:^(MASConstraintMaker *make) { 
      make.height.equalTo(contentSize.height); 
     }]; 
    }else{ 
     [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.01]; 
    } 
} 
Verwandte Themen