Ich hatte ein ähnliches Problem - ich musste den Rahmen eines 'CALayer' festlegen, wenn ich das automatische Layout mit Ansichten verwendete (im Code, nicht IB ).
In meinem Fall hatte ich eine leicht verschlungene Hierarchie mit einem Ansichts-Controller innerhalb eines Ansichts-Controllers. Ich kam zu dieser SO-Frage und untersuchte den Ansatz der Verwendung viewDidLayoutSubviews
. Das hat nicht funktioniert. Nur für den Fall, dass Ihre Situation meiner ähnlich ist, habe ich Folgendes gefunden ...
Überblick
Ich wollte den Rahmen für den CAGradientLayer
von UIView
mir als Unteransicht positionierten Rahmen innerhalb eines unter UIViewController
Verwendung von automatischen Layoutbeschränkungen festlegen .
Rufen Sie die Unteransicht gradientView
und den Ansichtscontroller auf child_viewController
.
child_viewController
war ein View Controller, den ich als eine Art wiederverwendbare Komponente eingerichtet hatte. Das view
of child_viewController
wurde also zu einem übergeordneten View-Controller zusammengesetzt - nennen Sie das parent_viewController
.
Als viewDidLayoutSubviews
of child_viewController
aufgerufen wurde, war das frame
of gradientView
noch nicht eingestellt.
(An dieser Stelle würde ich empfehlen, einige NSLog
Anweisungen zu verteilen, um ein Gefühl für die Reihenfolge der Erstellung von Ansichten in Ihrer Hierarchie usw. zu bekommen.)
Also habe ich es weiter versucht viewDidAppear
. Aufgrund der Verschachtelung von child_viewController
fand ich viewDidAppear
jedoch, dass nicht aufgerufen wurde.
(Siehe diese SO-Frage: viewWillAppear, viewDidAppear wird nicht aufgerufen, nicht ausgelöst ).
Meine aktuelle Lösung
Ich habe hinzugefügt , viewDidAppear
in parent_viewController
und von dort Ich rufe viewDidAppear
in child_viewController
.
Für das anfängliche Laden brauche ich, viewDidAppear
da erst wenn dies aufgerufen wird child_viewController
, alle Unteransichten ihre Frames gesetzt haben. Ich kann dann den Rahmen für die CAGradientLayer
...
Ich habe gesagt, dass dies meine aktuelle Lösung ist, weil ich damit nicht besonders zufrieden bin.
Nach dem erstmaligen Einstellen des Rahmens von CAGradientLayer
- kann dieser Rahmen ungültig werden, wenn sich das Layout ändert - z. B. durch Drehen des Geräts.
Um damit umzugehen, benutze ich viewDidLayoutSubviews
in child_viewController
- um den Rahmen des CAGradientLayer
Inneren gradientView
korrekt zu halten.
Es funktioniert, fühlt sich aber nicht gut an. (Gibt es einen besseren Weg?)