Autolayout und Schatten

8

Ich habe ein Problem mit dem Hinzufügen von Schatten zu meiner UIView, die in iOS 6 Anwendung mit Autolayout erstellt wird.

Nehmen wir an, ich habe eine Methode, die am Ende von UIView einen Schatten hinzufügt (das ist eigentlich eine Kategorie von UIView, also wiederverwendbar):

%Vor%

Wenn ich diese Methode in viewDidLoad eines UIViewControllers aufrufe, wird Schatten wahrscheinlich aufgrund aller Einschränkungen, die berechnet werden müssen, nicht hinzugefügt.

Wenn ich diese Methode in viewWillAppear die gleiche Situation rufe.

Wenn ich diese Methode in viewDidAppear aufruft, funktioniert es, aber wenn eine neue Ansicht angezeigt wird, gibt es einen kurzen Moment, in dem es keinen Schatten gibt und nach einer Weile erscheint.

Wenn ich den shadowPath nicht setze und die Zeile self.layer.shadowPath lösche, funktioniert alles, aber die Übergänge sind nicht glatt.

Also meine Frage ist, was ist der richtige Weg, um einen Schatten zur Anzeige in iOS 6 mit Autolayout eingeschaltet zu machen?

    
Kamil 25.01.2013, 18:53
quelle

3 Antworten

14

Eine weitere Sache, die Sie der Ebene hinzufügen können, wenn Sie mit AutoLayout arbeiten und einen Schatten auf einem UIView benötigen, wo der Rahmen noch nicht bekannt ist, ist dies:

%Vor%

Entfernen Sie anschließend die shadowPath-Eigenschaft, da die automatischen Layoutbeschränkungen noch nicht verarbeitet wurden. Auch zum Zeitpunkt der Ausführung werden Sie die Grenzen oder den Rahmen der Ansicht nicht kennen.

Dies verbessert die Leistung sehr!

    
Yannick 23.08.2013 11:45
quelle
1

Genau das gleiche Problem ...

Obwohl ich den CALayer-Schatten in einer Ansicht nicht gut animieren kann, wird der Schatten nach der Animation wieder richtig ausgerichtet.

Meine Lösung (die in meiner Anwendung gut funktioniert) ist, die shadowOpacity auf 0 zu setzen und sie dann NACH der Beendigung der Animation auf den gewünschten Wert zurückzusetzen. Aus der Sicht eines Benutzers können Sie nicht einmal erkennen, dass der Schatten verschwunden ist, da die Animationen normalerweise zu schnell sind, um den Unterschied zu erkennen.

Hier ist ein Beispiel für einen Code in meiner Anwendung, in dem ich den konstanten Wert einer Integritätsbedingung ändere, nämlich 'Trailing Edge to Superview' NSLayoutContraint:

%Vor%

Zwei Dinge:

  • Ich hätte den FadeInShadow in den Completion-Block schreiben können, aber aufgrund der Art, wie ein Teil meines anderen Codes berücksichtigt wird, funktioniert das besser für mich.
  • Mir ist klar, dass ich mit "fadeInShadow" keine Einblendung mache, aber angesichts der Geschwindigkeit, mit der es nach dem Abschluss der Animation gerendert wird, fand ich es nicht notwendig.

Hoffe das hilft!

    
mattv123 02.02.2013 03:48
quelle
1

Ich habe self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; aus Ihrem Code entfernt und es funktioniert für mich in viewDidLoad , bitte bestätigen.

Wenn Sie shdowOffset erhöhen, sehen Sie den Schatten klarer.

    
Vaibhav Saran 20.03.2013 09:48
quelle