Как получить размер NSString
A "quicky": как я могу получить размер (ширину) NSString?
Я пытаюсь увидеть, если строка ширины строки, чтобы увидеть, если она больше, чем заданная ширина экрана, случай, когда я должен "обрезать" его и добавить его с помощью "...", получив обычное поведение UILabel. string.length не будет делать трюк, поскольку AAAAAAAA и iiiiii имеют одинаковую длину, но разные размеры (например).
Я как бы застрял.
Большое спасибо.
Ответы
Ответ 1
Это другой подход. Узнайте минимальный размер текста, чтобы он не обернулся более чем в одну строку. Если он обернут более одной строки, вы можете узнать, используя высоту.
Вы можете использовать этот код:
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *myString = @"This is a long string which wraps";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont
constrainedToSize:maximumSize
lineBreakMode:self.myLabel.lineBreakMode];
300 - ширина экрана с небольшим пространством для полей. Вы должны подставить свои собственные значения для шрифта и размера, а для lineBreakMode
, если вы не используете IB.
Теперь myStringSize
будет содержать height
, который вы можете проверить на высоте того, что вы знаете, всего на 1 строку (с использованием того же шрифта и размера). Если он больше, вам нужно будет отрезать текст. Обратите внимание, что вы должны добавить... в строку перед тем, как вы ее снова проверите (добавление... может снова нажать ее над лимитом).
Поместите этот код в цикл, чтобы вырезать текст, затем снова проверьте правильную высоту.
Ответ 2
Используйте метод ниже.
Objective-C
- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
CGSize size = CGSizeZero;
if (text) {
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;
}
Swift 3.0
func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize {
var size = CGSizeZero
if text {
var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
size = CGSize(width: frame.size.width, height: frame.size.height + 1)
}
return size
}
Ответ 3
Вам нужно использовать Core Graphics для измерения строки, как показано в указанном шрифте и размере. См. Ответы Измерение ширины пикселя строки для прохода.
Ответ 4
sizeWithFont:constrainedToSize:lineBreakMode
теперь устарел. Используйте ниже фрагмент кода,
UIFont *font=[UIFont fontWithName:@"Arial" size:16.f];
NSString *name = @"APPLE";
CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];