Tôi sẽ đăng giải pháp đúng ở cuối trang trong trường hợp ai đó đủ can đảm (hoặc đủ tuyệt vọng) để đọc đến thời điểm này.
Đây là repo gitHub cho những người không muốn đọc tất cả văn bản đó: resizableTextView
Điều này hoạt động với iOs7 (và tôi tin rằng nó sẽ hoạt động với iOs8) và với tính năng tự động thanh toán. Bạn không cần số ma thuật, vô hiệu hóa bố cục và những thứ như thế. Giải pháp ngắn gọn và thanh lịch.
Tôi nghĩ rằng, tất cả các mã liên quan đến ràng buộc nên đi đến updateConstraints
phương thức. Vì vậy, hãy làm cho riêng mình ResizableTextView
.
Vấn đề đầu tiên chúng tôi gặp ở đây là không biết kích thước nội dung thực trước viewDidLoad
phương thức. Chúng tôi có thể đi đường dài và lỗi và tính toán dựa trên kích thước phông chữ, ngắt dòng, v.v. Nhưng chúng tôi cần giải pháp mạnh mẽ, vì vậy chúng tôi sẽ làm:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Vì vậy, bây giờ chúng tôi biết nội dung thực sự Kích thước bất kể chúng tôi đang ở đâu: trước hoặc sau viewDidLoad
. Bây giờ thêm ràng buộc chiều cao trên textView (thông qua bảng phân cảnh hoặc mã, bất kể như thế nào). Chúng tôi sẽ điều chỉnh giá trị đó với contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Điều cuối cùng cần làm là nói với siêu lớp updateConstraints
.
[super updateConstraints];
Bây giờ lớp chúng tôi trông như:
ResizableTextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
Đẹp và sạch sẽ đúng không? Và bạn không phải đối phó với mã đó trong bộ điều khiển của bạn !
Nhưng chờ đã!
Y KHÔNG CÓ ĐỘNG VẬT!
Bạn có thể dễ dàng tạo hiệu ứng thay đổi để làm cho textView
kéo dài trơn tru. Đây là một ví dụ:
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];