2014-01-21 64 views
3

我有一個寬度有限的標籤,我需要它自動調整文本的字體大小以適應文本。 由於我需要將文本加下劃線,因此我分配了這個標籤的屬性字符串:UILabel在分配NSAttributedString後不會自動縮小文本

[_commentsLabel setAttributedText:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%d comments", [comments count]] attributes:@{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}]]; 

正如您所看到的,評論的數量將定義文本的長度。但由於某種原因,文字不縮水。最小字體比例設置爲0.1,並且選中擰緊字母間距。

我認爲它可能與我正在使用的自定義字體有關,但即使使用系統默認字體,文本也會被剪切。

回答

4

我想嘗試標籤屬性

@property(nonatomic) BOOL adjustsFontSizeToFitWidth 

設置爲YES,看看是否能解決問題。如果不是,請告訴我。我在不同的情況下遇到問題,但我最終使用一些代碼手動更改大小。

這是我用來手動更改字體大小的代碼。林不知道你的問題是什麼,但這最終是一個很好的解決我的問題。只需在設置標籤文本時調用此方法,然後自行設置字體大小即可。

- (CGFloat)requiredFontSizeForLabel:(UILabel *)label 
{ 
    if (!label) { 
     return kFontSize; 
    } 
    CGFloat originalFontSize = kFontSize; 

    UIFont* font = label.font; 
    CGFloat fontSize = originalFontSize; 

    BOOL found = NO; 
    do 
    { 
     if(font.pointSize != fontSize) 
     { 
      font = [font fontWithSize: fontSize]; 
     } 
     if([self wouldThisFont:font workForThisLabel:label]) 
     { 
      found = YES; 
      break; 
     } 

     fontSize -= 0.5; 
     if(fontSize < (label.minimumScaleFactor * label.font.pointSize)) 
     { 
      break; 
     } 

    } while(TRUE); 

    return(fontSize); 
} 

    - (BOOL) wouldThisFont:(UIFont *)testFont workForThisLabel:(UILabel *)testLabel { 
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:testFont, NSFontAttributeName, nil]; 
    NSAttributedString *as = [[NSAttributedString alloc] initWithString:testLabel.text attributes:attributes]; 
    CGRect bounds = [as boundingRectWithSize:CGSizeMake(CGRectGetWidth(testLabel.frame), CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) context:nil]; 
    BOOL itWorks = [self doesThisSize:bounds.size fitInThisSize:testLabel.bounds.size]; 
    return itWorks; 
} 

     - (BOOL)doesThisSize:(CGSize)aa fitInThisSize:(CGSize)bb 
    { 
     if (aa.width > bb.width) return NO; 
     if (aa.height > bb.height) return NO; 
     return YES; 
    } 

Source for code found here

+0

我試過了,沒有成功。似乎是NSAttributedStrings的問題。它適用於常規NSStrings。 – Guilherme

+0

@Guilherme這裏是我在縮放不適合我時使用的代碼。也許它可以幫助你。 – horsejockey

+0

我沒有測試這個,但它似乎確實做了這項工作。我根據評論的數量手動結束了字體的設置,但並不太複雜。如果沒有人提出更好的答案/解釋爲什麼歸因字符串不縮小,我會標記爲正確的。 – Guilherme

0

AttributeStrings有自己的字體大小(S)。手動操作。

組成屬性字符串的所有屬性字符串必須有都有NSFontAttributeName。

func updateLabelSizeIfNeeded() { 
    let maxScale: CGFloat = 0.65 
    let bounding = self.label.attributedText!.boundingRectWithSize(CGSizeMake(CGFloat.infinity, CGFloat.infinity), options: [], context: nil) 
    if bounding.size.width > self.bounds.size.width*maxScale { 
     let scaleFactor = (self.bounds.size.width * maxScale)/bounding.size.width 

     label.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor) 
    } else { 
     label.transform = CGAffineTransformIdentity 
    } 
} 
+0

使用仿射變換不是一個好主意。 – kelin

相關問題