我正在尝试为放置在圆周上的规则点上的一系列浅色和深色矩形 UIViews
找到旋转角度。圆上的每个点都计算为距中心的位移角度,我尝试使用相同的角度旋转每个 UIView
以使其从中心辐射。但是没想到是这个样子。
我希望每个新 UIView
的中心位移角度与旋转角度相同。这个假设是否正确?如果是这样,我如何使每个 UIView
的底部与圆相切,以便它们从中心向外辐射?
更新
如果有人发现它有用,请更新我的原始代码。问题as explained by rmaddy已整改。
我包含了两个版本的转换语句及其生成的旋转 UIView。左边的结果使用radians + arcStart + M_PI/2.0
,右边的结果使用radians + arcStart
。
这是方法。
- (void)sprocket
{
CGRect canvas = [UIScreen mainScreen].bounds;
CGPoint circleCentre = CGPointMake((canvas.size.width)/2, (canvas.size.height)/2);
CGFloat width = 26.0f;
CGFloat height = 50.0f;
CGPoint miniViewCentre;
CGFloat circleRadius = 90;
int miniViewCount = 16;
for (int i = 0; i < miniViewCount; i++)
{
// to place the next view calculate angular displacement along an arc
CGFloat circumference = 2 * M_PI;
CGFloat radians = circumference * i / miniViewCount;
CGFloat arcStart = M_PI + 1.25f; // start circle from this point in radians;
miniViewCentre.x = circleCentre.x + circleRadius * cos(radians + arcStart);
miniViewCentre.y = circleCentre.y + circleRadius * sin(radians + arcStart);
CGPoint placeMiniView = CGPointMake(miniViewCentre.x, miniViewCentre.y);
CGRect swivellingFrame = CGRectMake(placeMiniView.x, placeMiniView.y, width, height);
UIView *miniView = [[UIView alloc] initWithFrame:swivellingFrame];
if ((i % 2) == 0)
{
miniView.backgroundColor = [UIColor darkGrayColor];
}
else
{
miniView.backgroundColor = [UIColor grayColor];
}
miniView.layer.borderWidth = 1;
miniView.layer.borderColor = [UIColor blackColor].CGColor;
miniView.layer.cornerRadius = 3;
miniView.clipsToBounds = YES;
miniView.layer.masksToBounds = YES;
miniView.alpha = 1.0;
// using the same angle rotate the view around its centre
miniView.transform = CGAffineTransformRotate(miniView.transform, radians + arcStart + M_PI / 2.0);
[page1 addSubview:miniView];
}
最佳答案
问题是您计算每个 miniView 的中心是基于 radians
加上 arcStart
但每个 miniView 的转换仅基于 radians
.
另请注意,角 0
位于圆的 3 点钟位置。实际上,您需要 miniView
旋转 90°(或 π/2 弧度),以便矩形从圆圈中“突出”。
您需要做两个小改动才能使您的代码正常工作:
将循环更改为:
for (int i = 0; i < miniViewCount; i++)
并改变变换:
miniView.transform = CGAffineTransformRotate(miniView.transform, radians + arcStart + M_PI / 2.0);
关于ios - 如何使每个 UIView 的底部与圆相切,以便它们从中心辐射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48375003/