2012-01-24 123 views
5

我在使用目標c的ios應用程序工作,我有一個與uilabel的問題,我可以使用一些幫助。基本上我有一個標籤,可以改變大小,以適應它將顯示的文本,但它有一個可能的最大高度。標籤本身始終具有固定的寬度。我打開了UILineBreakModeWordWrap和UILineBreakModeTailTruncation以使文本適合並截斷,但這會導致文本過早截斷尾部,因爲它只剩下1個單詞。而不是將它移動到下一行時,如果仍有空間,它只會截斷它。uilabel尾截斷

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

反正是有發現時的UILabel實際上截斷文本,然後我可以檢查標籤的高度,並加入到它,如果還有空間嗎?當有空間時,我總是試圖在高度上添加一條額外的線,這樣可以避免早期截斷,但是隨後會留下整個標籤的大小不一致。有這方面的想法將是巨大的感謝

回答

10

lineBreakMode是一個開關。它可以是或者(對於iOS6 +)NSLineBreakByWordWrapping或者NSLineBreakByTruncatingTail但不是兩者。

但是,要回答您的問題,您可以使用NSString+UIKit中的類擴展名找到一些文本的大小。找到大小後,您可以適當地更新UILabel的幀。

+0

最終獲得的大小,這將是從你提供的(sizeWithFont :)鏈接,然後設置linebreakmode到換行或尾TRUNC取決於如果它是在最大與否,然後用sizetofit並十分感謝工作 – glogic

+0

尼斯尖在那個類別上。以前不知道它存在。 – chakrit

1

我寫了一個用於處理UILabel截斷的類。適用於iOS 7及更高版本。希望能幫助到你 !

@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

它不適用於多行 –

0

我剛來到一個類似的問題,並用非常簡單的解決方案(在iOS 8.4測試時,Xcode 7)解決了這個問題。

在IB(我用的自動佈局一些約束):

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

代碼:

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。而已。請注意,這隻適用於UILabel。使用UIButton,它可能不起作用(未測試)。

+0

+1用於揭示「preferredMaxLayoutWidth」屬性。我有另一個topicstarter的案例,但是這個屬性解決了我的問題。 –