2013-08-20 16 views
9

Cel:Dopasowany podrzędny do swojego superview użyciu autolayout

Mieć UIWebView mieć tę samą szerokość jak to superview, który jest UIScrollView, używając autolayout ograniczeń.

Kod

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:self.masterScrollView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

NSLog(@"The width of questionWebView *AFTER* adding the constrain is: %f", self.questionWebView.frame.size.width); 
NSLog(@"The width of scrollView *AFTER* adding the constrain is: %f", self.masterScrollView.frame.size.width); 

Aktualny Wynik

Kiedy loguję szerokość self.questionWebView (w UIWebView), to szerokość nie zmienia się, gdy ograniczeniem autolayout jest stosowana.

Pytania

  • Czy to właściwe podejście?
  • Co robię źle?

p.s Wiem, że to wbrew rekomendacji Apple'a do umieszczenia UIWebView w UIScrollView, jednak mam wyłączony zdolność do przewijania UIWebView przy użyciu właściwości self.questionWebView.userInteractionEnabled = NO;. A obecnie używanie UIWebView to moja najlepsza strategia wyświetlania tabeli HTML.

Odpowiedz

16

Poprawiono odpowiedź Roba, zgodnie z prośbą.

Jak już wspomniałem, UIScrollViews ma dziwne zachowanie w Automatycznym układzie.

W tym przypadku chodzi o to, że szerokość całkowita scrollView jest określana za pomocą całkowitej szerokości subskrybenta. Tak więc, podczas gdy scrollView prosi już webView o swoją szerokość, mówisz webView, aby poprosił również scrollView o jego szerokość. Dlatego to nie działa. Jeden pyta drugiego i nikt nie zna odpowiedzi. Potrzebujesz innego widoku referencyjnego, aby użyć go jako ograniczenia dla webView, a następnie scrollView będzie mógł z powodzeniem zapytać o jego oczekiwaną szerokość.

W prosty sposób można to zrobić: stworzyć kolejny widok, containerView i dodać scrollView jako podgląd do tego. Następnie ustaw odpowiednie ograniczenia dla containerView. Powiedzmy, że chciałeś, aby scrollView był wycentrowany na kontrolerze viewController, z pewnym dopełnieniem na krawędziach.Więc zrób to dla containerView:

NSDictionary *dict = NSDictionaryOfVariableBindings(containerView); 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"H|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"V|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 

Następnie można kontynuować dodawanie Webview jako podrzędny do Scrollview i ustawienie jej szerokość:

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:containerView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

Byłoby to sprawi, że Scrollview tak duży i wysoki jak webView, i oba będą umieszczone zgodnie z przeznaczeniem (z ograniczeniami ustawionymi na containerView).

+1

Możesz to zrobić również w IB: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html#//apple_ref/doc/uid/TP40010853-CH5-SW5 "Tworzenie widoków zakotwiczonych wewnątrz widoku przewijania" – Brenden

3

Wywiady są nieco dziwne w sposobie interakcji z układem automatycznym. Zobacz TN2154 (UIScrollView i Autolayout).

Zobacz także UIScrollView doesn't use autolayout constraints.

Zasadniczo szerokość widoku musi być inna niż "bieżąca szerokość przewijania", ponieważ w układzie automatycznym szerokość przewijania (tzn. Szerokość treści) jest definiowana pod względem zawartości. W związku z tym twoje bieżące żądanie jest cykliczne.

+2

Łatwą strategią byłoby dodanie scrollView jako podglądu do innego widoku (ułożonego tak, jak powinien to być scrollView) i ustawienie Auto Layout, aby użyć szerokości tego widoku do ustawienia widoku webView. –

+1

@AlohaSilver dziękuję, dodaj to jako osobną odpowiedź, myślę, że jest przydatna jako odpowiedź, a nie jako komentarz. – drc

Powiązane problemy