2013-09-26 5 views
4

В IOS 6, я использую:Динамического изменения размеров этикетки в прошивке 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. Это не работает в прошивке 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; 
} 
Смежные вопросы