UITextView में मार्जिन / पैडिंग कैसे खोना है?


486

मेरे पास UITextViewअपने iOS एप्लिकेशन में एक है, जो बड़ी मात्रा में पाठ प्रदर्शित करता है।

मैं तो ऑफ़सेट मार्जिन पैरामीटर का उपयोग करके इस पाठ को पृष्ठांकित कर रहा हूं UITextView

मेरी समस्या यह है कि का पेडिंग UITextViewमेरी गणना को भ्रमित कर रहा है क्योंकि यह फ़ॉन्ट आकार और टाइपफेस के आधार पर भिन्न प्रतीत होता है जिसका मैं उपयोग करता हूं।

इसलिए, मैं इस सवाल का जवाब देता हूं: क्या सामग्री की आसपास की पैडिंग को हटाना संभव है UITextView?

आपकी प्रतिक्रिया सुनने के लिए तत्पर हैं!


9
ध्यान दें कि यह क्यूए लगभग दस साल पुराना है! 100,000+ विचारों के साथ, चूंकि यह iOS में सबसे बेवकूफ समस्याओं में से एक है । बस एफटीआर I को वर्तमान, 2017 में, यथोचित सरल / सामान्य / स्वीकृत समाधान के रूप में नीचे उत्तर के रूप में रखा गया है।
फेटी

1
मुझे अभी भी इस पर अपडेट मिलता है, 2009 में एक हार्डकोड लिखा गया था जब IOS 3.0 अभी जारी किया गया था। मैंने बस स्पष्ट रूप से उत्तर देने के लिए संपादित किया कि यह वर्षों से पुराना है और स्वीकृत स्थिति को अनदेखा करना है।
माइकल

जवाबों:


383

2019 के लिए अप-टू-डेट

यह आईओएस में सबसे खराब बग में से एक है।

यहां दिया गया वर्ग, UITextViewFixedआमतौर पर समग्र रूप से सबसे उचित समाधान है।

यहाँ वर्ग है:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
}

स्क्रॉल को बंद करने में मत भूलना निरीक्षक में अक्षम!

  1. स्टोरीबोर्ड में समाधान ठीक से काम करता है

  2. समाधान रनटाइम पर ठीक से काम करता है

बस, हो गया।

सामान्य तौर पर, ज्यादातर मामलों में आपकी ज़रूरत होनी चाहिए

यहां तक ​​कि अगर आप मक्खी पर पाठ दृश्य की ऊंचाई बदल रहे हैं , तो UITextViewFixedआमतौर पर आपको सभी की आवश्यकता होती है।

(मक्खी पर ऊंचाई बदलने का एक सामान्य उदाहरण, इसे उपयोगकर्ता प्रकारों के रूप में बदल रहा है।)

यहाँ Apple से टूटा हुआ UITextView है ...

UITextView के साथ IB का स्क्रीनशॉट

यहाँ है UITextViewFixed:

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 के साथ कठिन तरीका है।


1
मैंने self.textView.isScrollEnabled = falseअंदर किया viewDidLayoutSubviews()और वह भी काम किया। Apple हमें केवल हुप्स के माध्यम से कूदना पसंद करता है :)
AnBisw

1
डायनेमिक हाइट (UITableViewAutomaticDimension) के साथ मेरे UITableView Cells, Header और Footer पर मेरे सभी बेतुके UITextView ऑटोलॉययट बग को ठीक करने के लिए सबसे अच्छा समाधान। महान!
पीटर क्रेइन्ज़

1
मैंने @ Fattie के उत्तर के लिए एक अद्यतन उत्तर पोस्ट किया है जिसने मुझे सक्षम / अक्षम करने की विशेष चाल का उपयोग करके वास्तव में सभी इनसेट से छुटकारा पाने में मदद की है translatesAutoresizingMaskIntoConstraints। इस उत्तर के साथ मैं ऑटो लेआउट का उपयोग करते हुए पदानुक्रम में सभी मार्जिन (कुछ अजीब नीचे मार्जिन का विरोध करने के लिए) को दूर करने में सक्षम नहीं था। यह उपयोग करने वाले दृश्य आकारों की गणना से भी संबंधित है systemLayoutSizeFitting, जो पहले बग्गी के कारण अमान्य आकार लौटा थाUITextView
Fab1n

1
IBDesignable के लिए 1up। मैं बहुत अच्छी तरह से चुने हुए स्थान धारक पाठ के लिए
उत्थान करूंगा

1
मेरे पास टेबल में टेक्स्टव्यू थे, जिन लोगों के पास टेक्स्ट की एक लाइन थी, उन्होंने इसकी ऊंचाई सही ढंग से नहीं की थी (ऑटोलयूट)। इसे ठीक करने के लिए मुझे doMoveToSuperview को ओवरराइड करना पड़ा और वहां भी कॉल सेटअप करना पड़ा।
एल भयानक

791

IOS 7.0 के लिए, मैंने पाया है कि contentInset ट्रिक अब काम नहीं करती है। यह वह कोड है जिसका उपयोग मैंने iOS 7 में मार्जिन / पैडिंग से छुटकारा पाने के लिए किया था।

यह पाठ के बाएँ किनारे को कंटेनर के बाएँ किनारे पर लाता है:

textView.textContainer.lineFragmentPadding = 0

यह पाठ के शीर्ष को कंटेनर के शीर्ष के साथ संरेखित करने का कारण बनता है

textView.textContainerInset = .zero

मार्जिन / पैडिंग को पूरी तरह से हटाने के लिए दोनों लाइनों की आवश्यकता होती है।


2
यह मेरे लिए दो लाइनों का काम कर रहा है, लेकिन जब तक मैं 5 लाइनों तक पहुँचता हूँ, तब तक पाठ कट जाता है।
livings124

7
ध्यान दें कि दूसरी पंक्ति के रूप में भी लिखा जा सकता है: self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
jessepinho

19
lineFragmentPadding0 पर सेट करना वह जादू है जिसकी मुझे तलाश थी। मुझे नहीं पता कि Apple अन्य नियंत्रणों के साथ UITextView सामग्री को पंक्तिबद्ध करने के लिए इतना कठिन क्यों बनाता है।
फतमान

3
यह सही जवाब है। स्क्रॉलिंग क्षैतिज रूप से इस समाधान के साथ नहीं होती है।
माइकल

2
lineFragmentPaddingमार्जिन को संशोधित करने का इरादा नहीं है। से डॉक्स लाइन टुकड़ा गद्दी पाठ मार्जिन व्यक्त करने के लिए नहीं बनाया गया है। इसके बजाय, आपको अपने पाठ दृश्य पर इनसेट का उपयोग करना चाहिए, पैराग्राफ मार्जिन विशेषताओं को समायोजित करना चाहिए, या इसके पर्यवेक्षण के भीतर पाठ दृश्य की स्थिति को बदलना चाहिए।
मार्टिन बर्जर

256

यह वर्कअराउंड 2009 में लिखा गया था जब IOS 3.0 जारी किया गया था। यह अब लागू नहीं होता है।

मैं ठीक उसी समस्या में भाग गया, अंत में मुझे इसका उपयोग करना पड़ा

nameField.contentInset = UIEdgeInsetsMake(-4,-8,0,0);

जहां nameField एक है UITextView। मैं जिस फ़ॉन्ट का उपयोग कर रहा था वह हेल्वेटिका 16 बिंदु था। इसका केवल एक कस्टम समाधान है जो कि विशेष क्षेत्र के आकार के लिए मैं आरेखण कर रहा था। यह बाईं ओर के साथ बाएं ऑफसेट को फ्लश करता है, और शीर्ष ऑफसेट जहां मैं इसे अपने ड्रॉ बॉक्स के लिए चाहता हूं।

इसके अलावा, यह केवल उस जगह पर लागू होता है UITextViewsजहां आप डिफ़ॉल्ट अलाइमेंट का उपयोग कर रहे हैं, अर्थात।

nameField.textAlignment = NSTextAlignmentLeft;

उदाहरण के लिए दाईं ओर संरेखित करें और UIEdgeInsetsMakeलगता है कि दाहिने किनारे पर कोई प्रभाव नहीं है।

बहुत कम से कम, .contentInset संपत्ति का उपयोग करने से आप अपने खेतों को "सही" स्थिति के साथ रख सकते हैं, और बिना ऑफसेट किए विचलन को समायोजित कर सकते हैं UITextViews


1
हां यह आईओएस 7 में काम करता है। सुनिश्चित करें कि UIEdgeInset सही मानों पर सेट है। यह UIEdgeInsetsMake (-4, -8,0,0) से भिन्न हो सकता है।
app_

15
IOS 7 में मैंने पाया UIEdgeInsetsMake (0, -4,0, -4) ने सबसे अच्छा काम किया।
रचौरा

2
हाँ, वे उदाहरण संख्याएँ हैं। मैंने कहा "मैं विशेष क्षेत्र के आकार का केवल एक कस्टम समाधान जो मैं आ रहा था"। मुख्य रूप से मैं यह स्पष्ट करने की कोशिश कर रहा था कि आपको अपनी अनूठी लेआउट स्थिति के लिए संख्याओं के साथ खेलना होगा।
माइकल

3
UITextAlignmentLeft को iOS 7 में चित्रित किया गया है। NSTextAlignmentLeft का उपयोग करें।
जोर्डी क्रोन

7
मुझे नहीं लगता कि लोग ऐसे जवाब क्यों देते हैं जो कठोर-कोडित मूल्यों का उपयोग करते हैं। यह आईओएस के भविष्य के संस्करणों में टूटने की संभावना है और यह सिर्फ एक बुरा विचार है।
21

77

पहले से दिए गए कुछ अच्छे उत्तरों का निर्माण, यहाँ एक शुद्ध स्टोरीबोर्ड / इंटरफ़ेस बिल्डर आधारित समाधान है जो iOS 7.0+ में काम करता है

निम्नलिखित कुंजियों के लिए UITextView की उपयोगकर्ता परिभाषित रेंटाइम विशेषताएँ सेट करें:

textContainer.lineFragmentPadding
textContainerInset

इंटरफ़ेस बिल्डर


4
यह स्पष्ट रूप से सबसे अच्छा जवाब है, खासकर यदि आपको
XIB-

16
कॉपी / पेस्ट: textContainer.lineFragmentPadding | textContainerInset
लुका डे एंजेलिस

3
यह वही है जो एक सुंदर उत्तर देता है - आसान और अच्छी तरह से काम करता है, 3 साल बाद भी :)
Shai Mishali


41

मैं निश्चित रूप से हार्ड-कोडित मूल्यों से जुड़े किसी भी उत्तर से बचूंगा, क्योंकि वास्तविक मार्जिन उपयोगकर्ता फ़ॉन्ट-आकार सेटिंग्स, आदि के साथ बदल सकता है।

यहां @ user1687195 का उत्तर दिया गया है, जिसे संशोधित किए बिना लिखा गया है textContainer.lineFragmentPadding(क्योंकि डॉक्स स्थिति यह इच्छित उपयोग नहीं है)।

यह iOS 7 और बाद के लिए बहुत अच्छा काम करता है।

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding, 
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding);

यह प्रभावी रूप से एक ही परिणाम है, बस इसमें थोड़ा सा क्लीनर है कि यह लाइनफ्रेममेंटपैडिंग संपत्ति का दुरुपयोग नहीं करता है।


मैंने इस जवाब के आधार पर एक और समाधान की कोशिश की और यह बहुत अच्छा काम करता है। इसका समाधान है:self.textView.textContainer.lineFragmentPadding = 0;
बकायट अब्द्रासुलोव

1
@BakytAbdrasulov कृपया मेरा उत्तर पढ़ें। जबकि आपका समाधान काम करता है, यह डॉक्स के अनुसार नहीं है (मेरे उत्तर में लिंक देखें)। lineFragmentPaddingमार्जिन को नियंत्रित करने के लिए नहीं है। इसलिए आपको उपयोग करना चाहिए textContainerInset
7

20

उपयोगकर्ता परिभाषित रनटाइम विशेषताओं का उपयोग करके स्टोरीबोर्ड या इंटरफ़ेस बिल्डर समाधान :

स्क्रीनशॉट iOS 7.1 और iOS 6.1 के साथ हैं contentInset = {{-10, -5}, {0, 0}}

उपयोगकर्ता परिभाषित रनटाइम विशेषताएँ

उत्पादन


1
मेरे लिए iOS 7.
kubilay

उपयोगकर्ता परिभाषित रनटाइम विशेषताओं के लिए अभी तक - कमाल!
hris.to

16

ये सभी उत्तर शीर्षक प्रश्न को संबोधित करते हैं, लेकिन मैं ओपी के प्रश्न के शरीर में प्रस्तुत समस्याओं के लिए कुछ समाधान प्रस्तावित करना चाहता था।

पाठ सामग्री का आकार

एक त्वरित तरीका अंदर पाठ का आकार की गणना करने के UITextViewउपयोग करने के लिए है NSLayoutManager:

UITextView *textView;
CGSize textSize = [textView usedRectForTextContainer:textView.textContainer].size;

यह कुल स्क्रॉल करने योग्य सामग्री देता है, जो UITextView's फ्रेम से बड़ा हो सकता है । मैंने पाया textView.contentSizeकि यह वास्तव में गणना करता है कि पाठ कितना स्थान लेता है, इसकी तुलना में यह अधिक सटीक है । उदाहरण के लिए, एक खाली दिया गया UITextView:

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

ऊंची लाईन

UIFontएक संपत्ति है जो जल्दी से आपको दिए गए फ़ॉन्ट के लिए लाइन ऊंचाई प्राप्त करने की अनुमति देता है। तो आप जल्दी से अपने UITextViewसाथ पाठ की लाइन ऊंचाई पा सकते हैं :

UITextView *textView;
CGFloat lineHeight = textView.font.lineHeight;

दर्शनीय पाठ आकार की गणना

वास्तव में दिखाई देने वाले पाठ की मात्रा का निर्धारण एक "पेजिंग" प्रभाव को संभालने के लिए महत्वपूर्ण है। UITextViewएक संपत्ति है जिसे textContainerInsetवास्तव में वास्तविक UITextView.frameऔर पाठ के बीच एक मार्जिन कहा जाता है। दृश्यमान फ्रेम की वास्तविक ऊंचाई की गणना करने के लिए आप निम्नलिखित गणना कर सकते हैं:

UITextView *textView;
CGFloat textViewHeight = textView.frame.size.height;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textHeight = textViewHeight - textInsets.top - textInsets.bottom;

पेजिंग का आकार निर्धारित करना

अंत में, अब जब आपके पास दृश्य पाठ आकार और सामग्री है, तो आप जल्दी से यह निर्धारित कर सकते हैं कि आपके ऑफ़सेट को निम्नलिखित textHeightसे घटाकर क्या होना चाहिए textSize:

// where n is the page number you want
CGFloat pageOffsetY = textSize - textHeight * (n - 1);
textView.contentOffset = CGPointMake(textView.contentOffset.x, pageOffsetY);

// examples
CGFloat page1Offset = 0;
CGFloat page2Offset = textSize - textHeight
CGFloat page3Offset = textSize - textHeight * 2

इन सभी तरीकों का उपयोग करते हुए, मैंने अपने इनसेट्स को नहीं छुआ और मैं उस पाठ में या जहाँ भी मैं चाहता हूं, कैरेट पर जाने में सक्षम था।


12

आप की textContainerInsetसंपत्ति का उपयोग कर सकते हैं UITextView:

textView.textContainerInset = UIEdgeInsetsMake (10, 10, 10, 10);

(ऊपर बाएं नीचे दाएं)


1
मुझे आश्चर्य है कि इसे यहां सबसे अच्छे उत्तर के रूप में क्यों नहीं सौंपा गया है। TextContainerInset ने वास्तव में मेरी जरूरतों को पूरा किया।
कोरियाईएक्सकोडवर्कर

textContainerInsetजब मैं इसे एक नए मूल्य में बदलना चाहता हूं , तो संपत्ति पर नीचे के मूल्य को अपडेट करना मेरे लिए काम नहीं कर रहा है - देखें stackoverflow.com/questions/19422578/…
इवान आर

@ मैग्गीपिलिप्स यह सबसे अच्छा जवाब नहीं है क्योंकि हार्डकोडेड मान संभवतः ऐसा करने का सही तरीका नहीं हो सकता है, और कुछ मामलों में विफल होने की गारंटी है। आपको लाइनफ्रेगमेंटपैडिंग को ध्यान में रखना होगा।
प्रात: काल

11

IOS 10 के लिए, निम्न पंक्ति ऊपर और नीचे पैडिंग हटाने के लिए काम करती है।

captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

Xcode 8.2.1। अभी भी इस जवाब में उल्लेख के रूप में एक ही मुद्दा है। मेरा समाधान UIEdgeInsets (शीर्ष: 0, बाएँ: -4.0, नीचे: 0, दाएं: -4.0) के रूप में मानों को संपादित करने के लिए था।
Darkwonder

UIEdgeInset.zeroXCode 8.3 और iOS 10.3 सिम्युलेटर का उपयोग करके काम करता है
सिमोन वर्ता

10

नवीनतम स्विफ्ट:

self.textView.textContainerInset = .init(top: -2, left: 0, bottom: 0, right: 0)
self.textView.textContainer.lineFragmentPadding = 0

बहुत बढ़िया जवाब। यह उत्तर अतिरिक्त शीर्ष इनसेट को हटा देता है। textView.textContainerInset = UIEdgeInsets.zero शीर्ष इनसेट से 2 पिक्सेल नहीं निकालता है।
korgx9

10

यहाँ Fattie का बहुत उपयोगी उत्तर का एक अद्यतन संस्करण है। इसमें 2 महत्वपूर्ण रेखाएँ शामिल हैं जिनसे मुझे iOS 10 और 11 पर काम करने में लेआउट प्राप्त करने में मदद मिली (और शायद कम लोगों पर भी):

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

महत्वपूर्ण रेखाएँ दो translatesAutoresizingMaskIntoConstraints = <true/false>कथन हैं!

यह आश्चर्यजनक रूप से मेरी सभी परिस्थितियों में सभी मार्जिन को हटा देता है!

हालांकि textViewयह पहला उत्तरदाता नहीं है, लेकिन ऐसा हो सकता है कि कुछ अजीब नीचे का मार्जिन है जिसे sizeThatFitsस्वीकार किए गए उत्तर में वर्णित विधि का उपयोग करके हल नहीं किया जा सकता है ।

जब टेक्स्टव्यू में टैप करने से अचानक नीचे का अजीब मार्जिन गायब हो जाता है और सब कुछ वैसा ही दिखता है, जैसा होना चाहिए, लेकिन जैसे ही टेक्स्ट व्यू मिला है firstResponder

इसलिए मैंने SO पर यहाँ पढ़ा कि translatesAutoresizingMaskIntoConstraintsकॉल के बीच में मैन्युअल रूप से फ्रेम / सीमा सेट करते समय सक्षम करना और अक्षम करना मदद करता है।

सौभाग्य से यह न केवल फ्रेम सेटिंग के साथ काम करता है बल्कि setup()दो translatesAutoresizingMaskIntoConstraintsकॉल के बीच सैंडविच की 2 लाइनों के साथ !

उदाहरण के लिए यह बहुत मददगार है जब किसी दृश्य के फ्रेम का उपयोग करकेsystemLayoutSizeFittingUIView गणना की जाती है । सही आकार देता है (जो पहले ऐसा नहीं था)!

जैसा कि मूल उत्तर में बताया गया है:
स्क्रॉल को बंद करने की भूल न करें निरीक्षक में अक्षम!
यह समाधान स्टोरीबोर्ड में और साथ ही साथ रनटाइम पर ठीक से काम करता है।

यही है, अब तुम सच में कर रहे हो !


5

स्विफ्ट 4 के लिए, एक्सकोड 9

निम्न फ़ंक्शन का उपयोग करें UITextView में पाठ के मार्जिन / पैडिंग को बदल सकते हैं

सार्वजनिक func UIEdgeInsetsMake (_ top: CGFloat, _ left: CGFloat, _ निचला: CGFloat, _ right: CGFloat) -> UIEdgeInsets

तो इस मामले में है

 self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

3

इनसेट सॉल्यूशन करते हुए मेरे पास अभी भी दाईं ओर और नीचे पैडिंग थी। इसके अलावा पाठ संरेखण मुद्दों के कारण था। आग लगने का एकमात्र निश्चित तरीका यह था कि पाठ दृश्य को किसी अन्य दृश्य के अंदर रखा जाए जो सीमा से जुड़ा हुआ हो।


3

यहां एक आसान सा एक्सटेंशन दिया गया है जो आपके ऐप में हर टेक्स्ट व्यू से Apple के डिफॉल्ट मार्जिन को हटा देगा।

नोट: इंटरफ़ेस बिल्डर अभी भी पुराने मार्जिन को दिखाएगा, लेकिन आपका ऐप उम्मीद के मुताबिक काम करेगा।

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}

1

मेरे लिए (iOS 11 और Xcode 9.4.1) जो जादुई तरीके से काम करने के लिए textView.font संपत्ति की स्थापना कर रहा था UIFont.preferred(forTextStyle:UIFontTextStyle) और साथ ही पहला जवाब @Fattie द्वारा दिया गया था। लेकिन जब तक मैं textView.font प्रॉपर्टी को सेट नहीं करता, तब तक @Fattie उत्तर काम नहीं करता था, UITextView गलत तरीके से व्यवहार करता रहता है।


1

यदि कोई भी नवीनतम स्विफ्ट संस्करण की तलाश में है तो नीचे कोड Xcode 10.2 और स्विफ्ट 4.2 के साथ ठीक काम कर रहा है

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

0

मुझे एक और दृष्टिकोण मिल गया है, UITextView के उप-पाठों से पाठ के साथ दृश्य प्राप्त करना और इसे एक उपवर्ग में लेआउट विधि में स्थापित करना:

- (void)layoutSubviews {
    [super layoutSubviews];

    const int textViewIndex = 1;
    UIView *textView = [self.subviews objectAtIndex:textViewIndex];
    textView.frame = CGRectMake(
                                 kStatusViewContentOffset,
                                 0.0f,
                                 self.bounds.size.width - (2.0f * kStatusViewContentOffset),
                                 self.bounds.size.height - kStatusViewContentOffset);
}

0

TextView स्क्रॉल पाठ की स्थिति को भी प्रभावित करता है और ऐसा लगता है कि यह लंबवत केंद्रित नहीं है। मैं स्क्रॉल को अक्षम करके और शीर्ष इनसेट को 0 पर सेट करके दृश्य में पाठ को केंद्रित करने में कामयाब रहा:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

किसी कारण से मैंने अभी तक इसका पता नहीं लगाया है, टाइपिंग शुरू होने से पहले कर्सर अभी भी केंद्रित नहीं है, लेकिन जैसे ही मैंने टाइप करना शुरू किया, पाठ केंद्र तुरंत बंद हो गए।


0

यदि आप HTML स्ट्रिंग सेट करना चाहते हैं और नीचे की पैडिंग से बचना चाहते हैं, तो कृपया सुनिश्चित करें कि आप ब्लॉक टैग यानी div, p का उपयोग नहीं कर रहे हैं।

मेरे मामले में यही कारण था। आप आसानी से इसका परीक्षण ब्लॉक टैग्स की घटनाओं को प्रतिस्थापित करके कर सकते हैं अर्थात स्पैन टैग के साथ।


0

SwiftUI के लिए

यदि आप अपने स्वयं के TextView का उपयोग कर रहे हैं UIViewRepresentableऔर अपने makeUIViewकार्य में, पैडिंग को नियंत्रित करना चाहते हैं , तो बस यह करें:

uiTextView.textContainerInset = UIEdgeInsets(top: 10, left: 18, bottom: 0, right: 18)

या जो भी आप चाहते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.