2016-08-17 4 views
2

Haben einen UIVew Container für mehrere UILabels zufällig generiert, gedreht und platziert in dieser Ansicht, auch wenn ich Winkel 0, 90, 180, 270 verwendet sieht gut aus, aber wenn Winkel zufällig generierte Etiketten aussieht erweitert, und das ist für mich Problem, weil Worte sehr nahe gelegt werden sollen und ohne Kreuzung, das sieht wie Generator:Zufällig platziert UILabel hat falsche Größe nach der Drehung

- (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); 
} 

diese, wie richtig platziert Etiketten aussieht:

well transformed subviews

und Dieses Beispiel kurzes Wort mit zufällig erzeugten Winkel (Bereich 270-360, 0-90):

enter image description here

wie Sie vielleicht bemerkt haben, gibt es keinen Text zeigt, sieht Etiketten erweitert und Schnittprüfung funktioniert nicht in diesem Fall , auch wenn die Funktion von viewDidLoad oder viewDidApper aufgerufen wird funktioniert diese Checkers überhaupt nicht, brauche ich wirklich Hilfe, irgendwelche Ideen Jungs? Vielen Dank!

+0

Ich denke, zufällige Werte kollidieren, wenn Sie nach Schnittpunkten suchen. aber immer noch nicht in der Lage herauszufinden, warum kein Etikett angezeigt wird. –

+0

@Mahesh Agrawala aber wie wäre es mit Etikettenbreite? sie sehen zu lang aus, selbst wenn sie 3-4 Symbole enthalten – Eugene

+0

können Sie das Tag für jedes Label setzen und die Rotationsposition zurücksetzen, die "label.transform = CGAffineTransformIdentity;" und setze das Rahmenlabel zurück –

Antwort

0

Ändern der Größe Problem behoben wurde auf diese Weise:

- (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; 
     } 
    } 
} 

der Grund ist: Wenn die Eigenschaft-Transformation Sie sind nicht erlaubt, die Position zu ändern, indem Sie den Rahmen zu ändern, müssen Sie das Zentrum Eigenschaft verwenden.

Also dieser Teil wurde behoben, aber links Problem mit gedrehten Ansicht Schnittpunkt, Checker funktioniert nicht richtig, aber testet es separat in anderen Projekt es gut geht.

Da ist er:

- (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; 
} 

jemand Ideen?

Verwandte Themen