2015-04-15 22 views

Trả lời

15

Như đã nêu, tôi gặp phải sự cố rất khó chịu khi phông chữ tùy chỉnh trong UILabel bị cắt do nội dung nào đó. Sau đó tôi phát hiện ra nó là do ascenders and descenders (đặc điểm phông chữ).

Sau khi tìm kiếm nhiều, tôi đã tìm thấy solution yêu cầu bạn tải xuống chương trình, điều chỉnh độ nghiêng và giảm dần của phông chữ bằng cách sử dụng thiết bị đầu cuối và sau đó thử nghiệm trên ứng dụng của bạn cho đến khi hoàn hảo.

Điều này sẽ ổn nếu tôi không phải thực hiện việc này cho hơn 20 phông chữ. Vì vậy, tôi quyết định tìm hiểu và xem liệu tôi có thể truy cập vào các giá trị ascender và descender của phông chữ hay không. Hóa ra UIFont có những thuộc tính chính xác đó!

Với thông tin đó, tôi có thể phân lớp UILabel và điều chỉnh khung động bằng cách thêm giá trị ascender và descender (sử dụng giá trị tuyệt đối vì nó âm) với chiều cao của nó.

Dưới đây là một đoạn mã thực hiện dưới đây, dòng cuối cùng là dòng tiền:

UIFont *font = [UIFont fontWithName:nameOfFontUsed size:44.0]; 
NSDictionary *attrsDict = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; 
NSMutableAttributedString *theString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@", enteredString] attributes:attrsDict]; 

//Add other attributes you desire 

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping; 
paragraphStyle.lineHeightMultiple = 5.0; 
[theString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [theString length])]; 

[self setAttributedText:theString]; 

[self sizeToFit]; 

[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height+font.ascender+ABS(font.descender))]; 
+2

Tôi hiểu bạn subclassed các UILabel. Bạn đã ghi đè phương thức nào và đặt mã ở trên? – mixtly87

+0

Đã lưu ngày của tôi! Cảm ơn. –

2

Cố gắng ghi đè bất động sản intrinsicContentSize trong UILabel.

Tôi không nghĩ đây là phương pháp hay nhất, nhưng dễ giải quyết vấn đề trong một số trường hợp.

Ví dụ cho Swift 3

class ExpandedLabel: UILabel { 

    override var intrinsicContentSize: CGSize { 

    let size = super.intrinsicContentSize 

    // you can change 'addedHeight' into any value you want. 
    let addedHeight = font.pointSize * 0.3 

    return CGSize(width: size.width, height: size.height + addedHeight) 
    } 
} 
Các vấn đề liên quan