Die*_*sta 51 objective-c rotation uiview ios
我正在尝试旋转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;
Run Code Online (Sandbox Code Playgroud)

谢谢!
Sha*_*ssy 48
除非必要,否则我会避免使用宏.这非常有效
float degrees = 20; //the value in degrees
view.transform = CGAffineTransformMakeRotation(degrees * M_PI/180);
Run Code Online (Sandbox Code Playgroud)
jrt*_*ton 27
你可能会遇到Autolayout的问题.您可能对旋转视图有约束,将其固定到超视图的边缘.应用变换时,Autolayout正在更新视图的大小以仍适合超级视图.
您可以尝试不同的约束(例如,将视图的中心固定到另一个视图的中心,并将宽度和高度固定为常量值)或关闭旋转视图的Autolayout,或者,如果这些不起作用或不要不适合您的需求,使用在Autolayout下布局的容器视图,并将旋转视图添加到此,而不使用Autolayout.
这只能在代码中完成 - 您可以通过设置translatesAutoresizingMasksIntoConstraints为NO(Autolayout on)或YES(Autolayout off)使个别视图服从Autolayout .如果将视图从一个视图切换到另一个视图,则需要设置相应的自动调整大小的掩码.
Luc*_*nzo 26
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
}
}
Run Code Online (Sandbox Code Playgroud)
这样,代码中的任何位置:
let view = UIView(frame: CGRectMake(0, 0, 100, 100))
view.backgroundColor = UIcolor.redColor()
view.rotate(angle: 90)
Run Code Online (Sandbox Code Playgroud)
Bil*_*han 19
用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
}
Run Code Online (Sandbox Code Playgroud)
n00*_*mer 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;
Run Code Online (Sandbox Code Playgroud)
另外,您可能需要考虑:
self.arrowView.transform = CGAffineTransformMakeRotation(rads);
Run Code Online (Sandbox Code Playgroud)
编辑:如果可以的话,分享你想要实现的那种转换(动画/无生命,单一/迭代).我相信可能有更好,更优化的方式来做到这一点.
斯威夫特 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
}
}
Run Code Online (Sandbox Code Playgroud)
试试这段代码:
#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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61006 次 |
| 最近记录: |