wake-up-neo.com

Drehen Sie UIView um seine Mitte und behalten Sie dabei seine Größe

Ich versuche, eine UIView einige Radiant zu drehen, aber nachdem die Transformation angewendet wurde, scheint sie nicht ihre Größe zu behalten. Was ist der richtige Weg, um dies zu erreichen?

Hier ist was ich mache und was ich bekomme (blaue Box mit dem Pfeil ist die Ansicht, die ich drehen möchte - es sollte den gleichen Aspekt wie die rote Box hinter sich halten):

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(CGAffineTransformIdentity, rads);
self.arrowView.transform = transform;

enter image description here

Vielen Dank!

44
Diego Acosta

Sie haben wahrscheinlich ein Problem mit Autolayout. Sie haben wahrscheinlich Einschränkungen für die gedrehte Ansicht, die sie an den Rändern des Superviews fixiert. Wenn die Transformation angewendet wird, aktualisiert Autolayout die Größe der Ansicht, damit sie immer noch in den Überblick passt. 

Sie können mit verschiedenen Randbedingungen experimentieren (z. B. den Mittelpunkt der Ansicht an den Mittelpunkt einer anderen Ansicht anpassen und Breite und Höhe auf konstante Werte festlegen) oder die Option Autolayout für die gedrehte Ansicht deaktivieren oder, falls diese nicht funktionieren oder nicht funktionieren Um Ihren Anforderungen nicht gerecht zu werden, verwenden Sie eine Container-Ansicht, die unter Autolayout angeordnet ist, und fügen Sie Ihre rotierende Ansicht hinzu, ohne Autolayout zu verwenden. 

Dies ist nur im Code möglich. Sie können einzelne Ansichten für Autolayout festlegen oder nicht, indem Sie translatesAutoresizingMasksIntoConstraints auf NO (Autolayout ein) oder YES (Autolayout aus) setzen. Sie müssen die entsprechenden Masken für die automatische Größenänderung festlegen, wenn Sie eine Ansicht von einer zur anderen wechseln. 

24
jrturton

Ich vermeide die Verwendung von Makros, sofern dies nicht erforderlich ist. Das funktioniert einwandfrei

float degrees = 20; //the value in degrees
view.transform = CGAffineTransformMakeRotation(degrees * M_PI/180);
44
Shaheen Ghiassy

Swift + Erweiterung sind deine Freunde!

// MARK: - UIView Extension -

extension UIView {

    /**
     Rotate a view by specified degrees

     - parameter angle: angle in degrees
     */
    func rotate(angle angle: CGFloat) {
        let radians = angle / 180.0 * CGFloat.pi
        let rotation = CGAffineTransformRotate(self.transform, radians);
        self.transform = rotation
    }

}

Auf diese Weise überall in Ihrem Code:

let view = UIView(frame: CGRectMake(0, 0, 100, 100))
view.backgroundColor = UIcolor.redColor()
view.rotate(angle: 90)
20
Luca Davanzo

Die CGAffineTransformRotate-Transformation dreht sich aus einer vorhandenen affinen Transformation. Die Tatsache, dass Sie CGAffineTransformIdentity verwenden, könnte das Problem sein. Sie müssen die aktuelle Transformation Ihrer Ansicht angeben.

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
...
double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(self.arrowView.transform, rads);
self.arrowView.transform = transform;

Vielleicht möchten Sie auch Folgendes berücksichtigen:

self.arrowView.transform = CGAffineTransformMakeRotation(rads);

EDIT: Wenn möglich, teilen Sie mit, welche Art von Transformation (animiert/unbelebt, einzeln/iterativ) Sie erreichen möchten. Ich glaube, dass es einen besseren, optimierten Weg gibt, dies zu tun.

12
n00bProgrammer

Aktualisieren Sie die Antwort von Luca Davanzo mit Swift 4:

/**
 Rotate a view by specified degrees

 - parameter angle: angle in degrees
 */
func rotate(angle: CGFloat) {
    let radians = angle / 180.0 * CGFloat.pi
    let rotation = self.transform.rotated(by: radians)
    self.transform = rotation
}
12
Bill Chan

Versuchen Sie es mit diesem Code:

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
self.arrowView.layer.transform = CATransform3DMakeRotation(rads, 0, 0, 1);
5
Abhinav

Swift 5:

extension UIView {
    func setTransformRotation(toDegrees angleInDegrees: CGFloat) {
        let angleInRadians = angleInDegrees / 180.0 * CGFloat.pi
        let rotation = self.transform.rotated(by: angleInRadians)
        self.transform = rotation
    }
}
4
Sunkas

Auf Swift 3:

let degrees: CGFloat = -90
let radians = CGFloat(__sinpi(degrees.native/180.0))
view.transform = CGAffineTransform(rotationAngle: radians)

Ich verwende -90 wegen dieses bestimmten Teils der Dokumentation über die rotationAngle, die Sie an CGAffineTransform übergeben müssen:

Der Winkel im Bogenmaß, um den diese Matrix die Koordinate dreht Systemachsen. In iOS gibt ein positiver Wert entgegen dem Uhrzeigersinn an Drehung und ein negativer Wert gibt die Drehung im Uhrzeigersinn an.

1
Bruno Delgado

Meines Erachtens müssen Sie die Mitte Ihres Dreiecks berechnen und um diesen Punkt drehen. Jetzt drehen Sie den Pfeil um die Mitte Ihres Quadrats.

Siehe: Eine schrittweise affine Transformation für die Rotation um einen Punkt?

Ich hoffe es hilft dir.

0
Sauvage