Mam jedną, UIView
która ma około 8 różnych CALayer
podwarstw dodanych do swojej warstwy. Jeśli zmodyfikuję granice widoku (animowane), to sam widok się kurczy (sprawdziłem to z a backgroundColor
), ale rozmiar podwarstw pozostaje niezmieniony .
Jak to rozwiązać?
UITextView
samodopasowaniem (scrollEnabled = NO) i automatycznym układem. Miałem widok tekstu przypięty do jego superviewu, który z kolei miałCALayer
u dołu samego siebie (obramowanie) i chciałem, aby aktualizował położenie obramowania, gdy zmieniła się wysokość widoku tekstu. Z jakiegoś powodulayoutSubiews
został wywołany o wiele za późno (a pozycja warstwy została animowana).Ponieważ CALayer na iPhonie nie obsługuje menedżerów układu, myślę, że musisz uczynić główną warstwę widoku niestandardową podklasą CALayer, w której nadpisujesz,
layoutSublayers
aby ustawić klatki wszystkich podwarstw. Musisz również nadpisać+layerClass
metodę swojego widoku, aby zwrócić klasę nowej podklasy CALayer.źródło
Użyłem tego w UIView.
Pracuje dla mnie.
źródło
CALayerDelegate
„sdraw(_:in:)
), miałem też zadzwonić_anySubLayer.setNeedsDisplay()
. Wtedy to zadziałało dla mnie.Miałem ten sam problem. W warstwie widoku niestandardowego dodałem jeszcze dwie podwarstwy. Aby zmienić rozmiar podwarstw (za każdym razem, gdy zmieniają się granice widoku niestandardowego), zaimplementowałem metodę
layoutSubviews
mojego widoku niestandardowego; w ramach tej metody po prostu aktualizuję ramkę każdej podwarstwy, aby pasowała do bieżących granic warstwy mojego widoku podrzędnego.Coś takiego:
źródło
2017
Dosłowna odpowiedź na to pytanie:
„CALayers nie zmieniał rozmiaru po zmianie granic jego UIView. Dlaczego?”
czy to na dobre czy na złe
needsDisplayOnBoundsChange
domyślnie false
CALayer
.rozwiązanie,
Rzeczywiście, kieruję cię do tej kontroli jakości
https://stackoverflow.com/a/47760444/294884
co wyjaśnia, co do cholery
contentsScale
robi to ustawienie krytyczne ; zwykle trzeba to ustawić tak samo, gdy ustawiasz needDisplayOnBoundsChange.źródło
Wersja Swift 3
W komórce niestandardowej Dodaj następujące wiersze
Najpierw zadeklaruj
Następnie dodaj następujące wiersze
źródło
Jak napisał [Ole], CALayer nie obsługuje automatycznego zmiany rozmiaru w systemie iOS. Dlatego powinieneś dostosować układ ręcznie. Moją opcją było dostosowanie ramki warstwy w ramach (iOS 7 i wcześniejsze)
lub (od iOS 8)
źródło
W widoku niestandardowym musisz zadeklarować zmienną dla swojej warstwy niestandardowej, nie deklaruj zmiennej w inicjalizacji zakresu. I po prostu zainicjuj to raz, nie próbuj ustawiać wartości null i reinitować
źródło