Tôi muốn thêm suy nghĩ của mình vì tôi có cùng một vấn đề.
Tôi đã sử dụng UITextView
vì nó có căn chỉnh văn bản đẹp hơn (biện minh, vào thời điểm đó không có sẵn UILabel
), nhưng để "mô phỏng" không tương tác-không thể cuộnUILabel
, tôi sẽ tắt hoàn toàn cuộn, nảy và tương tác người dùng .
Tất nhiên, vấn đề là văn bản đó là động và trong khi chiều rộng sẽ được cố định, chiều cao sẽ được tính toán lại mỗi khi tôi đặt giá trị văn bản mới.
boundingRectWithSize
Tôi hoàn toàn không làm việc tốt với tôi, từ những gì tôi có thể thấy, UITextView
đã thêm một số lề trên đầu mà boundingRectWithSize
không thể đếm được, do đó, chiều cao được lấy từboundingRectWithSize
nhỏ hơn mức cần thiết.
Vì văn bản không được cập nhật nhanh chóng, nên nó chỉ được sử dụng cho một số thông tin có thể cập nhật sau mỗi 2-3 giây nhiều nhất, tôi đã quyết định phương pháp sau:
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
* Mã trên không được sao chép trực tiếp từ nguồn của tôi, tôi đã phải điều chỉnh / xóa nó khỏi một loạt các thứ khác không cần thiết cho bài viết này. Đừng lấy nó để sao chép-dán-và-nó-sẽ-làm việc-mã.
Bất lợi rõ ràng là nó có phân bổ và phát hành, cho mỗi cuộc gọi.
Nhưng, ưu điểm là bạn tránh được tùy thuộc vào khả năng tương thích giữa cách ràng buộcRectWithSize vẽ văn bản và tính toán kích thước của nó và triển khai bản vẽ văn bản trong UITextView
(hoặc UILabel
bạn cũng có thể sử dụng thay thế UITextView
bằngUILabel
). Bất kỳ "lỗi" nào mà Apple có thể có đều tránh được.
Tái bút: Có vẻ như bạn không cần "temp" này UITextView
và chỉ có thể hỏi sizeThatFits
trực tiếp từ mục tiêu, tuy nhiên điều đó không hiệu quả với tôi. Mặc dù logic sẽ nói rằng nó nên hoạt động và phân bổ / giải phóng tạm thời UITextView
là không cần thiết, nhưng không. Nhưng giải pháp này hoạt động hoàn hảo cho bất kỳ văn bản nào tôi sẽ đặt.
lineBreakMode
?