2016-08-17 10 views
2

複数のUILabelsのUIVewコンテナが生成され、回転してこのビューに配置されます。角度0、90、180、270を使用していても、ランダムに配置されたUILabelの回転後のサイズが正しくない

- (void) generate:(UIView *)container 
      words:(NSArray *)words 
      colors:(NSArray *)colors 
     minFontSize:(float)minSize 
     maxFontSize:(float)maxSize 
     rotateWords:(BOOL)rotate 
    useAngleRange:(BOOL)useRange 
{ 
    usingRange = useRange; 
    for (int i = 0; i < [words count]; i++) { 
     UILabel *word_l = [[UILabel alloc] init]; 
     word_l.font = [UIFont fontWithName:@"EuropeBold" size:[self getRandomNumberBetween:minSize to:(i < probableBigFontWords) ? maxSize : (maxSize/3)]]; 
     [word_l setText:words[i]]; 
     [word_l setTextColor:colors[arc4random_uniform([colors count])]]; 
     [word_l setBackgroundColor:[UIColor clearColor]]; 
     [word_l sizeToFit]; 

     CGRect fr = CGRectMake(0, 
           0, 
           word_l.frame.size.width, 
           word_l.frame.size.height); 
     word_l.frame = fr; 
     word_l.center = CGPointMake([self getRandomNumberBetween:175 to:639], [self getRandomNumberBetween:175 to:375]); 
     if (rotate) { 
      int angleType = arc4random_uniform(2); 
      if (useRange) { 
       int angle = (angleType == 1) ? [self getRandomNumberBetween:0 to:90] : [self getRandomNumberBetween:270 to:360]; 
       [word_l setTransform:CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(angle))]; 
      } else { 
       [word_l setTransform:CGAffineTransformMakeRotation((angleType == 1) ? DEGREES_TO_RADIANS(270) : DEGREES_TO_RADIANS(360))]; 
      } 
     } 
     [container addSubview:word_l]; 
     while ([self viewIntersectsWithAnotherView:container chosenView:word_l]) { 
      viewPositionMovingStep++; 
      [self placeItem:container :word_l]; 
     } 
    } 
} 

- (void)placeItem:(UIView *)container :(UILabel *)word_l 
{ 
    CGRect initFr = word_l.frame; 
    for (int i = 1; i <= 8; i++) { 
     CGRect f = word_l.frame; 
     switch (i) { 
      case 1: 
       f.origin.x = f.origin.x + viewPositionMovingStep; 
       break; 
      case 2: 
       f.origin.x = f.origin.x + viewPositionMovingStep; 
       f.origin.y = f.origin.y + viewPositionMovingStep; 
       break; 
      case 3: 
       f.origin.y = f.origin.y + viewPositionMovingStep; 
       break; 
      case 4: 
       f.origin.x = f.origin.x - viewPositionMovingStep; 
       f.origin.y = f.origin.y + viewPositionMovingStep; 
       break; 
      case 5: 
       f.origin.x = f.origin.x - viewPositionMovingStep; 
       break; 
      case 6: 
       f.origin.x = f.origin.x - viewPositionMovingStep; 
       f.origin.y = f.origin.y - viewPositionMovingStep; 
       break; 
      case 7: 
       f.origin.y = f.origin.y - viewPositionMovingStep; 
       break; 
      case 8: 
       f.origin.x = f.origin.x + viewPositionMovingStep; 
       f.origin.y = f.origin.y - viewPositionMovingStep; 
       break; 
      default: 
       break; 
     } 
     word_l.frame = f; 
     if ([self viewIntersectsWithAnotherView:container chosenView:word_l]) { 
      word_l.frame = initFr; 
     } else { 
      viewPositionMovingStep = 0; 
      return; 
     } 
    } 
} 

-(BOOL)viewIntersectsWithAnotherView:(UIView *)container chosenView:(UIView *)chosenView 
{ 
    for(UIView *view in [container subviews]){ 
     if (![chosenView isEqual:view]){ 
      BOOL framePartiallyOut = !CGRectEqualToRect(CGRectIntersection(chosenView.superview.bounds, chosenView.frame), chosenView.frame); 
      if (usingRange) { 
       if([self view:chosenView intersectsWith:view] || framePartiallyOut){ 
        return YES; 
       } 
      } else { 
       if(CGRectIntersectsRect(chosenView.frame, view.frame) || framePartiallyOut){ 
        return YES; 
       } 
      } 
     } 
    } 
    return NO; 
} 

- (BOOL)view:(UIView *)view1 intersectsWith:(UIView *)view2 
{ 
    CGPoint poly1[4]; 
    CGRect bounds1 = view1.bounds; 
    poly1[0] = [view1 convertPoint:bounds1.origin toView:nil]; 
    poly1[1] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y) toView:nil]; 
    poly1[2] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y + bounds1.size.height) toView:nil]; 
    poly1[3] = [view1 convertPoint:CGPointMake(bounds1.origin.x, bounds1.origin.y + bounds1.size.height) toView:nil]; 

    CGPoint poly2[4]; 
    CGRect bounds2 = view2.bounds; 
    poly2[0] = [view2 convertPoint:bounds2.origin toView:nil]; 
    poly2[1] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y) toView:nil]; 
    poly2[2] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y + bounds2.size.height) toView:nil]; 
    poly2[3] = [view2 convertPoint:CGPointMake(bounds2.origin.x, bounds2.origin.y + bounds2.size.height) toView:nil]; 

    CGPoint ctl2 = [view1 convertPoint:poly2[0] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, ctl2)){ 
     return YES; 
    } 
    CGPoint ctr2 = [view1 convertPoint:poly2[1] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, ctr2)){ 
     return YES; 
    } 
    CGPoint cbr2 = [view1 convertPoint:poly2[2] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, cbr2)){ 
     return YES; 
    } 
    CGPoint cbl2 = [view1 convertPoint:poly2[3] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, cbl2)){ 
     return YES; 
    } 
    CGPoint ctl1 = [view2 convertPoint:poly1[0] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, ctl1)){ 
     return YES; 
    } 
    CGPoint ctr1 = [view2 convertPoint:poly1[1] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, ctr1)){ 
     return YES; 
    } 
    CGPoint cbr1 = [view2 convertPoint:poly1[2] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, cbr1)){ 
     return YES; 
    } 
    CGPoint cbl1 = [view2 convertPoint:poly1[3] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, cbl1)){ 
     return YES; 
    } 
    return NO; 
} 

-(int)getRandomNumberBetween:(int)from to:(int)to 
{ 
    return (int)from + arc4random() % (to-from+1); 
} 

この方法を右に置い見えるラベル:拡大、および単語が非常に近いと交差せずに配置する必要がありますので、これは私にとっては問題であり、これはどのように発電機を探します

well transformed subviews

とこの例では、ランダムに生成された角度(範囲270から360、0〜90)との短い単語:

enter image description here

あなたが気づいているように、そこに示すテキストが、ルックスにラベルを付けていない拡張し、交差点チェッカーは、この場合には動作しませんまた、viewDidLoadまたはviewDidApperから呼び出された関数がこのチェッカーがまったく動作していない場合、私は本当に助けを必要としますか? ありがとうございました!

+0

交差点をチェックしているときにランダムな値が衝突していると思います。まだラベルが表示されない理由を把握することはできません。 –

+0

@Mahesh Agrawalaしかし、ラベルの幅はどうですか? 3 - 4のシンボルが含まれていても長すぎます – Eugene

+0

"label.transform = CGAffineTransformIdentity;"を使用すると、すべてのラベルのタグを設定して回転位置をリセットできますフレームラベル –

答えて

0

リサイズ問題は、このように修正されました:

- (void)placeItem:(UIView *)container :(UILabel *)word_l 
{ 
    CGPoint initPoint = word_l.center; 
    for (int i = 1; i <= 8; i++) { 
     switch (i) { 
      case 1: 
       word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y); 
       break; 
      case 2: 
       word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y + viewPositionMovingStep); 
       break; 
      case 3: 
       word_l.center = CGPointMake(word_l.center.x, word_l.center.y + viewPositionMovingStep); 
       break; 
      case 4: 
       word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, word_l.center.y + viewPositionMovingStep); 
       break; 
      case 5: 
       word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, word_l.center.y); 
       break; 
      case 6: 
       word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, - viewPositionMovingStep); 
       break; 
      case 7: 
       word_l.center = CGPointMake(word_l.center.x, word_l.center.y - viewPositionMovingStep); 
       break; 
      case 8: 
       word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y - viewPositionMovingStep); 
       break; 
      default: 
       break; 
     } 
     if ([self viewIntersectsWithAnotherView:container chosenView:word_l]) { 
      word_l.center = initPoint; 
     } else { 
      viewPositionMovingStep = 0; 
      return; 
     } 
    } 
} 

理由は次のとおりです。 あなたは、フレームを変更することで、位置を変更することはできませんtransformプロパティを使用するときは、中央のプロパティを使用する必要があります。

この部分は固定されていましたが、回転したビューの交差に関連する問題が残されていました。チェッカーは正しく機能していません。

そこに彼は次のとおりです。

- (BOOL)view:(UIView *)view1 intersectsWith:(UIView *)view2 
{ 
    CGPoint poly1[4]; 
    CGRect bounds1 = view1.bounds; 
    poly1[0] = [view1 convertPoint:bounds1.origin toView:nil]; 
    poly1[1] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y) toView:nil]; 
    poly1[2] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y + bounds1.size.height) toView:nil]; 
    poly1[3] = [view1 convertPoint:CGPointMake(bounds1.origin.x, bounds1.origin.y + bounds1.size.height) toView:nil]; 

    CGPoint poly2[4]; 
    CGRect bounds2 = view2.bounds; 
    poly2[0] = [view2 convertPoint:bounds2.origin toView:nil]; 
    poly2[1] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y) toView:nil]; 
    poly2[2] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y + bounds2.size.height) toView:nil]; 
    poly2[3] = [view2 convertPoint:CGPointMake(bounds2.origin.x, bounds2.origin.y + bounds2.size.height) toView:nil]; 

    CGPoint ctl2 = [view1 convertPoint:poly2[0] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, ctl2)){ 
     return YES; 
    } 
    CGPoint ctr2 = [view1 convertPoint:poly2[1] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, ctr2)){ 
     return YES; 
    } 
    CGPoint cbr2 = [view1 convertPoint:poly2[2] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, cbr2)){ 
     return YES; 
    } 
    CGPoint cbl2 = [view1 convertPoint:poly2[3] fromView:nil]; 
    if (CGRectContainsPoint(view1.bounds, cbl2)){ 
     return YES; 
    } 
    CGPoint ctl1 = [view2 convertPoint:poly1[0] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, ctl1)){ 
     return YES; 
    } 
    CGPoint ctr1 = [view2 convertPoint:poly1[1] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, ctr1)){ 
     return YES; 
    } 
    CGPoint cbr1 = [view2 convertPoint:poly1[2] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, cbr1)){ 
     return YES; 
    } 
    CGPoint cbl1 = [view2 convertPoint:poly1[3] fromView:nil]; 
    if (CGRectContainsPoint(view2.bounds, cbl1)){ 
     return YES; 
    } 
    return NO; 
} 

誰かのアイデア?

関連する問題