繁体   English   中英

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

[英]Rotate UIView around its center keeping its size

我正在尝试将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;

在此处输入图片说明

谢谢!

除非必要,我避免使用宏。 这很好用

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

Swift + 扩展是你的朋友!

// MARK: - UIView Extension -

extension UIView {

    /**
     Rotate a view by specified degrees

     - parameter angle: angle in degrees
     */
    func rotate(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)

您可能遇到了 Autolayout 的问题。 您可能对旋转视图有限制,将其固定到超级视图的边缘。 应用转换后,Autolayout 会更新视图的大小以仍然适合超级视图。

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

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

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

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:

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

尝试使用此代码:

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

在 Swift 3 上:

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

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

此矩阵旋转坐标系轴的角度(以弧度为单位)。 在 iOS 中,正值指定逆时针旋转,负值指定顺时针旋转。

斯威夫特5

将 UIView 倒置

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

在我看来,您需要计算三角形的中心并围绕该点旋转。 现在您围绕正方形的中心旋转箭头。

请参阅: 绕点旋转的一步仿射变换?

我希望它会帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM