Как уже указывалось, этот пост описывает, как получить высоту, а не количество строк. Чтобы получить количество строк,
- Получите высоту для одной буквы, например,
@"A"
.
- Разделите высоту строки на высоту, полученную в 1 выше.
например.
CGFloat unitHeight = [@"A" heightForWidth:width usingFont:font];
CGFloat blockHeight = [text heightForWidth:width usingFont:font];
NSInteger numberOfLines = ceilf(blockHeight / unitHeight);
// need to #include <math.h> for ^^^^^
Начиная с iOS 7, изменился способ получения желаемой высоты надписи. Чтобы получить высоту, вы можете использовать следующий код:
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){width, FLT_MAX};
CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
где высота r.size.height
. Обратите внимание, что font
должно быть предоставлено. Вы можете поместить это в категорию для NSString для удобства, например,
@implementation NSString (HeightCalc)
- (CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font
{
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){width, FLT_MAX};
CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
return r.size.height;
}
@end
(управление памятью, если не используется ARC, кстати.)
Для iOS 6 и ниже:
Допустим, у вас есть UILabel *myLabel
, и вы хотите узнать высоту метки (с некоторыми изменениями вы можете получить количество строк, разделив высоту на некоторое соответствующее число, которое зависит от размера шрифта).
UILabel *myLabel;
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font
constrainedToSize:myLabel.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
Надеюсь, это поможет. Если это не сработает, дайте мне знать, и я буду копать дальше. Также, непроверенный код, но работал по ссылке.
Для более полного примера, вот код, который я поместил в viewDidLoad: метод контроллера представления:
[super viewDidLoad];
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,50,200,350)];
myLabel.numberOfLines = 0;
myLabel.lineBreakMode = UILineBreakModeWordWrap;
myLabel.text = @"This is some text in a UILabel which is long enough to wrap around the lines in said UILabel. This is a test, this is only a test.";
[self.view addSubview:myLabel];
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font
constrainedToSize:myLabel.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
NSLog(@"labelHeight = %f", labelHeight);
[myLabel release];
Вывод NSLog идет:
2010-11-15 18:25:27.817 so_labelheight[728:307] labelHeight = 126.000000