Ograniczenia z widokami przewijania działają nieco inaczej niż w przypadku innych widoków. Ograniczenia między contentView
i superview
(scrollView
) są scrollView
's contentSize
, a nie jego frame
. To może wydawać się kłopotliwe, ale w rzeczywistości jest całkiem przydatne, co oznacza, że nigdy nie musisz dopasowywać contentSize
, ale raczej contentSize
automatycznie dostosuje się do twoich treści. To zachowanie jest opisane w Technical Note TN2154.
Jeśli chcesz zdefiniować rozmiar contentView
na ekranie lub coś podobnego, musisz dodać ograniczenie między contentView
a widokiem głównym, na przykład. Jest to, wprawdzie, sprzeczne z treścią przewijania, więc pewnie bym tego nie poradził, ale można to zrobić.
Aby zilustrować tę koncepcję, że wielkość contentView
będzie napędzany przez jego zawartości, a nie przez bounds
na scrollView
, dodać etykietę do contentView
:
UIScrollView* scrollView = [UIScrollView new];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview:scrollView];
UIView* contentView = [UIView new];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
contentView.backgroundColor = [UIColor greenColor];
[scrollView addSubview:contentView];
UILabel *randomLabel = [[UILabel alloc] init];
randomLabel.text = @"this is a test";
randomLabel.translatesAutoresizingMaskIntoConstraints = NO;
randomLabel.backgroundColor = [UIColor clearColor];
[contentView addSubview:randomLabel];
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
Teraz będziesz zobacz, że contentView
(i, w związku z tym, contentSize
z scrollView
) są dostosowane tak, aby pasowały do etykiety ze standardowymi marginesami. A ponieważ nie określiłem szerokości/wysokości etykiety, która zostanie dostosowana w oparciu o tekst, który umieścisz w tej etykiecie.
Jeśli chcesz contentView
również dostosować do szerokości widoku głównym, można zrobić przedefiniować swoją viewDict
jak tak, a następnie dodać te dodatkowe ograniczenia (w dodatku do wszystkich innych, wyżej):
UIView *mainView = self.view;
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel, mainView);
[mainView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[contentView(==mainView)]" options:0 metrics:0 views:viewDict]];
jest known issue (bug?) z multilinii etykiet w scrollviews, że jeśli chcesz go zmienić rozmiar w zależności od ilości tekstu, trzeba zrobić kilka kuglarstwo, takich jak:
dispatch_async(dispatch_get_main_queue(), ^{
randomLabel.preferredMaxLayoutWidth = self.view.bounds.size.width;
});
I nie wydają się uzyskać etykietę, aby poszerzyć pionowo, jeśli tekst jest zbyt długi, aby zmieścić się na jedna linia. Ustawiłem liczbę linii na 0, a lineBreakMode na NSLineBreakByWordWrapping. Czy czegoś brakuje? – rdelmar
Dodatkowo, dodałem ostatnią linię w twojej odpowiedzi, aby przypiąć szerokość contentView do szerokości ekranu (w przeciwnym razie szerokość contentView jest wystarczająco szeroka, aby pomieścić długi tekst). Jeśli wyraźnie ustawię wysokość etykiety z ograniczeniem wysokości, to działa. – rdelmar
Tak, Matt odkrył [kilka obejść] (http://stackoverflow.com/questions/13149733/ios-autolayout-issue-with-uilabels-in-a-resizing-parent-view) dla tego wydania/błąd w etykietach wielowierszowych. Dodałem jeden z nich na samym dole mojej odpowiedzi. Całkowicie niezadowalające rozwiązanie. Wygląda na to, że musisz wybrać między wartościami hardcoding lub tym kludgy obejściem. – Rob