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 CAGradientLayervon UIViewmir als Unteransicht positionierten Rahmen innerhalb eines unter UIViewControllerVerwendung von automatischen Layoutbeschränkungen festlegen .
Rufen Sie die Unteransicht gradientViewund den Ansichtscontroller auf child_viewController.
child_viewControllerwar ein View Controller, den ich als eine Art wiederverwendbare Komponente eingerichtet hatte. Das viewof child_viewControllerwurde also zu einem übergeordneten View-Controller zusammengesetzt - nennen Sie das parent_viewController.
Als viewDidLayoutSubviewsof child_viewControlleraufgerufen wurde, war das frameof gradientViewnoch nicht eingestellt.
(An dieser Stelle würde ich empfehlen, einige NSLogAnweisungen 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_viewControllerfand ich viewDidAppearjedoch, dass nicht aufgerufen wurde.
(Siehe diese SO-Frage: viewWillAppear, viewDidAppear wird nicht aufgerufen, nicht ausgelöst ).
Meine aktuelle Lösung
Ich habe hinzugefügt , viewDidAppearin parent_viewControllerund von dort Ich rufe viewDidAppearin child_viewController.
Für das anfängliche Laden brauche ich, viewDidAppearda 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 viewDidLayoutSubviewsin child_viewController- um den Rahmen des CAGradientLayerInneren gradientViewkorrekt zu halten.
Es funktioniert, fühlt sich aber nicht gut an. (Gibt es einen besseren Weg?)