Firma Apple dość jasno zdefiniowała sposób tworzenia podklas UIView
w dokumencie.
Sprawdź poniższą listę, a zwłaszcza spójrz na initWithFrame:
i layoutSubviews
. Pierwsza z nich jest przeznaczona do ustawienia ramki, UIView
podczas gdy druga służy do ustawienia ramki i układu jej podglądów.
Pamiętaj również, że initWithFrame:
jest ona wywoływana tylko wtedy, gdy tworzysz instancję w sposób UIView
programowy. Jeśli ładujesz go z pliku nib (lub storyboardu), initWithCoder:
zostanie użyty. A w initWithCoder:
ramce nie został jeszcze obliczony, więc nie można zmodyfikować ramkę skonfigurowanej w konstruktorze Interface. Jak zasugerowano w tej odpowiedzi , możesz pomyśleć o dzwonieniu initWithFrame:
z initWithCoder:
w celu ustawienia ramki.
Na koniec, jeśli ładujesz UIView
ze stalówki (lub storyboardu), masz również awakeFromNib
możliwość wykonania niestandardowych inicjalizacji ramki i układu, ponieważ kiedy awakeFromNib
jest wywoływany, gwarantuje się, że każdy widok w hierarchii został cofnięty z archiwum i zainicjowany.
Z dokumentu z NSNibAwaking
(obecnie zastąpionego przez dokument z awakeFromNib
):
Wiadomości do innych obiektów mogą być bezpiecznie wysyłane z poziomu awakeFromNib - do tego czasu mamy pewność, że wszystkie obiekty zostaną przywrócone z archiwum i zainicjowane (choć niekoniecznie przebudzone, oczywiście)
Warto również zauważyć, że w przypadku autoukładu nie należy jawnie ustawiać ramki widoku. Zamiast tego należy określić zestaw wystarczających ograniczeń, aby ramka była automatycznie obliczana przez silnik układu.
Prosto z dokumentacji :
Metody do zastąpienia
Inicjalizacja
initWithFrame:
Zaleca się wdrożenie tej metody. Oprócz tej metody lub zamiast niej można również zaimplementować niestandardowe metody inicjowania.
initWithCoder:
Zaimplementuj tę metodę, jeśli ładujesz widok z pliku nib programu Interface Builder, a widok wymaga niestandardowej inicjalizacji.
layerClass
Zaimplementuj tę metodę tylko wtedy, gdy chcesz, aby Twój widok używał innej warstwy animacji podstawowej dla swojego magazynu zapasowego. Na przykład, jeśli używasz OpenGL ES do rysowania, chciałbyś zastąpić tę metodę i zwrócić klasę CAEAGLLayer.
Rysowanie i drukowanie
drawRect:
Zaimplementuj tę metodę, jeśli Twój widok rysuje zawartość niestandardową. Jeśli widok nie zawiera żadnego niestandardowego rysunku, unikaj zastępowania tej metody.
drawRect:forViewPrintFormatter:
Zastosuj tę metodę tylko wtedy, gdy chcesz inaczej narysować zawartość widoku podczas drukowania.
Ograniczenia
requiresConstraintBasedLayout
Zaimplementuj tę metodę klasy, jeśli klasa widoku wymaga ograniczeń do prawidłowego działania.
updateConstraints
Zaimplementuj tę metodę, jeśli Twój widok wymaga tworzenia niestandardowych ograniczeń między widokami podrzędnymi.
alignmentRectForFrame:
, frameForAlignmentRect:
Zaimplementuj te metody, aby zastąpić sposób dopasowania widoków do innych widoków.
Układ
sizeThatFits:
Zaimplementuj tę metodę, jeśli chcesz, aby widok miał inny domyślny rozmiar niż normalnie podczas operacji zmiany rozmiaru. Na przykład, możesz użyć tej metody, aby zapobiec zmniejszaniu się widoku do punktu, w którym podwidoki nie mogą być poprawnie wyświetlane.
layoutSubviews
Zaimplementuj tę metodę, jeśli potrzebujesz dokładniejszej kontroli nad układem widoków podrzędnych, niż zapewniają to ograniczenia lub zachowania autorezyzacji.
didAddSubview:
, willRemoveSubview:
Zaimplementuj te metody w razie potrzeby, aby śledzić dodawanie i usuwanie podglądów podrzędnych.
willMoveToSuperview:
, didMoveToSuperview
Zaimplementuj te metody w razie potrzeby, aby śledzić ruch bieżącego widoku w hierarchii widoków.
willMoveToWindow:
, didMoveToWindow
Zaimplementuj te metody w razie potrzeby, aby śledzić ruch widoku do innego okna.
Obsługa zdarzeń:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
, touchesCancelled:withEvent:
Wdrożenie tych metod, jeśli chcesz obsługiwać zdarzenia dotykowe bezpośrednio. (W przypadku wprowadzania za pomocą gestów użyj rozpoznawania gestów).
gestureRecognizerShouldBegin:
Zaimplementuj tę metodę, jeśli Twój widok bezpośrednio obsługuje zdarzenia dotyku i może chcieć uniemożliwić dołączonym modułom rozpoznawania gestów wyzwalanie dodatkowych akcji.