2012-12-01 36 views
18

Tôi muốn sử dụng UILabel chuẩn và tăng kích thước phông chữ để nó lấp đầy không gian dọc. Lấy cảm hứng từ câu trả lời chấp nhận cho question này, tôi định nghĩa một lớp con trên UILabel với thực hiện drawRect này:Mở rộng kích thước phông chữ để vừa với chiều dọc trong UILabel

- (void)drawRect:(CGRect)rect 
{ 
    // Size required to render string 
    CGSize size = [self.text sizeWithFont:self.font]; 

    // For current font point size, calculate points per pixel 
    float pointsPerPixel = size.height/self.font.pointSize; 

    // Scale up point size for the height of the label 
    float desiredPointSize = rect.size.height * pointsPerPixel; 

    // Create and assign new UIFont with desired point Size 
    UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize]; 
    self.font = newFont; 

    // Call super 
    [super drawRect:rect]; 
} 

Nhưng điều này không làm việc vì nó quy mô font ngoài phía dưới của nhãn. Nếu bạn muốn tái tạo điều này, tôi bắt đầu với một nhãn 289x122 (w x h), Helvetica làm phông chữ và một điểm bắt đầuKích thước 60 phù hợp với nhãn thoải mái. Dưới đây là ví dụ đầu ra từ UILabel tiêu chuẩn và lớp con của tôi bằng cách sử dụng chuỗi "{Hg":

uilabel

uilabel subclass

Tôi đã nhìn xuống của phông chữ và ascenders, cố gắng mở rộng quy mô tham gia này vào tài khoản trong các kết hợp khác nhau, nhưng vẫn chưa có bất kỳ may mắn nào. Bất kỳ ý tưởng, là điều này để làm với phông chữ khác nhau có thay đổi descender và ascender độ dài?

Trả lời

12

tính của bạn cho pointsPerPixel là cách sai lên, nó phải là ...

float pointsPerPixel = self.font.pointSize/size.height; 

Ngoài ra, có lẽ mã này phải ở trong layoutSubviews như lần duy nhất phông chữ nên được thay đổi là khi kích thước khung thay đổi.

+1

cũng ... đó là một sai lầm đáng xấu hổ đơn giản. Cảm ơn vì đã phát hiện ra nó. – user524261

+0

Tôi đã thử triển khai nó trong 'layoutSubviews', nhưng tôi không nghĩ nó hoạt động. Tôi nghĩ lý do là việc gán một phông chữ mới cho lớp con 'UILabel' sẽ kích hoạt một lời gọi khác của' layoutSubviews', điều này có vấn đề. Trong quá trình thực hiện của tôi, một trong những hàng đợi của ứng dụng của tôi đã bị khóa. – user444731

0

Tôi tự hỏi nếu lỗi làm tròn của nó có nhích lên đến kích thước phông chữ lớn hơn tiếp theo hay không. Có thể bạn chỉ cần quy mô rec.size.height một chút? Một cái gì đó như:

float desiredPointSize = rect.size.height *.90 * pointsPerPixel; 

Cập nhật: tính pointPerPixel của bạn là ngược. Bạn thực sự chia các pixel theo các điểm phông chữ, thay vì các điểm theo Điểm ảnh. Trao đổi chúng và nó hoạt động mọi lúc. Chỉ cần cho triệt để, đây là đoạn code mẫu tôi thử nghiệm:

//text to render  
NSString *soString = [NSString stringWithFormat:@"{Hg"]; 
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12]; 

//box to render in 
CGRect rect = soLabel.frame; 

//calculate number of pixels used vertically for a given point size. 
//We assume that pixel-to-point ratio remains constant. 
CGSize size = [soString sizeWithFont:soFont]; 
float pointsPerPixel; 
pointsPerPixel = soFont.pointSize/size.height; //this calc works 
//pointsPerPixel = size.height/soFont.pointSize; //this calc does not work 

//now calc which fontsize fits in the label 
float desiredPointSize = rect.size.height * pointsPerPixel; 
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize]; 

//and update the display 
[soLabel setFont:newFont]; 
soLabel.text = soString; 

Đó quy mô và phù hợp với bên trong hộp nhãn cho mỗi kích thước tôi thử nghiệm, từ 40pt để phông chữ 60pt. Khi tôi đảo ngược phép tính, tôi thấy kết quả tương tự với phông chữ quá cao đối với hộp.

+0

Không làm tròn số nguyên vì chúng tôi đang sử dụng giá trị float pointSize. Mặc dù vậy, các fontSize là ra bởi nhiều hơn một pointSize toàn bộ. Đồng ý rằng bạn có thể thu nhỏ lại theo một yếu tố, nhưng điều này là nhiều hơn một fudge hơn là một tính toán chính xác và thay đổi theo phông chữ. – user524261

Các vấn đề liên quan