如何在变换旋转后找到UIView的帧

时间:2015-11-02 12:08:32

标签: ios swift uiview uiimageview cgaffinetransform

我有一个非常简单的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))

为了更好地澄清,我附上了一张图片。

image for better understanding

  

它显示了原始帧顶部的旋转视图(最小的一个)   轮廓)和更新的框架(最大的灰色轮廓)。该   圆圈表示视图前后的右上角   回转。应用转换后,框架将更新为   封闭视图的最小边界框。它的新起源(   灰色外框的左上角)基本上没什么关系   与原始视图原点(黑色的左上角)   未旋转的内盒)。 iOS没有提供检索它的方法   调整点。以下是一系列执行该操作的视图方法   数学为你。 (上面的UIView扩展名)

我需要找到灰盒子的框架。但即使使用这些方法,我仍然无法弄清楚如何做到这一点。什么是实现我想要的公式/算法?

2 个答案:

答案 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;