Чи є спосіб мати кілька рядків тексту, UILabel
як у, UITextView
або я повинен використовувати замість другого?
Чи є спосіб мати кілька рядків тексту, UILabel
як у, UITextView
або я повинен використовувати замість другого?
Відповіді:
Я знайшов рішення.
Потрібно лише додати наступний код:
// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0
// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0
// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;
// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;
Відновлена стара відповідь (для довідок та розробників, які бажають підтримувати iOS нижче 6.0):
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Зі сторони: обидва значення перерахунку поступаються в 0
будь-якому випадку.
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
таcell.textLabel?.numberOfLines = 0
У IB встановіть кількість рядків 0 (дозволяє необмежено рядків)
Вводячи в текстове поле за допомогою ІБ, використовуйте "alt-return", щоб вставити повернення та перейти до наступного рядка (або ви можете скопіювати текст, вже відокремлений рядками).
Найкраще рішення, яке я знайшов (інакше засмучуючу проблему, яку слід було б вирішити в рамках), схоже на рішення вайчик.
Просто встановіть кількість рядків на 0 у IB чи коді
myLabel.numberOfLines = 0;
Це відобразить потрібні лінії, але переставить мітку так, щоб її було по центру горизонтально (так, щоб мітка на 1 і 3 рядки була вирівняна у горизонтальному положенні). Щоб виправити додавання:
CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode];
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Якщо вам потрібно скористатися:
myLabel.numberOfLines = 0;
властивості Ви також можете використовувати стандартний розрив рядка ("\n")
в коді, щоб примусити новий рядок.
давайте спробуємо це
textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated
textLabel.numberOfLines = 0;
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Наведене вище рішення не працює в моєму випадку. Я роблю так:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ...
CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
return size.height + 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
// ...
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
}
// ...
UILabel *textLabel = [cell textLabel];
CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
constrainedToSize:CGSizeMake(240.0, 480.0)
lineBreakMode:UILineBreakModeWordWrap];
cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);
//...
}
Використовуйте borad сюжету: виберіть мітку, щоб встановити кількість рядків на нуль ...... Або зверніться до цього
Swift 3
Встановіть кількість рядків нульову для динамічної текстової інформації, це буде корисно для зміни тексту.
var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;
helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;
Чомусь це не працює для мене в iOS 6, не знаю, чому. Спробував це з атрибутивним текстом і без нього. Будь-які пропозиції.
Спробуйте скористатися цим:
lblName.numberOfLines = 0;
[lblName sizeToFit];
Ці речі мені допомогли
Змініть ці властивості UILabel
label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;
І надаючи рядок введення, використовуйте \ n для відображення різних слів у різних рядках.
Приклад:
NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
Спосіб 1:
extension UILabel {//Write this extension after close brackets of your class
func lblFunction() {
numberOfLines = 0
lineBreakMode = .byWordWrapping//If you want word wraping
//OR
lineBreakMode = .byCharWrapping//If you want character wraping
}
}
Тепер дзвоніть просто так
myLbl.lblFunction()//Replace your label name
EX:
Import UIKit
class MyClassName: UIViewController {//For example this is your class.
override func viewDidLoad() {
super.viewDidLoad()
myLbl.lblFunction()//Replace your label name
}
}//After close of your class write this extension.
extension UILabel {//Write this extension after close brackets of your class
func lblFunction() {
numberOfLines = 0
lineBreakMode = .byWordWrapping//If you want word wraping
//OR
lineBreakMode = .byCharWrapping//If you want character wraping
}
}
Спосіб 2:
Програмно
yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping
Спосіб 3:
Через дошку Story
Для відображення декількох рядків, встановлених 0 (нульовим), це відображатиме більше, ніж один рядок у вашій мітці.
Якщо ви хочете відобразити n рядків, встановіть n.
Дивіться нижче екран.
Якщо ви хочете встановити мінімальний розмір шрифту для мітки, натисніть Автоматичне посилання та виберіть опцію Мінімальний розмір шрифту
Дивіться нижче екрани
Тут встановлено мінімальний розмір шрифту
EX: 9 (на цьому зображенні)
Якщо ваш ярлик отримає більше тексту на той час, текст вашої мітки буде скорочуватися до 9
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Ви також можете це зробити через Дошку розгортки:
ви повинні спробувати це:
-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
CGFloat lblWidth = lbl.frame.size.width;
CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:lbl.font}
context:nil];
return lblTextSize.size.height;
}
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
У цій функції передайте рядок, яку ви хочете призначити міткою та розмістити шрифт замість self.activityFont та пропустити ширину мітки замість 235, тепер ви отримуєте висоту мітки відповідно до рядка. це буде добре працювати.
-(float)calculateLabelStringHeight:(NSString *)answer
{
CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
return textRect.size.height;
}
Встановіть нижче або в коді, або в самій раскадровці
Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;
і, будь ласка, не забудьте встановити ліві, праві, верхні та нижні обмеження для мітки, інакше це не працюватиме.
Швидкий 4:
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.preferredMaxLayoutWidth = superview.bounds.size.width - 10
На C #, це працювало для мене всередині UITableViewCell.
UILabel myLabel = new UILabel();
myLabel.Font = UIFont.SystemFontOfSize(16);
myLabel.Lines = 0;
myLabel.TextAlignment = UITextAlignment.Left;
myLabel.LineBreakMode = UILineBreakMode.WordWrap;
myLabel.MinimumScaleFactor = 1;
myLabel.AdjustsFontSizeToFitWidth = true;
myLabel.InvalidateIntrinsicContentSize();
myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
myCell.ContentView.AddSubview(myLabel);
Я думаю, що тут важливо:
myLabel.TextAlignment = UITextAlignment.Left;
myLabel.LineBreakMode = UILineBreakMode.WordWrap;
myLabel.MinimumScaleFactor = 1;
myLabel.AdjustsFontSizeToFitWidth = true;
Цей код повертає висоту розміру відповідно до тексту
+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
{
CGFloat result = font.pointSize+4;
if (text)
{
CGSize size;
CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:font}
context:nil];
size = CGSizeMake(frame.size.width, frame.size.height+1);
result = MAX(size.height, result); //At least one row
}
return result;
}
UILineBreakModeWordWrap
було застаріло в iOS 6. Тепер ви повинні використовуватиNSLineBreakByWordWrapping = 0
Дивіться документацію тут