我有一个非常简单的UIImageView
它包含在容器视图中。它们大小相同,没有使用自动布局。当用户按下按钮时,UIImageView
应该旋转90度。当UIImageView
(不是UIImageView.image
)被旋转时,它应该适合其超视图(.ScaleAspectFit
)。 到目前为止,我已经想出了最简单的部分:转换旋转。如何在转换旋转后找到UIView的帧
self.currentRotation += 90
if self.currentRotation >= 360 {
self.currentRotation = 0
}
let angleInRadians: Double
switch self.currentRotation {
case 0:
angleInRadians = 0
case 90:
angleInRadians = M_PI_2
case 180:
angleInRadians = M_PI
case 270:
angleInRadians = M_PI + M_PI_2
default:
angleInRadians = 0
break;
}
let newTransform = CGAffineTransformRotate(CGAffineTransformIdentity, CGFloat(angleInRadians))
通过获得来自this question一些信息,我能写帮手扩展斯威夫特版本,但我仍然无法弄清楚如何找到的UIImageView的框架。
extension UIView {
var originalFrame: CGRect {
let currentTransform = self.transform
self.transform = CGAffineTransformIdentity
let originalFrame = self.frame
self.transform = currentTransform
return originalFrame
}
var transformedTopLeftPoint: CGPoint {
return self.transformedPointForOriginalPoint(originalFrame.topLeftPoint)
}
var transformedTopRightPoint: CGPoint {
return self.transformedPointForOriginalPoint(originalFrame.topRightPoint)
}
var transformedBottomLeftPoint: CGPoint {
return self.transformedPointForOriginalPoint(originalFrame.bottomLeftPoint)
}
var transformedBottomRightPoint: CGPoint {
return self.transformedPointForOriginalPoint(originalFrame.bottomRightPoint)
}
// helper to get point offset from center
func centerOffset(point: CGPoint) -> CGPoint {
return CGPoint(x: point.x - self.center.x, y: point.y - self.center.y)
}
// helper to get point back relative to center
func pointRelativeToCenter(point: CGPoint) -> CGPoint {
return CGPoint(x: point.x + self.center.x, y: point.y + self.center.y)
}
// helper to get point relative to transformed coords
func transformedPointForOriginalPoint(point: CGPoint) -> CGPoint {
// get offset from center
let offset = self.centerOffset(point)
// get transformed point
let transformedPoint = CGPointApplyAffineTransform(offset, self.transform)
// make relative to center
return self.pointRelativeToCenter(transformedPoint)
}
}
extension CGRect {
var topLeftPoint: CGPoint {
return self.origin
}
var topRightPoint: CGPoint {
return CGPoint(x: self.origin.x + self.size.width, y: self.origin.y)
}
var bottomLeftPoint: CGPoint {
return CGPoint(x: self.origin.x, y: self.origin.y + self.size.height)
}
var bottomRightPoint: CGPoint {
return CGPoint(x: self.origin.x + self.size.width, y: self.origin.y + self.size.height)
}
}
为了更好的阐明,我附上了一张图片。
它显示了在其原始帧(最小的 轮廓)和更新的帧(最大灰色轮廓)的顶部上的旋转视图。 圆圈表示在 之前和之后的视图的右上角。在应用变换之后,该帧将更新到围绕该视图的最小边界框 。它的新来源(灰色外框左上角的 )基本上与原始视图原点(黑色 未旋转的内框的左上角) 无关。 iOS不提供检索该调整点的方法。以下是一系列为您执行数学运算的视图方法。 (上面的UIView扩展名)
我需要找到灰框的框架。但即使采用这些方法,我仍然无法弄清楚如何做到这一点。什么是公式/算法来实现我想要的?
简单。转换后的视图框架是该视图的边界框。所以只需使用框架。 – kirander
@kirander但是,根据文档,当你设置一个自定义转换为UIView,框架属性变得不确定,不应该使用。 – xinatanil
是的,这是真的,但提示是转换视图的框架描述最小的边界矩形。为什么不使用这个? – kirander