2013-09-26 56 views
4

在iOS 6中,我使用的:动态调整标签在IOS 7

CGSize labelSize = [self.text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode]; 
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , labelSize.width, self.frame.size.height); 

动态调整一个UILabel。这并不在iOS的7工作,所以我尝试:

NSString *text = self.text; 
CGFloat width = size.width; 
UIFont *font = self.font; 
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text 
                   attributes:@{ NSFontAttributeName: font }]; 

CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
           options:NSStringDrawingUsesDeviceMetrics 
           context:nil]; 
CGSize size = rect.size; 

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , size.width, self.frame.size.height); 

这是一个的UILabel类里面,但是这是不是也工作... 任何想法,我应该使用?

+0

哪部分不工作?计算的框架尺寸是错误的,还是标签尺寸更改没有发生? – tarmes

回答

6

尝试是这样的(无自动布局工作):

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
                  [UIFont fontWithName:@"FontName" size:15], NSFontAttributeName, 
                  nil]; 

CGRect frame = [label.text boundingRectWithSize:CGSizeMake(263, 2000.0) 
                options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:attributesDictionary 
                context:nil]; 

CGSize size = frame.size; 
3

如果没有,为什么它不能正常工作更多的细节,我的猜测是,你需要使用的选项NSStringDrawingUsesLineFragmentOrigin,以便它要成为一个简易替换旧sizeWithFont:,像这样:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

请注意文档中提到:

在iOS 7及更高版本中,此方法返回小数大小(返回的CGRect的大小为 组件);要使用返回的大小来设置 的视图,则必须使用ceil函数将其值提高到最接近的较大整数 。

于是拔出计算的高度或宽度用于上浆的意见,我会用:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
+0

我试过这个...它不起作用... – user426132

+0

@ user426132帮我理解什么是不工作的。什么部分不是'sizeWithFont:'习惯的方式? –

1

这应该在iOS6的和iOS7工作,但会打破你的标签的限制(需要设置他们都回来了编程如果需要的话):

-(void)resizeHeightForLabel: (UILabel*)label { 
    label.numberOfLines = 0; 
    UIView *superview = label.superview; 
    [label removeFromSuperview]; 
    [label removeConstraints:label.constraints]; 
    CGRect labelFrame = label.frame; 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
     CGRect expectedFrame = [label.text boundingRectWithSize:CGSizeMake(label.frame.size.width, 9999) 
                 options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                   label.font, NSFontAttributeName, 
                   nil] 
                 context:nil]; 
     labelFrame.size = expectedFrame.size; 
     labelFrame.size.height = ceil(labelFrame.size.height); //iOS7 is not rounding up to the nearest whole number 
    } else { 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
     labelFrame.size = [label.text sizeWithFont:label.font 
           constrainedToSize:CGSizeMake(label.frame.size.width, 9999) 
            lineBreakMode:label.lineBreakMode]; 
#pragma GCC diagnostic warning "-Wdeprecated-declarations" 
    } 
    label.frame = labelFrame; 
    [superview addSubview:label]; 
} 

添加这个方法将你的viewController,并使用它像这样:

[self resizeHeightForLabel:myLabel]; 
//set new constraints here if needed 
+0

我需要调整宽度不是高度...我会给它一个去.. thx – user426132

+0

试试吧,我认为修改代码来调整宽度并不难。 –

+0

尝试过......没有工作 – user426132

3
- (void)resizeLabelByContent:(UILabel *)label 
{ 

    CGSize maxSize = CGSizeMake(label.width, 999); 

    NSString *contentStr = label.text; 

    UIFont *contentFont = label.font; 

    CGRect contentFrame; 

    NSString *version = [[UIDevice currentDevice] systemVersion]; 

    if ([version floatValue] < 7.0) { 

     CGSize contentStringSize = [contentStr sizeWithFont:contentFont constrainedToSize:maxSize lineBreakMode:label.lineBreakMode]; 

     contentFrame = CGRectMake(label.left, label.top, label.width, contentStringSize.height); 

    } else { 

     NSDictionary *contentDic = [NSDictionary dictionaryWithObjectsAndKeys:contentFont, NSFontAttributeName, nil]; 

     CGSize contentStrSize = [contentStr boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:contentDic context:nil].size; 

     contentFrame = CGRectMake(label.left, label.top, label.width, contentStrSize.height); 
    } 

    label.frame = contentFrame; 
}