Đặt contentInset
có thể giúp văn bản xuất hiện chính xác hơn trong số UITextView
. Tuy nhiên, nó sẽ không giúp giải quyết vấn đề theo đó UITextView
đã bật tính năng cuộn mặc dù không có nhiều văn bản hơn để xem.
Tương tự, các phương pháp như sizeWithFont
có giới hạn. Như được giải thích trong loạt blog tuyệt vời của Mike Weller iOS Development: You're Doing It Wrong, NSString
không phải là một đối tượng tốt để hỏi về mức độ lớn của UIView
. Nhiều lớp học UIView
các lớp con như UILabel
, UIButton
, v.v. có insets và các cân nhắc khác phải được tính trong quá trình định cỡ. UITextLabel
cũng không ngoại lệ.
mục cụ thể Mike Weller về đề tài này là:
You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]
iOS 7 hứa với chúng ta xử lý văn bản phức tạp hơn trong UITextView
, với những đặc tính như textContainerInset
. Nhưng phải làm gì trong thời gian chờ đợi?
Trước tiên, chúng tôi biết rằng UITextView
là một phân lớp của UIScrollView
.Do đó, quy tắc vàng rằng nếu contentSize
lớn hơn thuộc tính bounds
của chế độ xem, chế độ xem cuộn sẽ cuộn để chúng tôi có thể xem thêm nội dung.
Kiểm tra contentSize
lần nữa bounds
sẽ không hoạt động vì chúng tôi biết rằng UIScrollView
đang tính xem có cuộn hay không dựa trên văn bản và câu trả lời sai cho chúng tôi.
Đây là nơi các giá trị điều chỉnh tùy ý đến để giải cứu! Đối với tôi, giá trị này là 17.f
. Đối với bạn - tùy thuộc vào phông chữ của bạn - nó có thể khác nhau. Sau đó, chúng tôi kiểm soát và quyết định xem chúng tôi có cho phép chế độ xem cuộn để cuộn hay không:
static const CGFloat kArbritaryHeight = 17.f;
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight;
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds);
BOOL tooMuchContent = adjustedContentHeight > boundsHeight;
if (tooMuchContent)
{
myTextView.scrollEnabled = YES;
}
else
{
myTextView.scrollEnabled = NO;
}
Nguồn
2013-10-15 14:12:01