1
NSMutableArray *views = [[NSMutableArray alloc]initWithCapacity:0];

    for (NSInteger i = 0; i<16; i++)
    {
        UIView *circle = [[UIView alloc]init];
        circle.backgroundColor = [UIColor clearColor];
        UIImageView *circleImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 80, 80)];
        circleImage.image = [UIImage imageNamed:@"circle"];
        [circle addSubview:circleImage];
        UILabel *labelInsideCircle = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 40)];
        labelInsideCircle.backgroundColor = [UIColor clearColor];
        labelInsideCircle.textColor = [UIColor greenColor];
        labelInsideCircle.font = [UIFont fontWithName:@"Helvetica" size:30.0];
        labelInsideCircle.center = circleImage.center;
        NSInteger int_ = [self getRandomNumber:0 to:(arrOfOptions.count-1)];
        labelInsideCircle.text = [NSString stringWithFormat:@"%@",[arrOfOptions objectAtIndex:int_]];
        labelInsideCircle.textAlignment = NSTextAlignmentCenter;
        [arrOfOptions removeObjectAtIndex:int_];
        [circle addSubview:labelInsideCircle];
        [labelInsideCircle release];
        [views addObject:circle];
        [circle release];
        [circleImage release];
    }


    /* Rotating circles with angles  */

    float curAngle = 0;
    float incAngle = ( 360.0/(views.count) )*3.14/180.0;
    CGPoint circleCenter = CGPointMake(380, 580); /* given center */
    float circleRadius = 250; /* given radius */
    for (UIView *view in views)
    {
        CGPoint viewCenter;
        viewCenter.x = circleCenter.x + cos(curAngle)*circleRadius;
        viewCenter.y = circleCenter.y + sin(curAngle)*circleRadius;
        view.transform = CGAffineTransformRotate(view.transform, curAngle);
        view.center = viewCenter;
        [self.view addSubview:view];

        curAngle += incAngle;
    }

问题是这里的文本UILabel也在发生变化,这很明显。我想要的是 16 个带有标签的圆形视图,而没有转换标签的文本。谁能帮我解决这个问题?

4

2 回答 2

0

在这种情况下,您只需要更改它们的位置坐标,而不是旋转它们。

NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:0];

for (NSInteger i = 0; i<16; i++)
{
    UIView *circle = [[UIView alloc]init];
    circle.backgroundColor = [UIColor clearColor];
    UIImageView *circleImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 80, 80)];
    circleImage.image = [UIImage imageNamed:@"circle"];
    [circle addSubview:circleImage];
    UILabel *labelInsideCircle = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 40)];
    labelInsideCircle.backgroundColor = [UIColor clearColor];
    labelInsideCircle.textColor = [UIColor greenColor];
    labelInsideCircle.font = [UIFont fontWithName:@"Helvetica" size:30.0];
    labelInsideCircle.center = circleImage.center;
    NSInteger int_ = arc4random()%[arrOfOptions count];
    labelInsideCircle.text = [NSString stringWithFormat:@"%@",[arrOfOptions objectAtIndex:int_]];
    labelInsideCircle.textAlignment = NSTextAlignmentCenter;
    [arrOfOptions removeObjectAtIndex:int_];
    [circle addSubview:labelInsideCircle];
    [labelInsideCircle release];
    [views addObject:circle];
    [self.view addSubview:circle];
    [circle release];
    [circleImage release];
}


/* Rotating circles with angles  */

float curAngle = 0;
float incAngle = ( 360.0/(views.count) )*3.14/180.0;
CGPoint circleCenter = CGPointMake(380, 580); /* given center */
float circleRadius = 250; /* given radius */
for (UIView *view in views)
{
    CGPoint viewCenter;
    viewCenter.x = circleCenter.x + cos(curAngle)*circleRadius;
    viewCenter.y = circleCenter.y + sin(curAngle)*circleRadius;
    //view.transform = CGAffineTransformRotate(view.transform, curAngle);
    view.center = viewCenter;
    [self.view addSubview:view];

    curAngle += incAngle;
}

一些编码建议:如果您自己的随机数生成器中没有任何特殊内容,您可以使用 arc4random() 函数。您可以在 xCode 中打开 ARC!

于 2013-08-01T08:06:06.850 回答
0

在一个循环中相应地设置它们的中心,不要旋转它们也不要旋转它们的超级视图。

以下内容与您的问题没有直接关系,但可能会有所帮助:

Aparaently 你有所有可用的数学。我建议测量在 cos 和 sin 等调用上丢失了多少 cpu 时间。如果您发现这很重要,请考虑您的算法。你会(很可能)发现你在有限的角度上调用了数百次或数千次 cos 和 sin。然后您可以尝试并发现可能的预计算或只是“缓存和重用”早期结果可以节省大量的处理时间。

加上预先计算或缓存窦就可以了。您可以通过向参数添加(或分别减去)pi/2(或分别为 90 度)的偏移量,从 sinus 导出余弦值(反之亦然)。

对于类似的任务,我正在处理度数(不是辐射度),发现我无法预测角度,但是一个显着的完整度数(1°、2°、3°,......并且没有介于两者之间)是足够精确的为了工作。然后我维护了一个包含 360 个正弦值的数组,并使用它而不是一次又一次地调用真正的函数。(另外我只需要计算其中的 90 个,并根据 sinus 函数的性质镜像其他 270 度的结果)与我获得的速度相比,180 个浮点数并没有太多的内存。类似的东西也适合你。在您的情况下,您对 sin 和 cos 的潜在 agruments 仅限于 incAngle 的全数乘法器。

这意味着每个只有[views count]几个潜在值。

于 2013-08-01T10:32:34.610 回答