2014-11-20 12 views
9

Tôi đang cố gắng căn giữa theo chiều dọc UITextView bằng cách sử dụng chiều cao thích hợp được lấy từ sizeThatFits. Có rất nhiều câu trả lời khác cho thấy đây là cách thích hợp nhất để tính toán điều này.Kích thước iOS 8 sizeThatFits cho văn bản UITextView không trả lại chiều cao chính xác (Tự động điền)

(Lưu ý rằng tôi đã thử cả hai với các chuỗi đơn giản và được phân bổ và cả hai đều có cùng hành vi).

Không có vấn đề gì tôi cố gắng (thậm chí sử dụng chuỗi được gán và đặt kích thước phông chữ hoặc chiều cao dòng thành thứ gì đó lớn hơn hoặc nhỏ hơn) nó luôn chỉ hiển thị một số ký tự bị cắt bớt nhất định (trong trường hợp này, 3 dòng và luôn chính xác như nhau). Tôi đang thiếu gì?

_textView.text = [_collectionDescription lowercaseString]; 
_textView.font = [UIFont fontLight:22]; 
_textView.textColor = [UIColor whiteColor]; 
_textView.textAlignment = NSTextAlignmentCenter; 
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height); 

[_textView setNeedsDisplay]; 
[_textView updateConstraints]; 
+0

Bạn đã bao giờ tìm được câu trả lời làm việc chưa? Tôi đang có một thời gian điên rồ nhận được sizeThatFits để làm việc liên tục bất kể kích thước của văn bản. Đôi khi nó để lại thêm không gian ở phía dưới (không snug), và đôi khi có thêm không gian nhưng thiếu dòng cuối cùng của văn bản. Có gì không? – pizzafilms

+0

Xem câu trả lời dưới đây;) – brandonscript

+0

'sizeThatFits:' không được chấp nhận trong iOS 8 – fabb

Trả lời

15

Như thường lệ với AutoLayout, bạn phải làm:

[_textInfoView layoutIfNeeded]; 

(thậm chí không cần setNeedsDisplay ở tất cả).

Vì vậy, hoàn toàn làm việc:

_textView.text = [_collectionDescription lowercaseString]; 
_textView.font = [UIFont fontLight:22]; 
_textView.textColor = [UIColor whiteColor]; 
_textView.textAlignment = NSTextAlignmentCenter; 
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height); 

[_textView layoutIfNeeded]; 
[_textView updateConstraints]; 
+0

Khi sử dụng Bố cục Tự động, chỉ cần gọi '[_textView setNeedsUpdateConstraints]' và bố cục sẽ được kích hoạt bằng cách cập nhật ràng buộc. Khi sử dụng bố cục thủ công, chỉ cần gọi '[_textView setNeedsLayout]' và không cần phải gọi 'layoutIfNeeded', sẽ được thực hiện tự động. –

0

Thay vì sử dụng sizeThatFits: phương pháp, bạn có thể sử dụng phương pháp sau đây: bạn cũng có thể thử điều này:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]}; 
// NSString class method: boundingRectWithSize:options:attributes:context is 
// available only on ios7.0 sdk. 
NSString *text = _textView.text; 
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:attributes 
           context:nil]; 
_constraintTextViewHeight.constant = CGRectGetHeight(rect) 

Phương pháp này cũng cân nhắc ngắt dòng trong chuỗi text

+3

NSDictionary * attributes = @ {NSFontAttributeName: textView.font}; sẽ tốt hơn :) –

+0

boundingRectWithSize cũng không trả lại số chính xác. Vì vậy, tôi muốn tránh giải pháp đó –

+0

Tôi đã có kết quả tương tự với sizeThatFits: và boundingRectWithSize :. Cả hai đều trả về kết quả sai. – delta2flat

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