2012-05-02 7 views

Trả lời

17

OK, vì vậy cho bất cứ ai nghĩ rằng một lần lặp là không thể tránh được:

NSString *string = @"The string to render"; 
CGRect rect = imageView.frame; 

UIFont *font = [UIFont fontWithSize:12.0]; // find the height of a 12.0pt font 
CGSize size = [string sizeWithFont:font]; 
float pointsPerPixel = 12.0/size.height; // compute the ratio 
// Alternatively: 
// float pixelsPerPoint = size.height/12.0; 
float desiredFontSize = rect.size.height * pointsPerPixel; 
// Alternatively: 
// float desiredFontSize = rect.size.height/pixelsPerPoint; 

desiredFontSize sẽ chứa các kích thước phông chữ trong điểm trong đó chiều cao là chính xác giống như chiều cao của hình chữ nhật quy định . Bạn có thể muốn nhân nó bằng cách nói, 0,8 để làm cho phông chữ nhỏ hơn một chút so với kích thước thực tế của rect để làm cho nó trông tốt.

+0

Điều này dường như không hoạt động đáng tin cậy - tôi đã bắt đầu một câu hỏi riêng [ở đây] (http://stackoverflow.com/questions/13663924/scaling-font-size-to-fit-vertically-in-uilabel). – user524261

+0

@ user524261 Câu hỏi hay, +1 cho điều đó. –

+0

Tôi có thể đặt kích thước thành 6.88 pt không? –

1

Từ đây

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Operations/Operations.html

CGFloat GetLineHeightForFont(CTFontRef iFont) 
{ 
    CGFloat lineHeight = 0.0; 

    check(iFont != NULL); 

    // Get the ascent from the font, already scaled for the font's size 
    lineHeight += CTFontGetAscent(iFont); 

    // Get the descent from the font, already scaled for the font's size 
    lineHeight += CTFontGetDescent(iFont); 

    // Get the leading from the font, already scaled for the font's size 
    lineHeight += CTFontGetLeading(iFont); 

    return lineHeight; 
} 

Để sử dụng, đoán kích thước điểm, thấy nó là chiều cao dòng (bạn có thể hoặc không thể quan tâm hàng đầu). Sau đó sử dụng tỷ lệ giữa câu trả lời và chiều cao bạn phải mở rộng kích thước điểm. Tôi không nghĩ rằng bạn được đảm bảo rằng chiều cao sẽ chính xác - nếu bạn quan tâm đến nó chính xác, bạn phải lặp lại cho đến khi nó đủ gần (sử dụng kích thước mới như dự đoán mới).

+0

Điều đó không trả lời câu hỏi của anh ấy. Anh ấy đang cố gắng để có được kích thước phù hợp cho một phông chữ dựa trên chiều cao cụ thể, không tìm ra độ cao của phông chữ. Ngoài ra còn có một thuộc tính UIFont gọi là 'lineHeight' mà gần như chắc chắn có cùng một sự thực thi giống nhau. – mbm29414

+0

Tôi đã cập nhật thông tin về cách sử dụng tính năng này. –

+1

Tại sao không chỉ UIFont đối tượng và gọi '[font lineHeight]'? – mbm29414

0

Lưu ý: Điều này làm cho giả định rằng kích thước phông chữ của bạn sẽ luôn nhỏ hơn kích thước điểm của CGRect. Điều chỉnh các phương thức cần thiết để sửa cho giả định đó.

Hãy thử điều này. Hoạt động với bất kỳ phương pháp nào trong 3 phương pháp chính để tạo phông chữ. Nên khá tự giải thích, nhưng tăng là số tiền bạn muốn giảm giữa các lần kiểm tra. Nếu bạn không quan tâm về kích thước chính xác, hãy làm cho con số đó lớn hơn để có tốc độ nhanh hơn. Nếu bạn quan tâm, hãy làm cho nó nhỏ hơn để có độ chính xác cao hơn.

- (UIFont *)systemFontForRectHeight:(CGFloat)height 
          increment:(CGFloat)increment { 

    UIFont *retVal = nil; 
    for (float i = height; i > 0; i = i - increment) { 
     retVal = [UIFont systemFontOfSize:i]; 
     if ([retVal lineHeight] < height) break; 
    } 
    return retVal; 
} 
- (UIFont *)boldSystemFontForRectHeight:(CGFloat)height 
           increment:(CGFloat)increment { 

    UIFont *retVal = nil; 
    for (float i = height; i > 0; i = i - increment) { 
     retVal = [UIFont boldSystemFontOfSize:i]; 
     if ([retVal lineHeight] < height) break; 
    } 
    return retVal; 
} 

- (UIFont *)fontNamed:(NSString *)name 
     forRectHeight:(CGFloat)height 
      increment:(CGFloat)increment { 

    UIFont *retVal = nil; 
    for (float i = height; i > 0; i = i - increment) { 
     retVal = [UIFont fontWithName:name size:i]; 
     if ([retVal lineHeight] < height) break; 
    } 
    return retVal; 
} 
+0

điều này cực kỳ kém hiệu quả .. –

+0

Tại sao bạn lại nói vậy? Nó bắt đầu với một giá trị được biết là gần giá trị mong muốn cuối cùng (chiều cao của hình chữ nhật) và cho phép người dùng xác định độ chính xác mong muốn để ảnh hưởng đến tốc độ. Bạn sẽ làm điều này như thế nào? – mbm29414

+0

Như câu trả lời khác. Đoán kích thước ban đầu, sau đó sử dụng phép chia + nhân với tỷ lệ tìm thấy để tính kích thước đã cho.Đây là O (1), và đưa ra một câu trả lời luôn đúng, bạn là O cần thiết (n) và có khả năng nó sẽ không trả lời đúng nếu cỡ chữ mong muốn không phải là bội số nguyên của 1pt. –