2012-01-24 33 views
5

Im đang làm việc trên ứng dụng ios sử dụng mục tiêu c và tôi gặp sự cố với uilabel mà tôi có thể sử dụng một số trợ giúp. Về cơ bản tôi có một nhãn có thể thay đổi kích thước để phù hợp với văn bản mà nó sẽ hiển thị nhưng nó có một chiều cao tối đa mà nó có thể có thể được. bản thân nhãn có chiều rộng cố định ở mọi thời điểm. tôi đã bật UILineBreakModeWordWrap và UILineBreakModeTailTruncation để làm cho văn bản phù hợp và cắt ngắn nhưng điều này làm cho văn bản cắt ngắn đuôi quá sớm khi nó chỉ còn 1 từ để đặt. thay vì sau đó di chuyển nó lên dòng tiếp theo khi vẫn còn phòng nó chỉ cắt ngắn nó.cắt đuôi đuôi ilabel

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); 
self.lineBreakMode = UILineBreakModeWordWrap | UILineBreakModeTailTruncation; 
self.numberOfLines = 0; 
[self sizeToFit]; 

là có tìm kiếm khi uilabel thực sự cắt ngắn văn bản để tôi có thể kiểm tra chiều cao nhãn và thêm vào nó nếu vẫn còn chỗ không? Tôi đã cố gắng luôn luôn thêm một dòng phụ để chiều cao khi có phòng và điều này tránh cắt ngắn đầu nhưng sau đó im trái với kích thước không phù hợp của trên tất cả các nhãn. bất kỳ ý tưởng về vấn đề này sẽ được nhờ rất lớn

Trả lời

10

lineBreakMode là công tắc. Có thể là hoặc (dành cho iOS6 +) NSLineBreakByWordWrapping hoặc NSLineBreakByTruncatingTail nhưng không phải cả hai.

Nhưng, để trả lời câu hỏi của bạn, bạn có thể tìm kích thước của một số văn bản bằng cách sử dụng tiện ích mở rộng lớp học trong NSString+UIKit. Đã tìm thấy kích thước bạn có thể cập nhật khung của UILabel một cách thích hợp.

+0

kết thúc với kích thước từ liên kết bạn đã cung cấp (sizeWithFont :) và sau đó đặt linebreakmode thành wordwrap hoặc tail trunc tùy thuộc nếu nó ở mức tối đa hay không và sau đó sử dụng sizetofit và làm việc tuyệt vời nhờ – glogic

+0

Mẹo hay trên danh mục đó. Không biết nó tồn tại trước đây. – chakrit

0

Sử dụng phương pháp này:

How to find UILabel's number of Lines

Bạn có thể thiết lập các nhãn với chiều cao tối đa, tìm hiểu cách thức cao văn bản là trong nhãn và co lại nó khi cần thiết .

1

Tôi đã viết một danh mục để làm việc với cắt xén của UILabel. Hoạt động trên iOS 7 trở lên. Hy vọng nó giúp !

@implementation UILabel (Truncation) 

- (NSRange)truncatedRange 
{ 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]]; 

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [textStorage addLayoutManager:layoutManager]; 

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size]; 
    textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 

    NSRange truncatedrange = [layoutManager truncatedGlyphRangeInLineFragmentForGlyphAtIndex:0]; 
    return truncatedrange; 
} 

- (BOOL)isTruncated 
{ 
    return [self truncatedRange].location != NSNotFound; 
} 

- (NSString *)truncatedText 
{ 
    NSRange truncatedrange = [self truncatedRange]; 
    if (truncatedrange.location != NSNotFound) 
    { 
     return [self.text substringWithRange:truncatedrange]; 
    } 

    return nil; 
} 

@end 
+1

nó không hoạt động đối với nhiều dòng –

0

Tôi chỉ đến một vấn đề tương tự, và giải quyết nó bằng một giải pháp rất đơn giản (thử nghiệm trên ios 8.4, xcode 7).

Trong IB (tôi sử dụng autolayout với một số hạn chế):

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

Trong Mã số:

label.numberOfLines = 2; // I can only display 2 row. 
// I supposed you should know how many rows you can displayed. 

label.preferredMaxLayoutWidth = label.frame.size.width; 
[label sizeToFit]; 

Tadaa. Đó là nó. Lưu ý rằng thao tác này chỉ hoạt động với UILabel. Với UIButton, nó có thể không hoạt động (Chưa được kiểm tra).

+0

+1 để hiển thị thuộc tính "preferredMaxLayoutWidth". Tôi có một trường hợp khác từ topicstarter, nhưng thuộc tính này đã giải quyết được vấn đề của tôi. –

Các vấn đề liên quan