Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 随机放置的UILabel在旋转后大小错误_Ios_Objective C_Uilabel_Sizetofit_Text Rotation - Fatal编程技术网

Ios 随机放置的UILabel在旋转后大小错误

Ios 随机放置的UILabel在旋转后大小错误,ios,objective-c,uilabel,sizetofit,text-rotation,Ios,Objective C,Uilabel,Sizetofit,Text Rotation,为随机生成、旋转并放置在此视图中的多个UIVew标签准备一个UIVew容器,如果我使用角度0、90、180、270看起来不错,但是如果角度随机生成的标签看起来扩展了,这对我来说是个问题,因为单词应该放得非常近,并且没有交叉,这看起来如何生成器: - (void) generate:(UIView *)container words:(NSArray *)words colors:(NSArray *)colors minFontSize:

为随机生成、旋转并放置在此视图中的多个UIVew标签准备一个UIVew容器,如果我使用角度0、90、180、270看起来不错,但是如果角度随机生成的标签看起来扩展了,这对我来说是个问题,因为单词应该放得非常近,并且没有交叉,这看起来如何生成器:

- (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);
}
-(void)生成:(UIView*)容器
单词:(NSArray*)单词
颜色:(NSArray*)颜色
minFontSize:(浮动)minSize
maxFontSize:(浮点)maxSize
rotateWords:(BOOL)旋转
useAngleRange:(BOOL)用户范围
{
usingRange=useRange;
for(int i=0;i<[字数];i++){
UILabel*word_l=[[UILabel alloc]init];
word_l.font=[UIFont fontWithName:@“EuropeBold”大小:[self-getRandomNumberBetween:minSize to:(i对于(int i=1;i大小调整问题通过以下方式解决:

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

有人有想法吗?

我想,当你检查交叉点时,随机值会发生冲突。但仍然无法找出为什么不显示标签。@Mahesh Agrawala但标签的宽度如何?它们看起来太长,即使包含3-4个符号。你能为每个标签设置标签并重置用于显示的旋转位置吗“label.transform=CGAffineTransformIdentity;”并重置帧label@HariKrishnan.P下面是我的答案,不过还是谢谢你的帮助。
- (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;
}