Ich habe eine, UIView
die ungefähr 8 verschiedene CALayer
Unterschichten zu ihrer Schicht hinzugefügt hat. Wenn ich die Grenzen der Ansicht ändere (animiert), wird die Ansicht selbst verkleinert (ich habe sie mit a markiertbackgroundColor
), aber die Größe der Unterschichten bleibt unverändert .
Wie kann man das lösen?
UITextView
Selbstgröße (scrollEnabled = NO) und einem automatischen Layout nicht sehr gut . Ich hatte eine Textansicht an die Übersicht gebunden, die wiederum einenCALayer
am unteren Rand (einen Rand) hatte, und ich wollte , dass die Randposition aktualisiert wird, wenn sich die Höhe der Textansicht ändert. Aus irgendeinem GrundlayoutSubiews
wurde viel zu spät aufgerufen (und die Ebenenposition wurde animiert).Da CALayer auf dem iPhone keine Layout-Manager unterstützt, müssen Sie die Hauptebene Ihrer Ansicht zu einer benutzerdefinierten CALayer-Unterklasse machen, in der Sie überschreiben
layoutSublayers
, um die Frames aller Unterschichten festzulegen. Sie müssen auch die+layerClass
Methode Ihrer Ansicht überschreiben , um die Klasse Ihrer neuen CALayer-Unterklasse zurückzugeben.quelle
Ich habe dies in der UIView verwendet.
Funktioniert bei mir.
quelle
CALayerDelegate
sdraw(_:in:)
), musste ich anrufen auch_anySubLayer.setNeedsDisplay()
. Dann hat das bei mir funktioniert.Ich hatte das gleiche Problem. In der Ebene einer benutzerdefinierten Ansicht habe ich zwei weitere Unterebenen hinzugefügt. Um die Größe der Unterebenen zu ändern (jedes Mal, wenn sich die Grenzen der benutzerdefinierten Ansicht ändern), habe ich die Methode
layoutSubviews
meiner benutzerdefinierten Ansicht implementiert . Bei dieser Methode aktualisiere ich einfach den Frame jeder Unterschicht, um ihn an die aktuellen Grenzen der Ebene meiner Unteransicht anzupassen.Etwas wie das:
quelle
2017
Die wörtliche Antwort auf diese Frage:
"Die Größe der CALayers wurde bei der Änderung der Grenzen von UIView nicht geändert. Warum?"
ist das zum Guten oder Schlechten
needsDisplayOnBoundsChange
Der Standardwert ist false in
CALayer
.Lösung,
In der Tat leite ich Sie zu dieser Qualitätssicherung
https://stackoverflow.com/a/47760444/294884
was erklärt, was zum Teufel die kritische
contentsScale
Einstellung tut; Normalerweise müssen Sie dies gleichermaßen festlegen, wenn Sie requireDisplayOnBoundsChange festlegen.quelle
Swift 3 Version
Fügen Sie in der benutzerdefinierten Zelle die folgenden Zeilen hinzu
Zuerst deklarieren
Fügen Sie dann die folgenden Zeilen hinzu
quelle
Wie [Ole] schrieb, unterstützt CALayer die automatische Größenänderung unter iOS nicht. Sie sollten das Layout also manuell anpassen. Meine Option war, den Rahmen der Ebene innerhalb von (iOS 7 und früher) anzupassen.
oder (ab iOS 8)
quelle
In Ihrer benutzerdefinierten Ansicht müssen Sie eine Variable für Ihre benutzerdefinierte Ebene deklarieren. Deklarieren Sie keine Variable in scope init. Und starten Sie es einfach einmal, versuchen Sie nicht, den Nullwert festzulegen und neu zu starten
quelle