Có cách nào để có nhiều dòng văn bản UILabel
giống như trong UITextView
hoặc tôi nên sử dụng dòng thứ hai thay thế?
Có cách nào để có nhiều dòng văn bản UILabel
giống như trong UITextView
hoặc tôi nên sử dụng dòng thứ hai thay thế?
Câu trả lời:
Tôi tìm thấy một giải pháp.
Người ta chỉ cần thêm mã sau đây:
// 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;
Đã khôi phục câu trả lời cũ (để tham khảo và các nhà phát triển sẵn sàng hỗ trợ iOS dưới 6.0):
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Về phía: cả hai giá trị enum mang lại 0
dù sao.
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
vàcell.textLabel?.numberOfLines = 0
Trong IB, đặt số lượng dòng thành 0 (cho phép các dòng không giới hạn)
Khi nhập vào trường văn bản bằng IB, sử dụng "alt-return" để chèn trả về và đi đến dòng tiếp theo (hoặc bạn có thể sao chép trong văn bản đã được phân tách bằng các dòng).
Giải pháp tốt nhất mà tôi đã tìm thấy (đối với một vấn đề khó chịu khác cần được giải quyết trong khung) tương tự như vaychick.
Chỉ cần đặt số dòng thành 0 trong IB hoặc mã
myLabel.numberOfLines = 0;
Điều này sẽ hiển thị các dòng cần thiết nhưng sẽ định vị lại nhãn sao cho chính giữa của nó theo chiều ngang (sao cho nhãn 1 dòng và 3 dòng được căn chỉnh theo vị trí nằm ngang của chúng). Để sửa lỗi đó thêm:
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];
Nếu bạn phải sử dụng:
myLabel.numberOfLines = 0;
thuộc tính bạn cũng có thể sử dụng ngắt dòng tiêu chuẩn ("\n")
, trong mã, để buộc một dòng mới.
chúng ta hãy cố gắng này
textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated
textLabel.numberOfLines = 0;
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Các giải pháp trên không hoạt động trong trường hợp của tôi. Tôi đang làm như thế này:
- (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);
//...
}
Sử dụng câu chuyện borad: chọn nhãn để đặt số dòng thành 0 ...... Hoặc Tham khảo mục này
Swift 3
Đặt số dòng không cho thông tin văn bản động, nó sẽ hữu ích cho việc thay đổi văn bản.
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;
Vì một số lý do, nó không hoạt động với tôi trong iOS 6, không biết tại sao. Đã thử nó với và không có văn bản quy kết. Bất kỳ đề xuất.
Hãy thử sử dụng cái này:
lblName.numberOfLines = 0;
[lblName sizeToFit];
Những điều này đã giúp tôi
Thay đổi các thuộc tính này của UILabel
label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;
Và trong khi đưa ra chuỗi đầu vào, hãy sử dụng \ n để hiển thị các từ khác nhau trong các dòng khác nhau.
Thí dụ :
NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
Cách 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
}
}
Bây giờ gọi đơn giản như thế này
myLbl.lblFunction()//Replace your label name
VÍ DỤ:
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
}
}
Cách 2:
Lập trình
yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping
Cách 3:
Thông qua bảng câu chuyện
Để hiển thị nhiều dòng được đặt 0 (Không), điều này sẽ hiển thị nhiều hơn một dòng trong nhãn của bạn.
Nếu bạn muốn hiển thị n dòng, đặt n.
Xem màn hình dưới đây.
Nếu bạn muốn đặt kích thước phông chữ tối thiểu cho nhãn Nhấp vào Tự động thu nhỏ và Chọn tùy chọn Kích thước phông chữ tối thiểu
Xem màn hình dưới đây
Ở đây đặt kích thước phông chữ tối thiểu
EX: 9 (Trong ảnh này)
Nếu nhãn của bạn nhận được nhiều văn bản hơn tại thời điểm đó, văn bản nhãn của bạn sẽ bị thu hẹp tối đa 9
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Bạn cũng có thể làm điều đó thông qua Storyboard:
bạn nên thử điều này:
-(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...";
Trong hàm này, truyền chuỗi mà bạn muốn gán trong nhãn và chuyển kích thước phông chữ thay cho self.activityFont và chuyển chiều rộng nhãn thay cho 235, bây giờ bạn có chiều cao nhãn theo chuỗi của mình. nó sẽ hoạt động tốt
-(float)calculateLabelStringHeight:(NSString *)answer
{
CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
return textRect.size.height;
}
Đặt bên dưới hoặc trong mã hoặc trong bảng phân cảnh
Nhãn.lineBreakMode = NSLineBreakByWordWrapping; Nhãn.numberOfLines = 0;
và xin đừng quên đặt các ràng buộc trái, phải, trên và dưới cho nhãn nếu không nó sẽ không hoạt động.
Swift 4:
label.lineBreakMode = .byWordWrapping
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.preferredMaxLayoutWidth = superview.bounds.size.width - 10
Trên C #, điều này làm việc cho tôi trong 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);
Tôi nghĩ vấn đề ở đây là: -
myLabel.TextAlignment = UITextAlignment.Left;
myLabel.LineBreakMode = UILineBreakMode.WordWrap;
myLabel.MinimumScaleFactor = 1;
myLabel.AdjustsFontSizeToFitWidth = true;
Mã này đang trả về kích thước chiều cao theo văn bản
+ (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
không được dùng trong iOS 6. Bây giờ bạn nên sử dụngNSLineBreakByWordWrapping = 0
Xem tài liệu tại đây