2013-08-01 56 views
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_ = [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個圓形視圖,標籤上沒有標籤的文字轉換。任何人都可以請幫我解決這個問題嗎?製作16個uilabel並將它們對齊在圓形路徑中。

+1

你的文字如何轉換?你想實現什麼? 如果你不想讓文字旋轉,只需刪除這一行view.transform = CGAffineTransformRotate(view.transform,curAngle); –

+0

Thanx的建議.....其工作正常現在 –

回答

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!

+0

Thanx瑜伽......它的工作! –

0

在循環中相應地設置它們的中心,不要旋轉它們,也不要旋轉它們的超級視圖。

下不直接關係到你的問題,但可能會有所幫助:

Aparaently你已經得到了所有的數學可用。我建議測量cos和sin等電話的CPU時間損失多少。如果你發現那麼重要,那就考慮一下你的算法吧。你將(最有可能)發現你在有限的角度上稱爲cos和罪的hundrets或數千次。 然後,您可以嘗試它並發現可能的預計算或者「緩存和重用」,以前的結果可能會節省大量的處理時間。

加上預先計算或緩存的竇將做。您可以通過向參數添加(或分別減去)pi/2(或分別爲90度)的偏移量來從竇(反之亦然)驅動餘弦值。

對於類似的任務,我正在與度(不輻射)工作,並發現我無法預測角度,但一個顯着的完整度(1°,2°,3°,...之間沒有任何關係)足夠完成這份工作。然後我維護了一個360個正弦值的數組,並用它來代替一次又一次地調用真正的函數。 (另外,我只需要計算其中的90個,並根據竇功能的性質反映其他270度的結果)。與我獲得的速度相比,180個浮點並不是太多的記憶。類似的東西也可以適合你。在你的情況下,你對sin和cos的潛在影響僅限於incAngle的全數乘法器。

這意味着每個潛在值只有[views count]