2014-02-25 2 views
5

Я использую приведенный ниже код, чтобы рассчитать высоту метки из длины строки. Им с помощью Xcode 5.0 и она отлично работает в IOS 6 тренажера, но он не работает хорошо прошивка 7.Получить высоту NSString в iOS 7

NSString* str = [[array objectAtIndex:i]valueForKey:@"comment"]; 

CGSize size = [className sizeWithFont:[UIFont systemFontOfSize:15] 
constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:UILineBreakModeWordWrap]; 

Height_1 = size.height; 

Если есть какое-либо решение для прошивки 7, то, пожалуйста, помогите. Заранее спасибо

+3

Я из близких голосов, но вот боян: http://stackoverflow.com/questions/18897896/replacement-for-deprecated-sizewithfont-in-ios-7 Это может быть уместным также: http://stackoverflow.com/questions/18903304/deprecated-in-ios-7-sizewithfont-constrainedtosize-linebreakmode-how-can –

ответ

21

Ну вот решение я использую для вычисления высота для iOS 6 и iOS 7, и я принял несколько аргументов, чтобы сделать его многоразовым.

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

/** 
* This method is used to calculate height of text given which fits in specific width having font provided 
* 
* @param text  Text to calculate height of 
* @param widthValue Width of container 
* @param font  Font size of text 
* 
* @return Height required to fit given text in container 
*/ 

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font 
{ 
    CGFloat result = font.pointSize + 4; 
    if (text) 
    { 
     CGSize textSize = { widthValue, CGFLOAT_MAX };  //Width and height of text area 
     CGSize size; 
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
     { 
      //iOS 7 
      CGRect frame = [text boundingRectWithSize:textSize 
              options:NSStringDrawingUsesLineFragmentOrigin 
             attributes:@{ NSFontAttributeName:font } 
              context:nil]; 
      size = CGSizeMake(frame.size.width, frame.size.height+1); 
     } 
     else 
     { 
      //iOS 6.0 
      size = [text sizeWithFont:font constrainedToSize:textSize lineBreakMode:NSLineBreakByWordWrapping]; 
     } 
     result = MAX(size.height, result); //At least one row 
    } 
    return result; 
} 

Надеюсь, что это поможет, и даются любые предложения. Happy Coding :)

Для iOS 7 и выше используйте ниже метод.

+ (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { 
    CGSize size = CGSizeZero; 
    if (text) { 
     //iOS 7 
     CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil]; 
     size = CGSizeMake(frame.size.width, frame.size.height + 1); 
    } 
    return size; 
} 
+0

Спасибо за редактирование @Maverick –

+0

Почему вы добавили '+ 1' здесь:' size = CGSizeMake (frame.size.width, frame.size.height + 1); '? –

+0

Я использовал пользовательские шрифты в своем приложении, и это вызывало незначительную проблему с высотой, поэтому я добавил +1 для решения этой проблемы. –

1
sizeWithFont 

устарела. Используйте

[string sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}]; 

вместо

-1

Используйте приведенный ниже код, чтобы получить высоту этикетки

CGSize szMaxCell = CGSizeMake(220, 2999); 
UIFont *font = [UIFont systemFontOfSize:14.0f]; // whatever font you're using to display 
CGSize szCell = [yourString sizeWithFont:font constrainedToSize:szMaxCell lineBreakMode:NSLineBreakByWordWrapping]; 
+1

Вы предполагаете, что OP делает то, что они уже пробовали. –

+1

'sizeWithFont: constrainedToSize: lineBreakMode:' устарел в iOS7, используйте: 'boundingRectWithSize: options: attributes: context:' – zaph

2

Попробуйте использовать этот

#define FONT_SIZE 15.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 20.0f 


NSString *text; 
CGSize constraint; 
CGSize size; 
CGFloat height; 

text = [[array objectAtIndex:i]valueForKey:@"comment"]; 
constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

CGRect textRect = [text boundingRectWithSize:constraint 
            options:NSStringDrawingUsesLineFragmentOrigin 
            attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]} 
            context:nil]; 

size = textRect.size; 


height = size.height; 
+1

+1 для 'boundingRectWithSize: options: attributes: context:', -1 для определения, а не для const static вары. – zaph

+0

Примечание 'boundingRectWithSize: options: attributes: context:' доступно только для iOS7 и выше. – zaph

+0

@Zaph Спасибо за ваши отзывы. Я новичок в кодировании iOS. Вместо использования определений я должен использовать статические вары? Смогут ли они быстро выполнить мой код? или что они на самом деле делают. Пожалуйста, направляйте. – Maverick

Смежные вопросы