Ich möchte das ändern anchorPoint
, aber die Ansicht an der gleichen Stelle behalten. Ich habe versucht , NSLog
-ing self.layer.position
und self.center
und sie beide gleich bleiben , unabhängig von Änderungen an der anchor. Doch meine Sicht bewegt sich!
Irgendwelche Tipps dazu?
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
Die Ausgabe ist:
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
quelle
anchorPoint
undposition
miteinander zusammenhängen?Ich hatte das gleiche Problem. Die Lösung von Brad Larson hat auch bei gedrehter Ansicht hervorragend funktioniert. Hier ist seine Lösung in Code übersetzt.
Und das schnelle Äquivalent:
quelle
Der Schlüssel zur Lösung dieses Problems war die Verwendung der Frame-Eigenschaft, die sich seltsamerweise nur ändert.
Swift 2
Swift 3
Dann mache ich meine Größenänderung, wo sie vom anchorPoint skaliert wird. Dann muss ich den alten anchorPoint wiederherstellen;
Swift 2
Swift 3
BEARBEITEN: Dies wird ausgeblendet, wenn die Ansicht gedreht wird, da die Frame-Eigenschaft undefiniert ist, wenn eine CGAffineTransform angewendet wurde.
quelle
Für mich verständlich
position
undanchorPoint
am einfachsten, als ich anfing, es mit meinem Verständnis von frame.origin in UIView zu vergleichen. Eine UIView mit frame.origin = (20,30) bedeutet, dass die UIView 20 Punkte von links und 30 Punkte von oben in der übergeordneten Ansicht entfernt ist. Diese Entfernung wird von welchem Punkt eines UIView berechnet? Es wird aus der oberen linken Ecke eines UIView berechnet.In Ebenenmarkierungen
anchorPoint
bedeutet der Punkt (in normalisierter Form, dh 0 bis 1), von dem aus dieser Abstand berechnet wird, z. B. Ebene. Position = (20, 30) bedeutet, dass die EbeneanchorPoint
20 Punkte von links und 30 Punkte von der Oberseite ihrer übergeordneten Ebene entfernt ist. Standardmäßig ist ein Ebenenankerpunkt (0,5, 0,5), sodass der Entfernungsberechnungspunkt genau in der Mitte der Ebene liegt. Die folgende Abbildung hilft mir, meinen Standpunkt zu verdeutlichen:anchorPoint
Dies ist auch der Punkt, um den die Drehung erfolgt, wenn Sie eine Transformation auf die Ebene anwenden.quelle
Es gibt so eine einfache Lösung. Dies basiert auf Kennys Antwort. Anstatt den alten Rahmen anzuwenden, verwenden Sie seinen Ursprung und den neuen, um die Übersetzung zu berechnen, und wenden Sie diese Übersetzung dann auf die Mitte an. Es funktioniert auch mit gedrehter Ansicht! Hier ist der Code, viel einfacher als andere Lösungen:
quelle
Für diejenigen, die es brauchen, ist hier Magnus 'Lösung in Swift:
quelle
view.setTranslatesAutoresizingMaskIntoConstraints(true)
. danke Mannview.setTranslatesAutoresizingMaskIntoConstraints(true)
ist erforderlich, wenn Einschränkungen für das automatische Layout verwendet werden.translatesAutoresizingMaskIntoConstraints
ist genau das, was mir gefehlt hat, hätte ich inzwischen lernen könnenHier ist die Antwort von Benutzer 945711, die für NSView unter OS X angepasst wurde. Abgesehen davon, dass NSView keine
.center
Eigenschaft hat, ändert sich der Frame von NSView nicht (wahrscheinlich, weil NSViews standardmäßig nicht mit einem CALayer geliefert werden), aber der Ursprung des CALayer-Frames ändert sich, wenn der Ankerpunkt geändert wird.quelle
Wenn Sie anchorPoint ändern, ändert sich auch seine Position, es sei denn, Ihr Ursprung ist Nullpunkt
CGPointZero
.quelle
Bearbeiten und sehen Sie den Ankerpunkt von UIView direkt im Storyboard (Swift 3)
Dies ist eine alternative Lösung, mit der Sie den Ankerpunkt über den Attributinspektor ändern können und die über eine andere Eigenschaft verfügt, um den Ankerpunkt zur Bestätigung anzuzeigen.
Erstellen Sie eine neue Datei, die Sie in Ihr Projekt aufnehmen möchten
Fügen Sie dem Storyboard die Ansicht hinzu und legen Sie die benutzerdefinierte Klasse fest
Stellen Sie nun den neuen Ankerpunkt für die UIView ein
Wenn Sie den Show-Ankerpunkt aktivieren, wird ein roter Punkt angezeigt, damit Sie besser sehen können, wo sich der Ankerpunkt visuell befindet. Sie können es später jederzeit ausschalten.
Dies hat mir bei der Planung von Transformationen in UIViews sehr geholfen.
quelle
Für Swift 3:
quelle
Ausgehend von Magnus 'großartiger und gründlicher Antwort habe ich eine Version erstellt, die auf Unterebenen funktioniert:
quelle