Drodzy deweloperzy, mam problem z AutoLayout w Interface Builder (Xcode 5 / iOS 7). Jest to bardzo podstawowe i ważne, więc myślę, że każdy powinien wiedzieć, jak to działa poprawnie. Jeśli jest to błąd w Xcode, jest to błąd krytyczny!
Kiedy więc mam taką hierarchię widoków, mam problemy:
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
UIScrollView ma solidne ograniczenia, np. 50 pikseli z każdej strony (bez problemu). Następnie dodaję ograniczenie górnej przestrzeni do UILabel (bez problemu) (i mogę nawet przypiąć wysokość / szerokość etykiety, nic nie zmienia, ale powinno być niepotrzebne ze względu na wewnętrzny rozmiar etykiety)
Problem zaczyna się, gdy dodam ograniczenie końcowe do UILabel:
Np. Końcowe odstępy do: Superview równa się: 25
Teraz pojawiają się dwa ostrzeżenia - i nie rozumiem, dlaczego:
A) Dwuznaczność przewijalnej zawartości (widok przewijania ma niejednoznaczną przewijaną wysokość / szerokość)
B) Niewłaściwe widoki (oczekiwana etykieta: x = -67 Rzeczywista: x = 207
Zrobiłem ten minimalny przykład w świeżo nowym projekcie, który można pobrać i załączyłem zrzut ekranu. Jak widać, Konstruktor interfejsów oczekuje, że etykieta będzie znajdować się poza granicą UIScrollView (pomarańczowy przerywany prostokąt). Aktualizacja ramki etykiety za pomocą narzędzia Rozwiąż problemy przenosi ją właśnie tam.
Uwaga: W przypadku zamiany UIScrollView na UIView zachowanie jest zgodne z oczekiwaniami (ramka etykiety jest poprawna i zgodna z ograniczeniem). Wygląda na to, że występuje problem z UIScrollView lub brakuje mi czegoś ważnego.
Kiedy uruchamiam aplikację bez aktualizacji ramki etykiety, jak sugeruje IB, jest ona pozycjonowana w porządku, dokładnie tam, gdzie powinna być, a UIScrollView można przewijać. Jeśli zaktualizuję ramkę, etykieta jest niewidoczna, a UIScrollView nie przewija się.
Pomóż mi Obi-Wan Kenobi! Dlaczego niejednoznaczny układ? Dlaczego źle umieszczony widok?
Możesz pobrać przykładowy projekt tutaj i spróbować dowiedzieć się, co się dzieje: https://github.com/Wirsing84/AutoLayoutProblem
UIScrollView
bezpośrednio. Zamiast tego użyj UICollectionView
lub w UITableView
jak największym stopniu, w większości przypadków wszystko jest możliwe z tym elementem, a także zapewnia prostotę, czytelność i możliwość ponownego użycia !!!