我正在尝试找到放置在圆周边的常规点上的一系列明暗矩形UIViews
的旋转角度。圆上的每个点都计算为距离中心的位移角度,我尝试使用相同的角度旋转每个UIView
,使其从中心辐射出来。但我并不认为它看起来像这样。
我预计从中心的位移角度与每个新UIView
的旋转角度相同。这个假设是否正确?如果是这样,我如何使每个UIView
的基点成为圆的切线,使它们从中心辐射出来?
更新
如果有人发现它有用,请更新我的原始代码。问题as explained by rmaddy已得到纠正。
我已经包含了两个版本的transform语句及其生成的旋转UIViews。左侧的结果使用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];
}
}
答案 0 :(得分:1)
问题是您对每个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);