2013-07-07 15 views
29

Przez ostatnie kilka dni staram się osiągnąć dość prosty (przynajmniej powinien być) układ przy użyciu ograniczeń układu automatycznego, ale bez powodzenia.Dynamiczna wysokość UIView z automatycznym układem w iOS 6

Mój pogląd jest hierarchia:
UIScrollView
- UIView (zobacz Container)
----- UILabel (Multirow label)
----- UIWebView
----- UILabel
----- UIButton

View hierarchy in IB

żądany funkcjonalność jest pojemnikiem V iew będzie rozszerzany zgodnie z rozmiarem zawartości. W celu zwiększenia wysokości UIWebView używam następujący kod:

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

próbowałem wielu różnych ograniczeń, przy czym większość z nich są uzasadnione:
1. Pin top przestrzeń z SuperView za 1 etykietą (Event tytuł)
2. Pin pionowy odstęp w 1. etykiecie i UIWebView
3. Pin pionowy odstęp dla elementów resztę (tj UIWebView - UILabel (Date Event) i UILabel (Date Event) - UIButton)
4. Widok kontenera ma niski priorytet (1) ograniczenie pionowej przestrzeni pionowej z jego widokiem

Wynik mam jest następujący: enter image description here

UIWebView rozszerza ale nie dociśnij etykietę datę zdarzenia i przycisk plus widok Pojemnik nie rozszerza albo.

Każda pomoc zostanie bardzo doceniona.

Możesz pobrać przykładowy projekt Xcode from here.

Odpowiedz

71

ustawiasz contraint wysokość swojego Webview jako 266. Dlatego wysokość widoku strony internetowej jest jeszcze ustalona.

Możesz utworzyć tę wysokość ograniczenie jako IBOutlet, na przykład:

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

A potem można zmodyfikować stałą ograniczeniem wysokości po stronie Zobacz zakończeniu pobierania zawartości. Sam widok internetowa składa się z widoku przewijania wewnątrz, więc jeśli chcesz uzyskać całkowitą wysokość treści:

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

Or Widocznie ten jeden działa również:

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

Bardzo dziękuję za odpowiedź. To działało jak czar! – Gerhat

+1

Żałuję, że nie mogłem tego milion razy powtórzyć ... Twoja odpowiedź skończyła się 4 godziny od uderzenia głową w klawiaturę. – shulmey

+0

Mam znacznie prostszy problem i po prostu nie mogę go uruchomić. To po prostu "etykieta" w "widoku treści" w "widoku przewijania" w "głównym" widoku "i robię to, co mówisz, ustawiam ograniczenie na" label.frame.size.height ", ale to nie jest pracujący. Jak rozumiem, "contentSize" powinno "rosnąć" automatycznie. Kod: http://loessl.org/~hashier/relpub_2/DynLabel.zip – hashier

1

Może być konieczne opóźnienie przed aktualizowanie rozmiaru zawartości strony internetowej. I masonry jest przydatne do korzystania z autolayout.

-(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]; 
    } 
} 
Powiązane problemy