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

我试图旋转一个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; 

在这里输入图像说明

谢谢!

你可能会遇到Autolayout的问题。 你可能对旋转的视图有限制,将它固定到超视图的边缘。 当应用变换时,Autolayout将更新视图的大小,使其仍然适合超视图。

您可以尝试不同的约束条件(例如,将视图的中心固定到另一个视图的中心,并将宽度和高度固定为常量值),或closures旋转视图的Autolayout,或者如果这些操作不起作用不适合你的需求,使用Autolay下的容器视图,并添加你的旋转视图,而不使用Autolayout。

这只能在代码中完成 – 您可以通过将translatesAutoresizingMasksIntoConstraints设置为NO (Autolayout on)或YES (Autolayout off)来使单个视图受制于Autolayout。 如果将视图从一个视图切换到另一个视图,则需要设置适当的自动识别遮罩。

除非必要,我避免使用macros。 这工作得很好

 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 angle: CGFloat) { let radians = angle / 180.0 * CGFloat(M_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) 

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

编辑 :如果可以的话,分享你想要实现的转换(animation/无生,单/迭代)。 我相信这样做可能会有更好,更优化的方式。

试试这个代码:

 #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因为有关您要传递给CGAffineTransformrotationAngle文档的这个特定部分:

matrix以弧度表示的angular度旋转坐标系轴。 在iOS中,正值指定逆时针旋转,负值指定顺时针旋转。

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

请参阅: 围绕某个点旋转一步仿射变换?

我希望它会帮助你。

更新Luca Davanzo的回答Swift 4:

 /** Rotate a view by specified degrees - parameter angle: angle in degrees */ func rotate(angle: CGFloat) { let radians = angle / 180.0 * CGFloat(Double.pi) let rotation = self.transform.rotated(by: radians) self.transform = rotation }