2019 için güncel
İOS'taki en sinsi hatalardan biridir.
Burada verilen sınıf, UITextViewFixed
genel olarak en makul çözümdür.
İşte sınıf:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Inspector'da scrollEnabled özelliğini kapatmayı unutmayın!
Çözüm film şeridinde düzgün çalışıyor
Çözüm çalışma zamanında düzgün çalışıyor
Hepsi bu, bitti.
Genel olarak, çoğu durumda ihtiyacınız olan her şey bu olmalıdır .
Metin görünümünün yüksekliğini anında değiştirseniz bile , UITextViewFixed
genellikle ihtiyacınız olan her şeyi yapar.
(Anında yüksekliği değiştirmenin yaygın bir örneği, kullanıcı yazarken bunu değiştirmektir.)
İşte Apple'dan kırık UITextView ...
İşte UITextViewFixed
:
Tabii ki
scroll'i kapat Müfettiş'te etkin!
ScrollEnabled'ı kapatmayı unutmayın! :)
Bazı sorunlar
(1) Bazı olağandışı durumlarda - örneğin, esnek, dinamik olarak değişen hücre yüksekliklerine sahip bazı tablolar - Apple tuhaf bir şey yapar: En altta ekstra alan ekler . Hayır, gerçekten! Bu, iOS'taki en sinir bozucu şeylerden biri olmalı.
Burada, genellikle bu deliliğe yardımcı olan yukarıdakilere eklemek için bir "hızlı düzeltme" bulunmaktadı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) Bazen, başka bir ince Apple dağınıklığını düzeltmek için şunu eklemeniz gerekir:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) Tartışmalı olarak şunu eklemeliyiz :
contentInset = UIEdgeInsets.zero
hemen sonra .lineFragmentPadding = 0
içinde UITextViewFixed
.
Ancak ... inanın ya da inanmayın ... sadece mevcut iOS'ta çalışmıyor ! (2019'da kontrol edildi.) Gelecekte bu satırı eklemek gerekebilir.
UITextView
İOS'ta kırılmış olması, tüm mobil bilgisayarlardaki en garip şeylerden biridir. Bu sorunun on yıllık yıldönümü ve hala sabit değil!
Son olarak, Metin Alanı için biraz benzer bir ipucu : https://stackoverflow.com/a/43099816/294884
Tamamen rastgele ipucu: ucuna "..." nasıl eklenir
Genellikle "UILabel gibi" bir UITextView kullanıyorsunuz. Yani bir üç nokta "..." kullanarak metni kısaltmasını istiyorsunuz
Öyleyse, "kurulum" a üçüncü bir kod satırı ekleyin:
textContainer.lineBreakMode = .byTruncatingTail
Sıfır yükseklik istiyorsanız pratik ipucu, ne zaman, hiç metin yok
Genellikle yalnızca metin görüntülemek için bir metin görünümü kullanırsınız. Dolayısıyla, kullanıcı aslında hiçbir şeyi düzenleyemez. Metin görünümünün kaç metin satırı olduğuna bağlı olarak yüksekliği otomatik olarak değiştireceği anlamına gelen "0" satırlarını kullanırsınız.
Bu harika, ama hiç metin yoksa, ne yazık ki bir metin satırı varmış gibi aynı yükseklikte olsun !! Metin görünümü hiçbir zaman "kaybolmaz".
"Uzaklaşmasını" istiyorsanız, şunu ekleyin:
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
}
('1' yaptım, bu yüzden neler olduğu açık, '0' iyi.)
UILabel ne olacak?
Yalnızca metin görüntülerken, UILabel'in UITextView'a göre birçok avantajı vardır. UILabel, bu KG sayfasında açıklanan sorunlardan muzdarip değildir. Gerçekten de hepimizin genellikle "vazgeçmek" ve sadece UITextView kullanmak nedeni UILabel ile çalışmak zor olmasıdır. Özellikle UILabel'e doğru şekilde dolgu eklemek gülünç derecede zordur . Aslında, burada UILabel'e "son" doğru dolgu eklemek hakkında tam bir tartışma var: https://stackoverflow.com/a/58876988/294884 Bazı durumlarda dinamik yükseklik hücreleriyle zor bir düzen yapıyorsanız, bazen UILabel ile zor yoldan yapmak daha iyi.