2011-02-05 29 views
13

Có tương đương với phương pháp sizeWithFont: của NSString có thể được sử dụng để tính chiều cao của văn bản trong UITectView cho một chiều rộng nhất định không? Tất cả các phương pháp từ NSString chỉ hoạt động trên một dòng từ những gì tôi có thể nói.Kích thước NSStringWithFont: cho nhiều dòng?

Trả lời

33

Từ Apple's reference cho các phương pháp NSString này, bạn có thể sử dụng -sizeWithFont:constrainedToSize: hoặc -sizeWithFont:constrainedToSize:lineBreakMode: cho "Số liệu tính toán cho nhiều dòng văn bản".

CGSize size = [theString sizeWithFont:font 
        constrainedToSize:CGSizeMake(width, 100000)]; 
return size.height; 
+0

Đó chính xác là những gì tôi đã sử dụng để xác định chiều cao của nhiều dòng. Về cơ bản bạn chỉ cần thiết lập chiều cao có thể cho một số giá trị thực sự lớn, và lấy lại kích thước thực tế phù hợp với văn bản được bao bọc thành nhiều dòng. –

+13

Điều này dường như trả về một giá trị 1-2 dòng quá nhỏ. Bất kỳ ý tưởng tại sao? – Jumhyn

+0

@Jumhyn: Hãy thử phương thức '-drawInRect:' để vẽ chuỗi ra để kiểm tra xem nó có kết thúc tốt đẹp ở đúng vị trí hay không. – kennytm

4

Đối UITextView, tất cả các bạn phải làm là gọi -sizeToFit trên quan điểm, và nó sẽ tự động thay đổi kích thước chiều cao của nó cho đến khi nó có thể phù hợp với tất cả các văn bản có sẵn. Tất cả những gì bạn cần làm là đặt chiều rộng của chế độ xem văn bản, đặt văn bản, sau đó gọi -sizeToFit. Chế độ xem văn bản sẽ thay đổi kích thước chiều cao của nó vừa đủ để vừa với tất cả văn bản.

UPDATE:

Rõ ràng văn bản quan điểm chỉ co lại khi có chiều cao quá mức, nhưng họ không phát triển nếu có đủ chiều cao để hiển thị tất cả các văn bản. Ngoài ra, khi bạn gọi số -sizeToFit, tọa độ y của chế độ xem văn bản được đặt lại về 0.0f. Vì vậy, đây là những gì bạn làm:

CGFloat textViewWidth = 300.0f; 
CGFloat textViewPadding = 10.0f; 

UITextView * textView = [[[UITextView alloc] init] autorelease]; 
textView.text = ...; // Really long string 
textView.frame = CGRectMake(0.0f, 0.0f, textViewWidth, CGFLOAT_MAX); 

[textView sizeToFit]; // Shrinks the height to fit all the text 

textView.frame = CGRectMake(textViewPadding, textViewPadding, 
    textViewWidth, textView.frame.size.height); 

[self.view addSubview:textView]; 

Trước tiên, bạn đặt khung hình để bạn có thể đặt chiều rộng như bạn muốn. Bạn sử dụng CGFLOAT_MAX để hiển thị khá nhiều chiều cao vô hạn. Tiếp theo, gọi -sizeToFit sẽ thu nhỏ chiều cao cho đến khi nó vừa với tất cả văn bản. Tuy nhiên, nó cũng reset y phối hợp, vì vậy chúng tôi đi trước và thiết lập các khung một lần nữa để cấu hình xy tọa độ trong ví dụ này, 10.0f cho cả xy -, để lại chiều rộng một mình và giữ chiều cao thiết lập để bất cứ điều gì -sizeToFit được tính toán.

+0

Dường như không thay đổi gì cả. – Jumhyn

+0

Tôi đã làm rõ cách 'UITextView' thực sự hoạt động. Làm điều gì đó giống như mã mẫu tôi đã thêm vào sẽ dẫn đến chế độ xem văn bản đủ cao để vừa với tất cả văn bản. – LucasTizma

+0

CGFLOAT_MAX đã gây ra một số sự thất bại/rách rùng rợn trên iPhone 5.1 khi UITextView từ chối phản hồi đầu tiên và UITableView cuộn trở lại đầu trang. Một số nhỏ hơn như 1024.0f (mặt dài của iPad) đã sửa nó cho tôi. –

1

thực sự, bạn có thể sử dụng thuộc tính contentSize.

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