Mam widok, który wymaga programowego manipulowania ramką - jest to rodzaj widoku dokumentu, który zawija się do zawartości, która jest następnie przewijana i powiększana wokół superwiewu poprzez manipulowanie początkiem ramki. Autolayout walczy z tym w czasie wykonywania.
Całkowite wyłączenie autoukładu wydaje się nieco trudne, ponieważ można go rozsądnie wykorzystać do obsługi układu dla innych widoków. Wygląda na to, że to, czego potrzebuję, to pewnego rodzaju „zerowe ograniczenie”.
źródło
Miałem podobny problem, w którym Autolayout przesłaniał niektóre z moich ustawień klatek w czasie wykonywania (miałem dynamiczny widok, który w niektórych przypadkach pchnął nowy kontroler widoku ... naciśnięcie, a następnie naciśnięcie przycisku Wstecz zresetowało widok początkowy).
Poradziłem sobie z tym, umieszczając mój kod manipulacji w
viewDidLayoutSubviews
moim kontrolerze widoku. Wydaje się, że jest to wywoływane po wywołaniu dowolnego ograniczenia mojo, ale przed viewDidAppear, więc użytkownik nie jest mądrzejszy.źródło
Być może po prostu ustawienie
translatesAutoresizingMaskIntoConstraints
naYES
(a nie dodanie dodatkowych ograniczeń mających wpływ na ten pogląd) pozwoli Ci ustawić ramkę bez walki system układu automatycznego.źródło
W iOS 8 możesz ustawić NSLayoutConstraint na aktywny lub nie. Więc jeśli używam kreatora interfejsów, dodaję wszystkie moje ograniczenia do OutletCollection, a następnie aktywuję lub dezaktywuję za pomocą:
Konkretna aplikacja, do której go tutaj używam, ma różne ograniczenia w trybie pionowym i poziomym i aktywuję / dezaktywuję na podstawie obrotu urządzenia. Oznacza to, że mogę tworzyć skomplikowane zmiany układu w kreatorze interfejsu dla obu orientacji i nadal używać automatycznego układu bez szczegółowego kodu automatycznego układu.
Lub możesz aktywować / dezaktywować za pomocą removeConstraints i addConstraints.
źródło
Nie wiem, czy to pomoże komukolwiek innemu, ale napisałem kategorię, aby było to wygodne, ponieważ często to robię.
UIView + DisableAutolayoutTemporently.h
UIView + DisableAutolayoutTemporently.m
Używam tego w ten sposób:
Mam nadzieję, że to pomoże.
źródło
Możesz ustawić
translatesAutoresizingMaskIntoConstraints
typBoolean
, wartość tak w zdefiniowanych przez użytkownika atrybutach środowiska wykonawczego UIView, które chcesz w xib / storyboard.źródło
Możesz podzielić wiele scenorysów, jeśli chcesz użyć autoukładu dla niektórych widoków.
źródło
U mnie działało programowe utworzenie widoku podrzędnego, w moim przypadku układ automatyczny mylił się z widokiem, który musiałem obracać wokół jego środka, ale kiedy utworzyłem ten widok programowo, zadziałał.
źródło
Moim zdaniem miałem etykietę i tekst. Etykieta miała gest przesuwania. Etykieta porusza się dobrze podczas przeciągania. Ale kiedy używam klawiatury w polu tekstowym, etykieta resetuje swoje położenie do pierwotnej lokalizacji zdefiniowanej w automatycznym układzie. Problem został rozwiązany, gdy szybko dodałem następujący element do etykiety. Dodałem to w viewWillAppear, ale można to dodać prawie wszędzie, gdzie masz dostęp do pola docelowego.
źródło
Zdarzyło mi się to w projekcie bez scenorysów lub plików xib. Cały kod 100%. Miałem baner reklamowy na dole i chciałem, aby granice widoku zatrzymały się na banerze reklamowym. Widok zmieniłby się automatycznie po załadowaniu. Wypróbowałem każdą rozdzielczość na tej stronie, ale żadna z nich nie działała.
Skończyło się na utworzeniu widoku podrzędnego ze skróconą wysokością i umieszczeniu go w głównym widoku kontrolera. Następnie cała moja zawartość trafiła do widoku podrzędnego. To bardzo łatwo rozwiązało problem, nie robiąc niczego, co wydawałoby się, że idzie pod prąd.
Myślę, że jeśli chcesz mieć widok, który nie jest normalnym rozmiarem, który wypełnia okno, powinieneś użyć do tego widoku podrzędnego.
źródło
Spotkałem się z podobnym scenariuszem, w którym dołączyłem do projektu, który został zainicjowany z automatycznym układem, ale musiałem wprowadzić dynamiczne poprawki w kilku widokach. Oto, co zadziałało dla mnie:
NIE Miej widoków ani komponentów rozplanowanych w konstruktorze interfejsu.
Dodaj swoje widoki czysto programowo, zaczynając od przydziału / inicjalizacji i odpowiedniego ustawienia ramek.
Gotowe.
źródło
Zamiast wyłączać automatyczne układanie, po prostu obliczyłbym nowe ograniczenie z ramką, którą zastępujesz. Wydaje mi się, że jest to właściwy sposób. Jeśli dostosowujesz komponenty, które opierają się na wiązaniach, dostosuj je odpowiednio.
Na przykład, jeśli masz ograniczenie w pionie wynoszące 0 między dwoma widokami (myView i otherView) i masz gest przesunięcia lub coś, co dostosowuje wysokość myView, możesz ponownie obliczyć ograniczenie za pomocą dostosowanych wartości.
źródło
Dla tych z Was, którzy używają automatycznego układu, sprawdź moje rozwiązanie tutaj . Powinieneś tworzyć
@IBOutlet
ograniczenia, które chcesz dostosować, a następnie zmieniać ich stałe.źródło
jeśli jest to plik xib:
źródło