Я искал решение этого в прошлых QAs, но не смог найти правильный.
Кто-нибудь знает, как настроить размер UILabel
динамически, чтобы соответствовать длине текста?
Я загрузил снимок экрана из того, чего не хочу (1-я строка) и того, что хочу (2-я строка).
Я был бы признателен за любые подсказки, советы или образцы кода. Спасибо.
Как настроить размер ярлыка, чтобы он соответствовал длине текста
Ответ 1
То, что вы ищете, это метод UILabel sizeToFit
Я могу попытаться объяснить вам, но лучшим ответом на то, как работать с UILabel, является то, что: fooobar.com/questions/460/...
Ответ 2
Xcode 8 и iOS 10
Это довольно легко сделать с Auto Layout. Не нужно ничего делать в коде.
Использовать автоматический макет
Используйте автоматический макет, чтобы выровнять только верхний и верхний левый верх. Не добавляйте ограничения для ширины и высоты. Размер внутреннего содержимого представления позаботится об этом.
Вот как выглядят ограничения:
Код
В коде нет ничего особенного. Не нужно использовать sizeToFit
или что-то в этом роде.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var labelOne: UILabel!
@IBOutlet weak var labelTwo: UILabel!
@IBOutlet weak var labelThree: UILabel!
@IBAction func changeTextButtonTapped(_ sender: UIButton) {
labelOne.text = "David"
labelTwo.text = "met"
labelThree.text = "her"
}
}
Примечания
- Этот ответ был протестирован с помощью Xcode 8, iOS 10 и Swift 3.
- См. мой другой ответ, если вы хотите изменить размер нескольких строк.
- Благодаря этому ответу для установки меня на правильный трек.
Ответ 3
Использовать этот расширенный класс UILabel
:
//
// UILabelExtended.h
//
// Created by Prateek on 6/18/11.
#import <Foundation/Foundation.h>
/* **********************************************************************************************
This class inherit the class UILabel and extend the features of UILabel.
********************************************************************************************** */
@interface UILabelExtended : UILabel {
__unsafe_unretained id customDelegate;
id objectInfo;
SEL selector;
}
@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id customDelegate;
@property (nonatomic,retain) id objectInfo;
@end
@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end
UILabelExtended.m
//
// Created by Prateek on 6/18/11.
//
#import "UILabelExtended.h"
@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if(self.selector)
if([self.customDelegate respondsToSelector:self.selector]) {
[self.customDelegate performSelector:self.selector withObject:self];
return;
}
}
- (void)dealloc {
self.customDelegate = nil;
self.selector = NULL;
self.objectInfo = nil;
}
@end
@implementation UILabel(UILabelCategory)
- (void)setHeightOfLabel {
UILabel* label = self;
//get the height of label content
CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
//set the frame according to calculated height
CGRect frame = label.frame;
if([label.text length] > 0) {
frame.size.height = height;
}
else {
frame.size.height = 0;
}
label.frame = frame;
}
- (void)setWidthOfLabel {
UILabel* label = self;
//get the height of label content
CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
//set the frame according to calculated height
CGRect frame = label.frame;
if([label.text length] > 0) {
frame.size.width = width+5;
}
else {
frame.size.width = 0;
}
label.frame = frame;
}
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
UILabel* label = self;
//get the height of label content
CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
//set the frame according to calculated height
CGRect frame = label.frame;
if([label.text length] > 0) {
if (height > maxHeight) {
frame.size.height = maxHeight;
}
else {
frame.size.height = height;
}
}
else {
frame.size.height = 0;
}
label.frame = frame;
}
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth {
UILabel* label = self;
//get the height of label content
CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
//set the frame according to calculated height
CGRect frame = label.frame;
if([label.text length] > 0) {
if (width > maxWidth) {
frame.size.width = maxWidth;
}
else {
frame.size.width = width;
}
}
else {
frame.size.width = 0;
}
label.frame = frame;
}
@end
Способы использования: 1) установить текст
UILabel
2)[yourLBLObj setHeightOfLabel];
или[yourLBLObj setWidthOfLabel];
Он автоматически устанавливает высоту или ширину в соответствии с текстом.
Ответ 4
вы просто вычисляете ширину UILabel
для размера строки, попробуйте этот простой код для набора UILabel
size
// Single line, no wrapping;
CGSize expectedLabelSize = [string sizeWithFont:yourFont];
// you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height
Ответ 5
попробуйте это
NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
CGSize constraint1 = CGSizeMake(280, 2000);
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];
UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
lblComment.lineBreakMode = UILineBreakModeWordWrap;
lblComment.numberOfLines = size1.height/15;
[lblComment setFont:[UIFont systemFontOfSize:12]];
lblComment.text = text1;
lblComment.tag = shareObjC.userId;
[lblComment setNeedsDisplay]
Ответ 6
Вы можете использовать этот кусок кода для расчета ширины метки и установки его
CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize];
//вы можете получить ширину ширины ширины от expectedLabelSize и соответственно установить
Ответ 7
В настоящее время я работаю над IOS-8, и есть небольшие изменения, которые я сделал для ответа @Suragch (нужно использовать автомасштабирование, чтобы сделать эту работу)
Ниже приведен шаг и снимок экрана в результатах:
- Поместите текстовое представление внутри UIView, а не непосредственно внутри содержимого в раскадровке
- Отключить прокрутку текста из раскадровки
- Добавить ведущие и верхние ограничения, которые я добавил для просмотра ниже скриншот (ограничение на трейлинг необязательно, но я добавил)
Нет необходимости добавлять код в swift, это может быть сделано в самой раскадровке.
Ответ 8
Все, что вам нужно, просто введите 2 строки кода
lbl1.numberOfLines = 0
lbl1.sizeToFit()
Он будет управлять шириной ярлыка в соответствии с его содержимым
Надеюсь, это поможет другим :)