2010-03-07 31 views
19

Khi myLabel.adjustsFontSizeToFitWidth = YES, UILabel sẽ tự động điều chỉnh kích thước phông chữ trong trường hợp văn bản quá dài đối với nhãn. Ví dụ: nếu nhãn của tôi chỉ rộng 100px và văn bản của tôi quá dài để vừa với kích thước phông chữ hiện tại, nó sẽ thu nhỏ kích thước phông chữ cho đến khi văn bản vừa với nhãn.Làm thế nào để tìm ra kích thước phông chữ của một UILabel khi -adjustsFontSizeToFitWidth được đặt thành YES?

Tôi cần nhận kích thước phông chữ được hiển thị thực tế từ UILabel khi kích thước phông chữ bị thu hẹp. Ví dụ, giả sử kích thước phông chữ của tôi thực sự là 20, nhưng UILabel phải thu nhỏ nó xuống 10. Khi tôi hỏi UILabel cho phông chữ và kích thước phông chữ, tôi nhận được kích thước phông chữ cũ (20), nhưng không được hiển thị (10).

+0

Không ai trong số các câu trả lời dưới câu hỏi này thực sự trả lời các câu hỏi được đặt. Không chắc tại sao lại như thế, nhưng đúng vậy. Đây là câu trả lời thực tế cho người đọc trong tương lai: https://stackoverflow.com/a/28285447/2057171 –

Trả lời

7

Tôi không chắc liệu điều này có hoàn toàn chính xác hay không, nhưng nó phải khá gần, hy vọng. Nó có thể không lấy các chuỗi bị cắt ngắn vào tài khoản hoặc chiều cao của nhãn, nhưng đó là điều bạn có thể làm theo cách thủ công.

Phương pháp

- (CGSize)sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

sẽ trở lại kích thước văn bản, và nhận thấy rằng nó cũng có một số tài liệu tham khảo cho cỡ chữ thực tế sử dụng.

+0

Câu trả lời mở rộng tại đây: http://stackoverflow.com/a/6141770/1804403 – Skotch

+3

Phương pháp này hiện không được chấp nhận trong iOS 7. Xem http://stackoverflow.com/questions/19195541/how-to-calculate-actual-font-size-in-ios-7 – openfrog

+2

Điều đó cũng sẽ trả lại kích thước hộp giới hạn cho kích thước phông chữ được đưa ra ... Không phải phông chữ kích thước cho kích thước hộp giới hạn được đưa ra. – jowie

2

Trong trường hợp bất kỳ ai vẫn cần câu trả lời. Trong iOS9, bạn có thể sử dụng boundingRectWithSize:options:context: để tính kích thước phông chữ thực tế. Lưu ý rằng context.minimumScaleFactor không được là 0.0 để mở rộng quy mô hoạt động.

- (CGFloat)adjustedFontSizeForLabel:(UILabel *)label { 
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString:label.attributedText]; 
    [text setAttributes:@{NSFontAttributeName:label.font} range:NSMakeRange(0, text.length)]; 

    NSStringDrawingContext *context = [NSStringDrawingContext new]; 
    context.minimumScaleFactor = label.minimumScaleFactor; 
    [text boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin context:context]; 
    CGFloat adjustedFontSize = label.font.pointSize * context.actualScaleFactor; 

    return adjustedFontSize; 
} 
+3

Phương thức này vẫn trả về giá trị gốc kích thước phông chữ –

0

Swift 3

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    func adjustedFontSizeForLabel(_ label: UILabel) -> CGFloat { 
     let text: NSMutableAttributedString = NSMutableAttributedString(attributedString: label.attributedText!) 
     text.setAttributes([NSFontAttributeName: label.font], range: NSMakeRange(0, text.length)) 
     let context: NSStringDrawingContext = NSStringDrawingContext() 
     context.minimumScaleFactor = label.minimumScaleFactor 
     text.boundingRect(with: label.frame.size, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: context) 
     let adjustedFontSize: CGFloat = label.font.pointSize * context.actualScaleFactor 
     return adjustedFontSize 
    } 

    print(adjustedFontSizeForLabel(yourLabel)) 
} 
+0

nó hiển thị cùng kích thước như được xác định trong trình tạo giao diện. –

1

Đối với một dòng UILabel hoạt động tốt giải pháp đơn giản này:

//myLabel - initial label 

UILabel *fullSizeLabel = [UILabel new]; 
fullSizeLabel.font = myLabel.font; 
fullSizeLabel.text = myLabel.text; 
[fullSizeLabel sizeToFit]; 

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width/fullSizeLabel.bounds.size.width); 

//correct, if new font size bigger than initial 
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize; 
Các vấn đề liên quan