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

how do I make the base of each UIView a tangent to a circle so they radiate from the centre?

我试图找到一系列明暗矩形的旋转角度 UIViews 放置在圆周上的规则点。圆上的每个点都被计算为距中心的位移角度,我尝试使用相同的角度旋转每个 UIView 以使其从中心辐射。但是没想到是这个样子

我希望每个新 UIView 的中心位移角度与旋转角度相同。这个假设是否正确?如果是这样,我如何使每个 UIView 的底与圆相切,以便它们从中心辐射?

更新

如果有人发现它有用,请更新我的原始代码。问题 已更正。

我包含了两个版本的转换语句及其生成的旋转 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 弧度)旋转,所以矩形 "sticks out" 来自圆。

您需要进行两处小改动才能使您的代码正常工作:

将循环更改为:

for (int i = 0; i < miniViewCount; i++)

并更改变换:

miniView.transform = CGAffineTransformRotate(miniView.transform, radians + arcStart + M_PI / 2.0);