如何使每个 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);
我试图找到一系列明暗矩形的旋转角度 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);