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个圆形视图,标签上没有标签的文字转换。有人可以帮我解决这个问题吗?
答案 0 :(得分: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!
答案 1 :(得分:0)
在循环中相应地设置它们的中心,不要旋转它们,也不要旋转它们的超视图。
以下内容与您的问题没有直接关系,但可能会有所帮助:
你可以得到所有数学资料。我建议测量在cos和sin等调用中丢失多少CPU时间。如果您发现重要,那么请考虑您的算法。你(很可能)会发现你在有限的角度内称为cos和sin hundrets或数千次。 然后,您可以尝试并发现可能的预计算或只是“缓存和重用”早期结果可能会节省大量处理时间。
加上预先计算或缓存窦会这样做。您可以通过向参数添加(或分别减去)pi / 2(或分别为90度)的偏移量来从正弦(或反之亦然)中驱除余弦值。
对于类似的任务我正在使用度数(不是辐射)并且发现我无法预测角度但是显着的全度(1°,2°,3°,......之间没有任何东西)对于这份工作来说已经足够了。然后我维护了360个正弦值的数组并使用它而不是一次又一次地调用实数函数。 (另外我只需要计算其中的90个,并根据窦功能的性质反映其他270度的结果)与我获得的速度相比,180浮动并不是太多的记忆。这样的东西也适合你。在你的情况下,你对sin和cos的潜在限制仅限于incAngle的全数乘法器。
这意味着每个潜在值只有[views count]
个。