2011-08-05 37 views
11

Tôi có NSString và tôi muốn biết chiều cao của nó để tạo UILabel thích hợp.Lấy chiều cao NSString

Làm chiều cao

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
          forWidth:353.0 
        lineBreakMode:UILineBreakModeWordWrap]; 
float height = size.height; 

này bây giờ là 13.0. Nếu tôi sử dụng chuỗi này

NSString *string = @"this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example "; 

chiều cao luôn là 13,0 (và với 353 như chiều rộng, đó là không thể) ... những gì tôi làm sai?

ADD:

size.width; 

hoạt động tốt ... do đó, nó giống như nếu lineBreakMode là không đúng ... nhưng nó là, phải không?

+0

Bạn đang dùng kích thước từ chuỗi. đối tượng, không phải CGSize bạn vừa tạo. Đó có phải là lỗi đánh máy không? –

+0

nhưng 'sizeWithFont: forWidth: lineBreakMode' có một NSString (không phải là UILabel, ví dụ) ... vì vậy nó đúng ... hay không? – JAA

+0

Nó không mất nó, nói rằng, nó hoạt động trên nó, và cung cấp cho bạn trở lại một kích thước. Vì vậy, nếu bạn thay đổi 'float height = string.height;' thành 'float height = size.chiều cao, ', tôi đoán nó sẽ có ý nghĩa hơn. –

Trả lời

21

Lý do gì bạn đang làm không làm việc như bạn mong chờ là vì

– sizeWithFont:forWidth:lineBreakMode: 

là dành cho "Computing Metrics cho một dòng văn bản" trong khi

-sizeWithFont:constrainedToSize:lineBreakMode: 

là dành cho "Tính toán số liệu cho nhiều dòng văn bản". Từ documentation:

Metrics Computing cho một dòng chữ đơn

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Computing Metrics cho nhiều dòng văn bản

– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 

Hãy thử sử dụng -sizeWithFont:constrainedToSize:lineBreakMode: thay vào đó, ví dụ đây là những gì tôi thường làm:

CGSize maximumLabelSize = CGSizeMake(353,9999); 

CGSize expectedLabelSize = [string sizeWithFont:label.font       
           constrainedToSize:maximumLabelSize 
            lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame; 
newFrame.size.height = expectedLabelSize.height; 
label.frame = newFrame; 
+0

xin lỗi, tôi đã viết ở đây sai (bây giờ tôi đã chính xác)! Tất nhiên, trong Xcode nó đã đúng (và nhật ký là 13.0) – JAA

+0

CÓ! đó là công trình !! cảm ơn bạn!!! – JAA

+0

Đó chỉ là quá nhiều mã cho một cái gì đó có thể được thực hiện với một phương pháp duy nhất. Và tôi nhận được một downvote, lol. –

1

Theo Documentation

Phương pháp này trả về chiều rộng và chiều cao của chuỗi hạn chế để chiều rộng quy định. Mặc dù nó tính toán nơi ngắt dòng sẽ xảy ra , phương pháp này không thực sự quấn văn bản vào các dòng bổ sung. Nếu kích thước của chuỗi vượt quá chiều rộng đã cho, phương pháp này cắt ngắn văn bản (chỉ cho mục đích bố cục) bằng cách sử dụng chế độ ngắt dòng được chỉ định cho đến khi nó phù hợp với chiều rộng tối đa; sau đó trả lại kích thước của chuỗi bị cắt ngắn kết quả.

Bạn nên sử dụng - [NSString sizeWithFont: constrainedToSize: lineBreakMode:] trong đó có hành vi tương tự nhưng bạn có thể uuse CGFLOAT_MAX như chiều cao trong kích thước thông qua vào

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