Я отобразил текст в UILabel с помощью метода обертки. Теперь я хочу найти количество строк в UILabel.Как найти номер строки UILabel
Если есть возможный способ найти количество строк в строке UILabel.
Спасибо.
Я отобразил текст в UILabel с помощью метода обертки. Теперь я хочу найти количество строк в UILabel.Как найти номер строки UILabel
Если есть возможный способ найти количество строк в строке UILabel.
Спасибо.
Как указано, это сообщение описывает, как получить высоту, а не количество строк. Чтобы получить количество строк,
@"A"
.E.g.
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 ^^^^^
С прошивкой 7 пути получения желаемого ВЫСОТА лейбла изменилось. Для того, чтобы получить высоту, вы можете использовать следующий код:
где высота 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
(Do управление памятью, если не используется 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
он показывает следующие две ошибки // ошибка: несовместимый тип для аргумента 2 из 'sizeWithFont: constrainedToSize : lineBreakMode:» \t \t \t ошибка: запрос члена„размера“в чем-то не структуры или объединения – Velmurugan
Ofcourse .size не является свойством на UILabel, но это, вероятно, следует что-то вроде myLabel.frame.size или MyLabel .bounds.size (не уверен, какой из них вы хотите). –
Ах да, пропустил этот. Спасибо Wim H. Исправил пример выше, чтобы использовать frame.size. – Kalle
Метод -sizeWithFont:constrainedToSize:lineBreakMode
теперь устарела. Теперь вы захотите использовать метод -boundingRectWithSize:options:attributes:context:
.
Вот примеры:
CGSize boundingRectSize = CGSizeMake(widthToConstrainTo, CGFLOAT_MAX);
NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:fontName size:14]};
CGRect labelSize = [labelString boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:attributes
context:nil];
В приведенном выше примере я знаю ширину Я хочу, чтобы ограничить метку, но так как я не уверен, что высоты, я просто макс высота парам с использованием CGFLOAT_MAX
, Для options
вам нужно использовать NSStringDrawingUsesLineFragmentOrigin
и NSStringDrawingUsesFontLeading
, если вы пытаетесь рассчитать размер метки, которая может быть любым количеством строк.
sizeWithFont
осуждается в прошивке 7, вы можете использовать вместо этого:
- (int)lineCountForText:(NSString *) text
{
UIFont *font = ...
CGRect rect = [text boundingRectWithSize:CGSizeMake(200, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName : font}
context:nil];
return ceil(rect.size.height/font.lineHeight);
}
Для iOS7 и выше, officially sanctioned way подсчитать количество строк, чтобы использовать TextKit:
func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int {
let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font])
let textContainer = NSTextContainer(size: size)
textContainer.lineBreakMode = .ByWordWrapping
textContainer.maximumNumberOfLines = 0
textContainer.lineFragmentPadding = 0
let layoutManager = NSLayoutManager()
layoutManager.textStorage = textStorage
layoutManager.addTextContainer(textContainer)
var numberOfLines = 0
var index = 0
var lineRange : NSRange = NSMakeRange(0, 0)
for (; index < layoutManager.numberOfGlyphs; numberOfLines++) {
layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
}
return numberOfLines
}
(Я изначально отправил свой ответ here, но не имеет достаточной репутации, чтобы комментировать или отмечать дубликаты.)
Другие ответы I'v е найдено не уважают numberOfLines
свойство UILabel
, когда он установлен на что-то другое, чем 0.
Вот еще один вариант, вы можете добавить к вашей категории или подкласса:
- (NSUInteger)lineCount
{
CGSize size = [self sizeThatFits:CGSizeMake(self.frame.size.width, CGFLOAT_MAX)];
return MAX((int)(size.height/self.font.lineHeight), 0);
}
Некоторые примечания:
font
, и он отлично работает. Очевидно, что у вас возникнут проблемы, если вы используете несколько шрифтов в своем attributedText
.UILabel
иметь пользовательские края врезки (например, перекрывая drawTextInRect:
, что аккуратный трюк я нашел here), то вы должны помнить, чтобы принять эти врезки во внимание при расчете size
выше. Например: CGSizeMake(self.frame.size.width - (self.insets.left + self.insets.right), CGFLOAT_MAX)
Если вы ищете этот ответ в Swift 2 +/IOS 8, это будет выглядеть следующим образом:
func numberOfLinesInLabel(yourString: String, labelWidth: CGFloat, labelHeight: CGFloat, font: UIFont) -> Int {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = labelHeight
paragraphStyle.maximumLineHeight = labelHeight
paragraphStyle.lineBreakMode = .ByWordWrapping
let attributes: [String: AnyObject] = [NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle]
let constrain = CGSizeMake(labelWidth, CGFloat(Float.infinity))
let size = yourString.sizeWithAttributes(attributes)
let stringWidth = size.width
let numberOfLines = ceil(Double(stringWidth/constrain.width))
return Int(numberOfLines)
}
Этот ответ хорош от iOS8 –
Спасибо @AvielGross. Отредактировано с учетом вашего ввода. – cph2117
Какова цель «сдерживать» здесь? –
func getHeight(text: NSString, width:CGFloat, font: UIFont) -> CGFloat
{
let rect = text.boundingRect(with: CGSize.init(width: width, height: CGFloat.greatestFiniteMagnitude), options: ([NSStringDrawingOptions.usesLineFragmentOrigin,NSStringDrawingOptions.usesFontLeading]), attributes: [NSFontAttributeName:font], context: nil)
return rect.size.height
}
текст: Метка, высота которого вам нужно найти с заданной строки
ширина: ширина UILabel
шрифта: шрифт UILabel в
http://stackoverflow.com/questions/4082041/resulting-lines-of-uilabel-with-uilinebreakmodewordwrap/14401282#14401282 – TheTiger