如何让每个UIView的底部与圆相切,使它们从中心辐射?

时间:2018-01-22 05:10:47

标签: ios objective-c uiview rotation

我正在尝试找到放置在圆周边的常规点上的一系列明暗矩形UIViews的旋转角度。圆上的每个点都计算为距离中心的位移角度,我尝试使用相同的角度旋转每个UIView,使其从中心辐射出来。但我并不认为它看起来像这样。

enter image description here

我预计从中心的位移角度与每个新UIView的旋转角度相同。这个假设是否正确?如果是这样,我如何使每个UIView的基点成为圆的切线,使它们从中心辐射出来?

更新

如果有人发现它有用,请更新我的原始代码。问题as explained by rmaddy已得到纠正。

我已经包含了两个版本的transform语句及其生成的旋转UIViews。左侧的结果使用radians + arcStart + M_PI / 2.0,右侧的结果使用radians + arcStart

enter image description here

这是方法。

- (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];
   }

}

1 个答案:

答案 0 :(得分:1)

问题是您对每个miniView中心的计算基于radiansarcStart,但每个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);