Cập nhật cho năm 2019
Đây là một trong những lỗi nhỏ nhất trong iOS.
Các lớp được đưa ra ở đây, UITextViewFixed
thường là một giải pháp hợp lý nhất.
Đây là lớp học:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Đừng quên tắt cuộn Đã bật trong Thanh tra!
Giải pháp hoạt động đúng trong bảng phân cảnh
Giải pháp hoạt động đúng khi chạy
Thế là xong, bạn đã hoàn thành.
Nói chung, đó nên là tất cả những gì bạn cần trong hầu hết các trường hợp .
Ngay cả khi bạn đang thay đổi chiều cao của chế độ xem văn bản một cách nhanh chóng , UITextViewFixed
thường thì tất cả những gì bạn cần.
(Một ví dụ phổ biến về việc thay đổi chiều cao một cách nhanh chóng, là thay đổi nó theo kiểu người dùng.)
Đây là UITextView bị hỏng từ Apple ...
Đây là UITextViewFixed
:
Lưu ý rằng tất nhiên bạn phải
tắt cuộn Được bật trong Thanh tra!
Đừng quên tắt cuộn. :)
Một số vấn đề khác
(1) Trong một số trường hợp bất thường - ví dụ: một số trường hợp bảng có chiều cao di động linh hoạt, thay đổi linh hoạt - Apple thực hiện một điều kỳ quái: Họ thêm không gian ở phía dưới . Không, thực sự! Đây sẽ phải là một trong những điều gây phẫn nộ nhất trong iOS.
Dưới đây là một "sửa chữa nhanh" để thêm vào những điều trên thường giúp ích cho sự điên rồ đó.
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but you can sometimes use this
// to fix the "extra space at the bottom" insanity
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) Đôi khi, để khắc phục một lỗi lộn xộn khác của Apple, bạn phải thêm điều này:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) Có thể cho rằng, chúng ta nên thêm:
contentInset = UIEdgeInsets.zero
chỉ sau .lineFragmentPadding = 0
trong UITextViewFixed
.
Tuy nhiên ... tin hay không ... nó chỉ không hoạt động trong iOS hiện tại! (Đã kiểm tra vào năm 2019.) Có thể cần phải thêm dòng đó trong tương lai.
Thực tế UITextView
bị hỏng trong iOS là một trong những điều kỳ lạ nhất trong tất cả các máy tính di động. Kỷ niệm mười năm của câu hỏi này và nó vẫn chưa được sửa!
Cuối cùng, đây là một mẹo tương tự cho Trường văn bản : https://stackoverflow.com/a/43099816/294884
Mẹo hoàn toàn ngẫu nhiên: cách thêm "..." vào cuối
Thường thì bạn đang sử dụng UITextView "giống như một UILabel". Vì vậy, bạn muốn nó cắt bớt văn bản bằng dấu chấm lửng "..."
Nếu vậy, hãy thêm một dòng mã thứ ba trong "thiết lập":
textContainer.lineBreakMode = .byTruncatingTail
Mẹo tiện dụng nếu bạn muốn có chiều cao bằng không, khi nào, không có văn bản nào cả
Thường thì bạn sử dụng chế độ xem văn bản để chỉ hiển thị văn bản. Vì vậy, người dùng thực sự không thể chỉnh sửa bất cứ điều gì. Bạn sử dụng các dòng "0" để có nghĩa là chế độ xem văn bản sẽ tự động thay đổi chiều cao tùy thuộc vào số lượng dòng văn bản.
Điều đó thật tuyệt, nhưng nếu không có văn bản nào cả thì thật không may, bạn có cùng chiều cao như thể có một dòng văn bản !! Chế độ xem văn bản không bao giờ "biến mất".
Nếu bạn muốn nó "biến mất", chỉ cần thêm nó
override var intrinsicContentSize: CGSize {
var i = super.intrinsicContentSize
print("for \(text) size will be \(i)")
if text == "" { i.height = 1.0 }
print(" but we changed it to \(i)")
return i
}
(Tôi đã làm cho nó '1' vì vậy rõ ràng những gì đang diễn ra, '0' vẫn ổn.)
Thế còn UILabel?
Khi chỉ hiển thị văn bản, UILabel có nhiều lợi thế hơn UITextView. UILabel không gặp phải các vấn đề được mô tả trên trang QA này. Thật vậy, lý do tất cả chúng ta thường "từ bỏ" và chỉ sử dụng UITextView là UILabel rất khó để làm việc. Đặc biệt, thật khó khăn khi chỉ thêm phần đệm , chính xác, vào UILabel. Trên thực tế, đây là một cuộc thảo luận đầy đủ về cách "cuối cùng" thêm chính xác phần đệm vào UILabel: https://stackoverflow.com/a/58876988/294884 Trong một số trường hợp nếu bạn đang thực hiện một bố cục khó khăn với các ô có chiều cao động, đôi khi tốt hơn để làm điều đó một cách khó khăn với UILabel.