Mutakhir untuk 2019
Ini adalah salah satu bug paling konyol di iOS.
Kelas yang diberikan di sini, UITextViewFixed
biasanya merupakan solusi paling masuk akal secara keseluruhan.
Ini kelasnya:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Jangan lupa untuk mematikan scrollEnabled di Inspektur!
Solusinya bekerja dengan baik di storyboard
Solusinya bekerja dengan baik saat runtime
Itu dia, sudah selesai.
Secara umum, itu harus menjadi semua yang Anda butuhkan dalam banyak kasus .
Bahkan jika Anda mengubah ketinggian tampilan teks dengan cepat , UITextViewFixed
biasanya melakukan semua yang Anda butuhkan.
(Contoh umum mengubah ketinggian dengan cepat, mengubahnya sebagai tipe pengguna.)
Ini adalah UITextView dari Apple yang rusak ...
Ini adalah UITextViewFixed
:
Perhatikan bahwa tentu saja Anda harus
matikan scrollEnabled di Inspektur!
Jangan lupa mematikan scrollEnabled! :)
Beberapa masalah lebih lanjut
(1) Dalam beberapa kasus yang tidak biasa - misalnya, beberapa kasus tabel dengan fleksibel, ketinggian sel yang berubah secara dinamis - Apple melakukan hal yang aneh: Mereka menambah ruang ekstra di bagian bawah . Tidak benar-benar! Ini harus menjadi salah satu hal yang paling menyebalkan di iOS.
Ini adalah "perbaikan cepat" untuk menambahkan hal-hal di atas yang biasanya membantu kegilaan itu.
...
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) Kadang-kadang, untuk memperbaiki kekacauan Apple yang lain, Anda harus menambahkan ini:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) Dapat diperdebatkan, kita harus menambahkan:
contentInset = UIEdgeInsets.zero
setelah .lineFragmentPadding = 0
di UITextViewFixed
.
Namun ... percaya atau tidak ... itu tidak berfungsi di iOS saat ini! (Dicentang pada 2019.) Mungkin perlu menambahkan baris itu di masa mendatang.
Fakta yang UITextView
rusak di iOS adalah salah satu hal paling aneh di semua komputasi mobile. Sepuluh tahun ulang tahun pertanyaan ini dan masih belum diperbaiki!
Akhirnya, inilah tip yang agak mirip untuk Bidang Teks : https://stackoverflow.com/a/43099816/294884
Tip yang sepenuhnya acak: bagaimana cara menambahkan "..." di bagian akhir
Seringkali Anda menggunakan UITextView "like a UILabel". Jadi Anda ingin memotong teks menggunakan elipsis "..."
Jika demikian, tambahkan baris kode ketiga di "pengaturan":
textContainer.lineBreakMode = .byTruncatingTail
Tip berguna jika Anda ingin tinggi nol, padahal tidak ada teks sama sekali
Seringkali Anda menggunakan tampilan teks untuk hanya menampilkan teks. Jadi, pengguna tidak dapat mengedit apa pun. Anda menggunakan baris "0" yang berarti tampilan teks akan secara otomatis mengubah ketinggian tergantung pada berapa banyak baris teks.
Itu bagus, tetapi jika tidak ada teks sama sekali maka sayangnya Anda mendapatkan ketinggian yang sama seperti jika ada satu baris teks !! Tampilan teks tidak pernah "hilang".
Jika Anda ingin "pergi", tambahkan saja ini
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
}
(Saya membuatnya '1' jadi jelas apa yang terjadi, '0' baik-baik saja.)
Bagaimana dengan UILabel?
Saat hanya menampilkan teks, UILabel memiliki banyak keunggulan dibandingkan UITextView. UILabel tidak mengalami masalah yang dijelaskan pada halaman QA ini. Memang alasan kita semua biasanya "menyerah" dan hanya menggunakan UITextView adalah bahwa UILabel sulit untuk dikerjakan. Khususnya sangat sulit untuk hanya menambahkan padding , dengan benar, ke UILabel. Sebenarnya di sini adalah diskusi lengkap tentang bagaimana "akhirnya" menambahkan padding dengan benar ke UILabel: https://stackoverflow.com/a/58876988/294884 Dalam beberapa kasus jika Anda melakukan tata letak yang sulit dengan sel ketinggian dinamis, kadang-kadang lebih baik melakukannya dengan cara yang sulit dengan UILabel.