旋转UIView围绕其中心保持其大小

时间:2014-01-26 23:34:34

标签: ios objective-c uiview rotation

我正在尝试旋转UIView几个弧度,但在应用变换之后,它看起来并不保持其大小。实现这个目标的正确方法是什么?

这就是我正在做的和我得到的(带箭头的蓝色框是我试图旋转的视图 - 它应该保持与红框背后相同的方面):

#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

谢谢!

10 个答案:

答案 0 :(得分:46)

除非必要,否则我会避免使用宏。这非常有效

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

答案 1 :(得分:25)

你可能遇到了Autolayout的问题。您可能对旋转视图有约束,将其固定到超视图的边缘。应用变换时,Autolayout正在更新视图的大小以仍适合超级视图。

您可以尝试不同的约束(例如,将视图的中心固定到另一个视图的中心,并将宽度和高度固定为常数值)或关闭旋转视图的Autolayout,或者,如果这些不是工作或不适合您的需求,使用在Autolayout下布局的容器视图,并将旋转视图添加到此,而不使用Autolayout。

这只能在代码中完成 - 您可以通过将translatesAutoresizingMasksIntoConstraints设置为NO(自动打开)或YES(自动关闭)来使个别视图服从Autolayout。如果将视图从一个视图切换到另一个视图,则需要设置相应的自动调整大小的掩码。

答案 2 :(得分:21)

Swift +扩展程序是您的朋友!

// 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
    }

}

通过这种方式,代码中的任何位置:

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

答案 3 :(得分:14)

用Swift 4更新Luca Davanzo的答案:

/**
 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
}

答案 4 :(得分:12)

CGAffineTransformRotate转换从现有的仿射变换旋转。您使用CGAffineTransformIdentity的事实可能是个问题。您必须指定视图的当前转换。

#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;

另外,您可能需要考虑:

self.arrowView.transform = CGAffineTransformMakeRotation(rads);

编辑:如果可以,请分享您想要实现的转换(动画/无生命,单一/迭代)。我相信可能有一种更好,更优化的方法。

答案 5 :(得分:6)

尝试使用此代码:

#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);

答案 6 :(得分:1)

在Swift 3上:

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

我使用-90,因为有关rotationAngle的文档的这一特定部分,您必须传递给CGAffineTransform

  

以弧度表示此矩阵旋转坐标的角度   系统轴。在iOS中,正值指定逆时针   旋转和负值指定顺时针旋转。

答案 7 :(得分:1)

迅速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
    }
}

答案 8 :(得分:0)

在我看来,你需要计算三角形的中心并围绕这一点旋转。现在你围绕广场的中心旋转箭头。

请参阅:One step affine transform for rotation around a point?

我希望它会对你有所帮助。

答案 9 :(得分:0)

Swift5

上下颠倒旋转UIView

let degrees:CGFloat = -180 //angle to convert upside down
rotatingUI.transform = CGAffineTransform(rotationAngle: degrees * CGFloat(Double.pi)/180);