2010-09-08 48 views
20

Có thể nhận kích thước phông chữ cuối cùng sau khi tự động điều chỉnh không? (thuộc tính adjustsFontSizeToFitWidth được đặt thành YES và kích thước phông chữ văn bản đang được thu nhỏ để vừa với nhãn)Làm thế nào để có được kích thước phông chữ tự động điều chỉnh UILabel (UITextView)?

Tôi đang phân lớp drawTextInRect trong UILabel để đặt gradient trên văn bản, nhưng kích thước gradient cần phải giống nhau, như kích thước của phông chữ. Tôi không thể có được kích thước thích hợp của phông chữ được điều chỉnh ... Thậm chí có thể không?

//draw gradient 

    CGContextSaveGState(myContext); 
     CGGradientRef glossGradient; 
     CGColorSpaceRef rgbColorspace; 
     size_t num_locations = 2; 
     CGFloat locations[2] = { 0.0, 1.0 }; 
     CGFloat components[8] = { 1, 1, 1, 0.25, // BOTTOM color 
      1, 1, 1, 0.12 }; // UPPER color 

    //scale and translate so that text would not be rotated 180 deg wrong 
     CGContextTranslateCTM(myContext, 0, rect.size.height); 
     CGContextScaleCTM(myContext, 1.0, -1.0); 

//create mask 
     CGImageRef alphaMask = CGBitmapContextCreateImage(myContext); 
     CGContextClipToMask(myContext, rect, alphaMask); 

     rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
     glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

    //gradient should be sized to actual font size. THIS IS THE PROBLEM - EVEN IF FONT IS AUTO ADUJSTED, I AM GETTING THE SAME ORIGINAL FONT SIZE!!! 

     CGFloat fontCapHeightHalf = (self.font.capHeight/2)+5; 
      CGRect currentBounds = rect; 
     CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)-fontCapHeightHalf); 
     CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)+fontCapHeightHalf); 

     CGContextDrawLinearGradient(myContext, glossGradient, topCenter, midCenter, 0); 

     CGGradientRelease(glossGradient); 
     CGColorSpaceRelease(rgbColorspace); 
    CGContextRestoreGState(myContext); 
+1

thể trùng lặp của [Làm thế nào để tính toán kích thước của một UIFont khi văn bản trong nhãn bị hạn chế xuống để phù hợp với chiều rộng?] (Http: // stackoverflow.com/questions/1385338/how-to-calculate-the-size-of-a-uifont-when-text-in-label-is-constrained-down-to-f) –

+1

có, cảm ơn bạn đã chỉ cho tôi Đúng hướng. Tôi không tìm thấy nó trước khi đăng câu hỏi của tôi. –

Trả lời

17

Bạn không thể có được kích thước trực tiếp, nhưng bạn có thể tính toán nó dễ dàng sử dụng đủ these functions:

CGFloat actualFontSize; 
[label.text sizeWithFont:label.font 
      minFontSize:label.minimumFontSize 
      actualFontSize:&actualFontSize 
       forWidth:label.bounds.size.width 
      lineBreakMode:label.lineBreakMode]; 
+8

Không được chấp nhận trong iOS 7 mà không có thay thế. – openfrog

+0

@openfrog Tôi đã đăng một giải pháp thay thế tại đây sẽ hoạt động trên iOS 7 - http://stackoverflow.com/a/20829315/1445366 nó không đơn giản nhưng nó hoàn thành công việc. –

+0

@openfrog -sizeWithAttributes: là giải pháp thay thế. https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/sizeWithAttributes: –

2
CGSize size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation]; 
+2

Không được chấp nhận trong iOS 7. – openfrog

+1

Điều này có nghĩa là không có giải pháp nào bằng Swift? – Narwhal

2

câu trả lời của tôi là không phải là rất hữu ích cho các câu hỏi ban đầu, nhưng tôi kết thúc ở đây mỗi khi tôi tìm kiếm làm thế nào để có được kích thước phông chữ sau khi điều chỉnh tự động. Trước hết, sizeWithFont không được dùng nữa trong iOS 7.0, như chúng ta đều biết, vì vậy chúng tôi phải tìm một giải pháp khác.

Giải pháp của tôi phù hợp với trường hợp của tôi, trong đó tôi có hai nhãn, một nhãn có nhiều ràng buộc hơn và nhiều văn bản hơn nhãn thứ hai.

Đây là một bước-by-step dụ:

  • hai nhãn với cùng một chiều rộng và chiều dài văn bản khác nhau:

enter image description here

tôi muốn, lúc chạy-thời gian, kích thước phông chữ của uilabel chính được thay đổi kích thước và kích thước phông chữ thứ hai có cùng kích thước phông chữ.

  • giảm kích thước của cả nhãn, do đó nội dung của một đầu tiên phù hợp với khung hình, trong trường hợp này 12 cho cả hai:

enter image description here

enter image description here

  • sau khi thiết lập các ràng buộc vị trí (trong ví dụ của tôi, các nhãn nằm ở trung tâm của khung nhìn cha mẹ), cập nhật các khung của cả hai nhãn sao cho chúng phù hợp với văn bản chính xác:

enter image description here

  • thêm Aspect Ratio ràng buộc giữa chiều rộng và chiều cao đến cả nhãn và hạn chế chiều rộng giữa các nhãn chính và xem cha mẹ:

enter image description here

enter image description here

  • thêm các hạn chế chiều rộng từ nhãn thứ hai để nhãn chính:

enter image description here

enter image description here

  • bây giờ bạn có thể thiết lập kích thước phông chữ của nhãn như bạn muốn:

enter image description here

Đây là một ảnh chụp màn hình của Simulator:

enter image description here

Nhãn đầu tiên được thay đổi kích cỡ theo kích thước màn hình và kích thước phông chữ được điều chỉnh do. Kích thước phông chữ của nhãn thứ hai là như nhau do ràng buộc chiều rộng và các tham số của phông chữ được chỉ định trong hình ảnh cuối cùng.

Đây chỉ là một ví dụ nhằm mục đích giới thiệu "mẹo" đằng sau giải pháp của tôi: gắn khung của các nhãn ở kích thước phông chữ ban đầu, để nó sẽ giống nhau ở thời gian chạy. Tôi tưởng tượng rằng kỹ thuật này có thể được điều chỉnh lại cho các nhãn với kích thước biến là, chỉ bằng cách thêm các ràng buộc giữa các nhãn sau khi đã đặt văn bản và thay đổi kích thước khung cho vừa với văn bản.

0

giải pháp đơn giản này làm việc tốt cho một dòng UILabel:

//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