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

标签 ios objective-c uiview rotation

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

enter image description here

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

更新

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

我包含了两个版本的转换语句及其生成的旋转 UIView。左边的结果使用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];
   }

最佳答案

问题是您计算每个 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/

相关文章:

SwiftUI - PageView - 在不同的 View 中传递

ios - 在 iPhone 应用程序中绘制/动画此场景的最佳方式

ios - 如何通过 UIViewController(Swift,iOS 9)检测屏幕事件

ios - 如何在 Swift 和 Alamofire 中将对象映射到对象内部的数组中

objective-c - iOS 运行时未调用 SDCAlertView 回调 clickButtonAtIndex

ios - Cocos2D/iOS7 : continuously increasing memory usage for boilerplate code

ios - SKLabelNode 在 SKSpriteNode 后面绘制

ios - 在 64 位应用程序中使用 32 位库

ios - 无法在 iPad 上录制 : Error Domain=NSOSStatusErrorDomain Code=1718449215 "(null)"

swift - 使用 tvOS 实现基本动画