2012-01-26 36 views
10

Tôi đang cố gắng bố cục văn bản trên UIView.iOS - Nhận chiều cao "thực" của một chữ cái

(Khu vực màu vàng là khung của UILabel có màu nền).

Khi tôi sử dụng sizeWithFont tôi có được điều này, trong đó có một không gian rất lớn trên bức thư:

p with sizeWithFont

Khi tôi sử dụng font.pointSize tôi có được điều này cho "i" mà là tốt-

p with font.pointSize

NHƯNG Khi tôi sử dụng nó cho "p" tôi nhận được chiều cao chính xác nhưng chữ cái được vẽ trong bo ttom và cắt.

p with font.pointSize

** Làm cách nào tôi có thể nhận được hình tượng chỉ ở giữa khung? **

Cảm ơn

Shani

Trả lời

18

Có rất nhiều tài sản trên UIFont để giúp trong tình huống này:

  • pointSize
  • ascender
  • descender
  • capHeight
  • xHeight
  • lineHeight
+2

Sẽ rất tuyệt khi có một bức ảnh để rõ ràng tất cả những gì chúng được định nghĩa là. Ví dụ, không pointSize == ascender + descender và là ascender> = capHeight? – Matt

+4

@Matt, đó là một oldy, nhưng tôi tìm thấy hình ảnh trên https://www.cocoanetics.com/2010/02/understanding-uifont/ rất hữu ích. – Roy

3

Bạn có thể chuyển đổi các UILabel đến một UIImage với một loại "PrintScreen" chức năng và sau đó kiểm tra các điểm ảnh từng người một (với ví dụ: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?) và ' tính 'phía trên bên trái vi phía dưới bên phải.

+0

nó chắc chắn là không cần thiết để chuyển đổi nhãn cho một UIImage, câu trả lời được cung cấp bởi Jeff Kelly là tốt hơn. Có nhiều thuộc tính có thể giúp bạn xác định chiều cao chính xác của một UILabel –

+1

Tôi không đồng ý. Đối với một số phông chữ, chiều cao mỗi vốn (capHeight) khác nhau cho mỗi ký tự (xem http://bit.ly/OtdxOe). Các @properties khác của lớp 'UIFont' có cùng 'vấn đề'. Tôi đã có một vấn đề tương tự khi phát triển một cái gì đó trong flash/as3. "Đếm pixel" đã làm cho tôi ở cuối. – basvk

2

Thử di chuyển văn bản trở lên bằng font.ascender - font.capHeight. Việc thu hẹp chiều cao của một nhãn UILabel có thể sẽ nén nội dung của nó, vì vậy tốt hơn là điều chỉnh vị trí y của nhãn thay vì thay đổi kích thước.

Mẫu mã sau đây giải thích việc tính toán tôi đã sử dụng:

// in UILabel subclass: 
- (CGFloat) topPadding 
{ 
    // ascender = height from baseline to top of label (including top padding) 
    // capHeight = height of a capital letter = ascender - top padding 
    // -> top padding = ascender - capHeight 
    return self.font.ascender - self.font.capHeight; 
} 
Các vấn đề liên quan