我想自动化许多具有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应该是圆形的,应该缩放到足以使圆形边缘不可见 - 它需要缩放到屏幕之外以填充角落处的那些间隙。
答案 0 :(得分:7)
从概念上讲,您希望将圆圈置于屏幕中心,然后对其进行缩放,以便将屏幕矩形刻在圆圈中。这是一个方便的图表:
从屏幕中央,我们可以在角落画一个三角形。该三角形的斜边是您想要的圆半径。以下是转换圈子的代码:
[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);
}];