Jeśli program AutoLayout wdrażam programowo w systemie iOS, czy warto używać metody initWithFrame? Jeśli nie, jak zainicjować widok preferowanego rozmiaru?Automatyczne układanie za pomocą initWithFrame?
Odpowiedz
Lepiej unikać initWithFrame
, chyba że nie masz wyboru. W Auto Layout podejście polega na zdefiniowaniu dwóch ograniczeń określających szerokość i wysokość. Można to zrobić na różne sposoby, ale jeśli robisz to programowo, w metodzie updateViewConstraints
kontrolera widoku lub metodzie widoku updateConstraints
, sprawdź, czy ograniczenia zostały już utworzone, a jeśli nie, dodaj je do widoku.
E.g.
[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_mySubView]-(200)-|"
options:0
metrics:nil
views:_myViewsDictionary]];
[myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_mySubView(100)]-|"
options:0
metrics:nil
views:_myViewsDictionary]];
To powiedziawszy, lepiej zrobić to za pomocą narzędzia do tworzenia interfejsu. Kiedy już się do tego przyzwyczaisz - i trzeba się do tego przyzwyczaić - okaże się, że jest to fantastyczny przełom i znacznie lepiej niż definiowanie ograniczeń w kodzie.
To nie jest do końca przekonujące. Zgadzam się, że nie ma sensu definiować ramki, kiedy jej nie użyjesz, ale Apple wciąż mówi, że 'initWithFrame' jest wyznaczonym inicjatorem dla klasy' UIView' w dokumentacji. Nazywanie 'init' wydaje się działać dobrze, ale obawiam się, że może nie być tak w przyszłych wersjach iOS. –
jeśli użyjesz init, UIView zostanie zainicjowany przez initWithFrame, ale z parametrem CGRectZero. Więc skutecznie robisz to samo. Jaką ramkę dostarczysz do initWithFrame? Ramka, która nie będzie używana?Równie dobrze możesz przekazać CGRectZero, co jest dokładnie tym, co zrobiłbyś, gdybyś używał właśnie init. Ma to więcej sensu z Auto Layout, gdzie - jak już zauważyłeś - ramka zostanie zignorowana. W Swift zrobisz dużo UIView(). –
To wydaje się być czymś, co nieudokumentowana metoda "init" robi dzisiaj, ale ponieważ zachowanie '[UIView init]' jest nieudokumentowane, może nie być prawdą w iOS 9, w którym to momencie istniejący kod może się zepsuć. Całkowicie zgadzam się, że podanie ramki jest głupie i że wywołanie 'init' działa dobrze dzisiaj, ale to nie zmienia faktu, że Apple nie udokumentował tego zachowania. Ponieważ pytanie brzmiało "właściwa" droga, nie jestem pewien, czy odpowiedź brzmi: "polegaj na nieudokumentowanym zachowaniu". –
Dlaczego nie tylko: myView = [UIView new];
Jest to to samo, co myView = [[UIView alloc] init]; Będzie działać w twoim przypadku, jeśli po jakimś czasie dodasz wymagane więzy.
Powinieneś dodać to jako komentarz. Lub dodaj więcej wyjaśnień, dlaczego to powinno działać. –
Zmodyfikowalem moją odpowiedź. – Ricardo
override init(frame: CGRect) {
super.init(frame: frame)
NSBundle.mainBundle().loadNibNamed("YourView", owner: self, options: nil)
self.containerView.frame = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame))
self.addSubview(self.containerView)
}
Oto, co robię teraz. Pracuję z odrobiną starszego kodu i czasami jest czasochłonne przekształcenie wszystkiego, aby używać autolayout. Ponownie, jak stwierdził @Max MacLeod Nie używaj tego, chyba że nie masz wyboru.
Chciałbym dodać, że wciąż mam stalówkę do mojego widoku. –
- 1. MKMapView initWithFrame nie zwalnia pamięci za pomocą ARC
- 2. Scalanie/układanie dwóch obrazów za pomocą Cocoa/OSX
- 3. płynne przewijanie automatyczne za pomocą javascript
- 4. Automatyczne uruchamianie profilowania procesora za pomocą VisualVM
- 5. Automatyczne ładowanie PHP za pomocą SplClassLoader?
- 6. Automatyczne tworzenie sekwencji za pomocą narzędzia hibernacji
- 7. automatyczne sortowanie tabeli za pomocą sorttable.js
- 8. Automatyczne przycinanie obrazów za pomocą PIL
- 9. Automatyczne przeliczanie komentarzy za pomocą apache-poi
- 10. Automatyczne przycinanie obrazu za pomocą pythona/PILA
- 11. Układanie bitmapy na płótnie
- 12. 'initWithFrame: reuseIdentifier' jest przestarzałe
- 13. Czy initWithFrame: trigger init?
- 14. td układanie bez użycia css
- 15. Układanie wideo HTML5 na iPadzie
- 16. Co to oznacza? initWithFrame: CGRectZero]
- 17. "Automatyczne układanie nadal wymagane ..." powoduje awarię po powrocie do głównego kontrolera widoku.
- 18. Implementacja i układanie kombinatoryki
- 19. Układanie tablelayoutów z Androidem
- 20. Wyłącz automatyczne ustawianie ostrości za pomocą jQuery validator
- 21. Automatyczne wykrywanie sieci za pomocą SNMP i .NET
- 22. Automatyczne podpisywanie aplikacji za pomocą hasła w mrówce
- 23. Automatyczne kliknięcie elementu przycisku przy ładowaniu strony za pomocą jQuery
- 24. Automatyczne ukrywanie pionowych pasków przewijania za pomocą przeskakiwania css
- 25. Automatyczne zapisywanie danych za pomocą kakao i danych podstawowych
- 26. Automatyczne przewijanie do UITextView za pomocą Swift (aplikacja IOS)
- 27. Automatyczne otwieranie żądania ściągnięcia na github za pomocą wiersza polecenia
- 28. Automatyczne zwiększanie wartości w bazie ogniowej za pomocą javascript
- 29. Wyłączyć automatyczne sortowanie dyktów za pomocą funkcji dict.fromkeys()?
- 30. Automatyczne zapisywanie danych wejściowych formularza za pomocą jQuery + ASP.NET MVC
nadal można używać 'initWithFrame' – MZimmerman6
Dziękuję MZimmerman6. Powinniśmy unikać takiego kodowania lub czy jest ono właściwe? To jest moja wątpliwość. – Arock
Niezależnie od tego, czy jest to właściwe, czy nie, jeśli wykonuje swoją pracę, na coś prostego, po prostu użyj go, jeśli jest to wygodne z – MZimmerman6