我有一个非常简单的Value
,它包含在容器视图中。它们大小相同,没有使用自动布局。当用户按下按钮时,UIImageView
应旋转90度。当UIImageView
(不是UIImageView
)轮换时,它应该适合其超级视图(UIImageView.image
)。
到目前为止,我已经找到了最简单的部分:转换旋转。
.ScaleAspectFit
通过从this question获取一些信息,我能够编写Swift版本的辅助扩展,但我仍然无法弄清楚如何找到UIImageView的框架。
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))
为了更好地澄清,我附上了一张图片。
它显示了原始帧顶部的旋转视图(最小的一个) 轮廓)和更新的框架(最大的灰色轮廓)。该 圆圈表示视图前后的右上角 回转。应用转换后,框架将更新为 封闭视图的最小边界框。它的新起源( 灰色外框的左上角)基本上没什么关系 与原始视图原点(黑色的左上角) 未旋转的内盒)。 iOS没有提供检索它的方法 调整点。以下是一系列执行该操作的视图方法 数学为你。 (上面的UIView扩展名)
我需要找到灰盒子的框架。但即使使用这些方法,我仍然无法弄清楚如何做到这一点。什么是实现我想要的公式/算法?
答案 0 :(得分:2)
转换视图的转换centre
保持不变。所以你需要根据中心来计算事物。像这样:
func originalFrame() -> CGRect {
CGAffineTransform currentTransform = self.transform;
self.transform = CGAffineTransformIdentity;
let originalFrame = self.frame;
self.transform = currentTransform;
return originalFrame;
}
func centerOffset(point:CGPoint) -> CGPoint {
return CGPointMake(point.x - self.center.x, point.y - self.center.y);
}
func pointRelativeToCenter(point:CGPoint) -> CGPoint {
CGPointMake(point.x + self.center.x, point.y + self.center.y);
}
func newPointInView(point:CGPoint) -> CGPoint {
let offset = self.centerOffset(point)
let transformedPoint = CGPointApplyAffineTransform(offset, self.transform);
return self.pointRelativeToCenter(transformedPoint)
}
func newTopLeft() -> CGPoint {
let frame = self.originalFrame()
return self.newPointInView(frame)
}
func newTopRight() -> CGPoint {
let frame = self.originalFrame()
var point = frame.origin
point.x = point.x + frame.size.width
return self.newPointInView(point)
}
func newBottomLeft() -> CGPoint {
let frame = self.originalFrame()
var point = frame.origin
point.y = point.y + frame.size.height
return self.newPointInView(point)
}
func newBottomRight() -> CGPoint {
let frame = self.originalFrame()
var point = frame.origin
point.x = point.x + frame.size.width
point.y = point.y + frame.size.height
return self.newPointInView(point)
}
有关详细信息,请参阅此SO Thread。
答案 1 :(得分:-1)
提示是变换视图的框架描述了最小边界矩形。你可以使用它。
// after transform
// obj-c
CGRect boundingBoxFrame = myTransformedImageView.frame;