围绕其中心旋转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
因为有关您要传递给CGAffineTransform
的rotationAngle
文档的这个特定部分:
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 }