缩放圈uiview刚好足以填满屏幕

时间:2014-06-02 22:59:07

标签: ios cgaffinetransform

我想自动化许多具有cornerRadius设置的uiviews的比例因子,使它们看起来像圆圈。我们的想法是,这些20个不同大小和位置的圆形视图,无论大小,位置等都可以随时扩展以填充屏幕。

我的代码有一个硬编码值,我想让它变得聪明:

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.layer.affineTransform = CGAffineTransformMakeScale(15.0f, 15.0f);

} completion:^(BOOL finished) {
}];

是的 - 我可以在CGAffineTransformMakeScale中输入20,但是更大的圆圈无缘无故地缩放 - 他们可能需要缩放11。

将原始尺寸计算为固定的,更大尺寸的方法是什么?

注意:圆形uiview应该是圆形的,应该缩放到足以使圆形边缘不可见 - 它需要缩放到屏幕之外以填充角落处的那些间隙。

1 个答案:

答案 0 :(得分:7)

从概念上讲,您希望将圆圈置于屏幕中心,然后对其进行缩放,以便将屏幕矩形刻在圆圈中。这是一个方便的图表:

inscribed rect

从屏幕中央,我们可以在角落画一个三角形。该三角形的斜边是您想要的圆半径。以下是转换圈子的代码:

[UIView animateWithDuration:0.2 animations:^{

    CGPoint screenCenter = CGPointMake(CGRectGetMidX([UIScreen mainScreen].bounds), CGRectGetMidY([UIScreen mainScreen].bounds));
    CGPoint circleCenter = [self.window convertPoint:self.center fromView:self.superview];

    // Calculate distance from circle's current center to the screen center
    UIOffset offset = UIOffsetMake(screenCenter.x - circleCenter.x, screenCenter.y - circleCenter.y);

    // Calculate distance from screen center to corner
    CGFloat screenRadius = sqrtf(powf(CGRectGetWidth([UIScreen mainScreen].bounds) * 0.5, 2.0f)
                                 + powf(CGRectGetHeight([UIScreen mainScreen].bounds) * 0.5, 2.0f));
    CGFloat circleRadius = CGRectGetWidth(self.bounds) * 0.5;

    CGFloat scale = screenRadius / circleRadius;

    // Combine scale and translation
    CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scale, scale);
    CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(offset.horizontal, offset.vertical);
    self.transform = CGAffineTransformConcat(scaleTransform, translateTransform);
}];