2019 के लिए अप-टू-डेट
यह आईओएस में सबसे खराब बग में से एक है।
यहां दिया गया वर्ग, UITextViewFixed
आमतौर पर समग्र रूप से सबसे उचित समाधान है।
यहाँ वर्ग है:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
स्क्रॉल को बंद करने में मत भूलना निरीक्षक में अक्षम!
स्टोरीबोर्ड में समाधान ठीक से काम करता है
समाधान रनटाइम पर ठीक से काम करता है
बस, हो गया।
सामान्य तौर पर, ज्यादातर मामलों में आपकी ज़रूरत होनी चाहिए ।
यहां तक कि अगर आप मक्खी पर पाठ दृश्य की ऊंचाई बदल रहे हैं , तो UITextViewFixed
आमतौर पर आपको सभी की आवश्यकता होती है।
(मक्खी पर ऊंचाई बदलने का एक सामान्य उदाहरण, इसे उपयोगकर्ता प्रकारों के रूप में बदल रहा है।)
यहाँ Apple से टूटा हुआ UITextView है ...
यहाँ है UITextViewFixed
:
ध्यान दें कि आप अवश्य करें
निरीक्षक में स्क्रॉल बंद कर दिया!
स्क्रॉल करना बंद करना न भूलें! :)
कुछ और मुद्दे
(1) कुछ असामान्य मामलों में - उदाहरण के लिए, लचीली, गतिशील रूप से बदलते सेल हाइट्स के साथ तालिकाओं के कुछ मामले - Apple एक विचित्र बात करता है: वे तल पर अतिरिक्त स्थान जोड़ते हैं । सच में नहीं! यह आईओएस में सबसे अधिक infurating चीजों में से एक होगा।
यहाँ ऊपर जोड़ने के लिए एक "क्विक फिक्स" है जो आमतौर पर उस पागलपन के साथ मदद करता है।
...
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) कभी-कभी, एक और सूक्ष्म एपल मेस-अप को ठीक करने के लिए, आपको इसे जोड़ना होगा:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) यकीनन, हमें जोड़ना चाहिए :
contentInset = UIEdgeInsets.zero
बस के बाद .lineFragmentPadding = 0
में UITextViewFixed
।
हालाँकि ... विश्वास करें या नहीं ... यह अभी चालू iOS में काम नहीं करता है ! (2019 में चेक किया गया।) भविष्य में उस लाइन को जोड़ना आवश्यक हो सकता है।
तथ्य यह UITextView
है कि आईओएस में टूट गया है सभी मोबाइल कंप्यूटिंग में सबसे अजीब चीजों में से एक है। इस सवाल की दस साल की सालगिरह और यह अभी भी तय नहीं है!
अंत में, यहां टेक्स्ट फ़ील्ड के लिए कुछ समान टिप है : https://stackoverflow.com/a/43099816/294884
पूरी तरह से यादृच्छिक टिप: अंत में "..." कैसे जोड़ें
अक्सर आप एक UITextView का उपयोग कर रहे हैं "UILabel की तरह"। तो आप चाहते हैं कि यह एक दीर्घवृत्त "..." का उपयोग करते हुए पाठ को काट दिया जाए
यदि ऐसा है, तो "सेटअप" में कोड की एक तीसरी पंक्ति जोड़ें:
textContainer.lineBreakMode = .byTruncatingTail
यदि आप शून्य ऊंचाई चाहते हैं तो आसान टिप, जब कोई पाठ न हो
अक्सर आप केवल पाठ प्रदर्शित करने के लिए पाठ दृश्य का उपयोग करते हैं। इसलिए, उपयोगकर्ता वास्तव में कुछ भी संपादित नहीं कर सकता है। आप "0" लाइनों का उपयोग करते हैं, जिसका अर्थ है कि पाठ की कितनी पंक्तियों के आधार पर पाठ दृश्य स्वचालित रूप से ऊँचाई को बदल देगा।
यह बहुत अच्छा है, लेकिन अगर कोई पाठ नहीं है तो दुर्भाग्य से आपको उतनी ही ऊंचाई मिलती है जैसे कि पाठ की एक पंक्ति है !! पाठ दृश्य कभी भी "दूर नहीं जाता है"।
यदि आप चाहते हैं कि यह "चले जाएं", तो बस इसे जोड़ें
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' बनाया इसलिए यह स्पष्ट है कि क्या चल रहा है, '0' ठीक है।)
UILabel के बारे में क्या?
जब सिर्फ पाठ प्रदर्शित किया जाता है, तो यूआईटेल ने UITextView पर कई फायदे हैं। इस QA पृष्ठ पर बताई गई समस्याओं से उलीबेल पीड़ित नहीं है। वास्तव में कारण यह है कि हम सभी आमतौर पर "हार मान लेते हैं" और यूआईटैक्सव्यू का उपयोग करते हैं, यह है कि यूबेलबेल के साथ काम करना मुश्किल है। विशेष रूप से, यूआईलेबेल को केवल सही तरीके से पैडिंग जोड़ना हास्यास्पद है । वास्तव में यहाँ एक पूरी चर्चा की गई है कि "आखिर" को UILabel में सही तरीके से कैसे जोड़ा जा सकता है: https://stackoverflow.com/a/58876988/294884 कुछ मामलों में यदि आप डायनामिक ऊंचाई कोशिकाओं के साथ एक मुश्किल लेआउट कर रहे हैं, तो यह कभी-कभी होता है। बेहतर यह UILabel के साथ कठिन तरीका है।