UITextView जो ऑटो लेआउट का उपयोग करके पाठ तक फैलता है


163

मेरे पास एक दृश्य है जो प्रोग्रामेटिक रूप से ऑटो लेआउट का उपयोग करके पूरी तरह से निर्धारित किया गया है। मेरे पास ऊपर और नीचे की वस्तुओं के साथ दृश्य के बीच में एक UITextView है। सब कुछ ठीक काम करता है, लेकिन मैं UITextView का विस्तार करना चाहता हूं क्योंकि पाठ जोड़ा जाता है। यह नीचे के रूप में यह नीचे फैलता है सब कुछ धक्का चाहिए।

मुझे पता है कि यह "स्प्रिंग्स और स्ट्रट्स" तरीके से कैसे किया जाता है, लेकिन क्या ऐसा करने का एक ऑटो लेआउट तरीका है? मेरे सोचने का एकमात्र तरीका यह है कि हर बार इसे बढ़ने के लिए बाधा को हटाने और फिर से जोड़ना।


5
आप पाठ दृश्य के लिए एक ऊंचाई बाधा के लिए एक IBOutlet बना सकते हैं, और जब आप इसे विकसित करना चाहते हैं तो बस निरंतर को संशोधित करें, हटाने और जोड़ने की कोई आवश्यकता नहीं है।
rdelmar

4
2017, एक बहुत बड़ी टिप जो अक्सर आपको पकड़ती है : यदि आप केवल इस बारे में जानते हैं कि क्या आप VIEWDID> APPEAR </ strong> से काम करते हैं, तो यदि आप ViewDidLoad में पाठ कहते हैं तो यह बहुत निराशाजनक है - यह काम नहीं करेगा!
फेटी

2
टिप नंबर 2: यदि आप कहते हैं [someView.superView LayoutIfNeeded] तो यह दृश्य में काम कर सकता है ();)
यारो

जवाबों:


30

UITextView वाले दृश्य को AutoLayout setBoundsद्वारा इसका आकार दिया जाएगा । तो यही वह है जो मैंने किया। पर्यवेक्षक शुरू में अन्य सभी बाधाओं को निर्धारित करता है जैसा कि उन्हें होना चाहिए, और अंत में मैंने यूआईटीएक्सएवी व्यू की ऊंचाई के लिए एक विशेष बाधा डाल दी, और मैंने इसे एक उदाहरण चर में बचाया।

_descriptionHeightConstraint = [NSLayoutConstraint constraintWithItem:_descriptionTextView
                                 attribute:NSLayoutAttributeHeight 
                                 relatedBy:NSLayoutRelationEqual 
                                    toItem:nil 
                                 attribute:NSLayoutAttributeNotAnAttribute 
                                multiplier:0.f 
                                 constant:100];

[self addConstraint:_descriptionHeightConstraint];

में setBoundsविधि, मैं तो निरंतर का मूल्य बदल दिया है।

-(void) setBounds:(CGRect)bounds
{
    [super setBounds:bounds];

    _descriptionTextView.frame = bounds;
    CGSize descriptionSize = _descriptionTextView.contentSize;

    [_descriptionHeightConstraint setConstant:descriptionSize.height];

    [self layoutIfNeeded];
}

4
आप UITextViewDelegate के 'textViewDidChange:' में बाधा को भी अपडेट कर सकते हैं
LK__

2
अच्छा समाधान। ध्यान दें कि आप इंटरफ़ेस बिल्डर में बाधा भी बना सकते हैं, और एक आउटलेट का उपयोग करके इसे कनेक्ट कर सकते हैं। इसके उपयोग के साथ संयुक्त textViewDidChangeकुछ परेशानी उपवर्ग और लेखन कोड को बचाना चाहिए ...
बॉब वोर्क

3
ध्यान रखें कि textViewDidChange:प्रोग्राम को UITextView में टेक्स्ट जोड़ते समय नहीं बुलाया जाएगा।
भटकना

@ याकूबवर्क सुझाव अच्छी तरह से काम करता है XCODE 11 / iOS13, जब पाठ दृश्य मान सेट किया जाता है तो कॉन्स्टैंट कंटिन्यू सेट होता है।
7:30

549

सारांश: अपने पाठ दृश्य की स्क्रॉलिंग अक्षम करें, और इसकी ऊँचाई को कम न करें।

इस प्रोग्राम को करने के लिए, निम्न कोड को इसमें डालें viewDidLoad:

let textView = UITextView(frame: .zero, textContainer: nil)
textView.backgroundColor = .yellow // visual debugging
textView.isScrollEnabled = false   // causes expanding height
view.addSubview(textView)

// Auto Layout
textView.translatesAutoresizingMaskIntoConstraints = false
let safeArea = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
    textView.topAnchor.constraint(equalTo: safeArea.topAnchor),
    textView.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor),
    textView.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor)
])

इंटरफ़ेस बिल्डर में ऐसा करने के लिए, टेक्स्ट दृश्य का चयन करें, स्क्रॉलिंग को सक्षम करें अटैचमेंट इंस्पेक्टर में सक्षम करें, और बाधाओं को मैन्युअल रूप से जोड़ें।

नोट: यदि आपके पास अपने पाठ दृश्य के ऊपर / नीचे अन्य दृश्य हैं, तो UIStackViewउन सभी को व्यवस्थित करने के लिए उपयोग करने पर विचार करें।


12
मेरे लिए काम करता है (iOS 7 @ xcode 5)। चेतावनी यह है कि आईबी में "स्क्रॉलिंग सक्षम" को अनचेक करने से मदद नहीं मिलेगी। आपको प्रोग्राम करना होगा।
केनेथ जियांग

10
मैं पाठ दृश्य पर अधिकतम ऊंचाई कैसे निर्धारित करूं और फिर पाठ सामग्री को देखने के बाद पाठ दृश्य प्राप्त करूं?
ma11hew28

3
@iOSGeek बस एक UITextView उपवर्ग बनाएँ और intrinsicContentSizeइस तरह से ओवरराइट करें - (CGSize)intrinsicContentSize { CGSize size = [super intrinsicContentSize]; if (self.text.length == 0) { size.height = UIViewNoIntrinsicMetric; } return size; }। मुझे बताओ कि क्या यह आपके लिए काम कर रहा है। खुद इसका परीक्षण नहीं किया।
मैनुअलविल्डनर

1
इस गुण को सेट करें और UITtackView में UITextView डालें। वोइला - स्वयं आकार बदलने वाला टेक्स्ट!)
निक कोव

3
यह उत्तर सोना है। यदि आप IB में चेकबॉक्स को अक्षम करते हैं तो Xcode 9 के साथ भी यह काम करता है।
जैव

48

यहां उन लोगों के लिए एक समाधान है जो इसे ऑटो लेआउट द्वारा करना पसंद करते हैं:

आकार निरीक्षक में:

  1. सामग्री संपीड़न प्रतिरोध प्राथमिकता को 1000 पर लंबवत सेट करें।

  2. अवरोधों में "संपादन" पर क्लिक करके बाधा ऊंचाई की प्राथमिकता कम करें। बस इसे 1000 से कम करें।

यहां छवि विवरण दर्ज करें

गुण निरीक्षक में:

  1. अनचेक करें "स्क्रॉलिंग सक्षम"

यह पूरी तरह से काम कर रहा है। मैंने ऊंचाई निर्धारित नहीं की। UItextview की ऊर्ध्वाधर संपीड़न प्रतिरोध की प्राथमिकता को बढ़ाकर 1000 करने की आवश्यकता थी। UItextView में कुछ इनसेट्स हैं, इसीलिए ऑटोलैयट त्रुटियों को देता है क्योंकि UItextview को कम से कम 32 ऊँचाई की आवश्यकता होगी, भले ही इसमें कोई सामग्री न हो, जब स्क्रॉल अक्षम होता है।
nr5

अपडेट: यदि आप चाहते हैं कि ऊँचाई 20 से कम हो या कुछ और हो तो ऊँचाई में कमी की आवश्यकता होती है। अन्य बुद्धिमान 32 को न्यूनतम ऊंचाई माना जाएगा।
nr5

@ नील खुशी यह सुनने में मदद करता है।
बजे माइकल रेवलिस

@MichaelRevlis, यह बहुत अच्छा काम करता है। लेकिन जब कोई बड़ा पाठ होता है तो पाठ प्रदर्शित नहीं होता है। आप पाठ का चयन अन्य प्रसंस्करण कर सकते हैं लेकिन यह दिखाई नहीं दे रहा है। क्या आप कृपया मेरी मदद कर सकते हैं। ? यह तब होता है जब मैं स्क्रॉलिंग सक्षम विकल्प को अनचेक करता हूं। जब मैं टेक्स्टव्यू स्क्रॉलिंग को सक्षम बनाता हूं तो यह पूरी तरह से प्रदर्शित होता है लेकिन मैं चाहता हूं कि टेक्स्ट व्यू स्क्रॉल न करें।
भुतिक झिन्या 12

@BhautikZiniya, क्या आपने एक वास्तविक डिवाइस पर अपना ऐप बनाने की कोशिश की है? मुझे लगता है कि यह बग प्रदर्शित करने वाला एक सिम्युलेटर हो सकता है। मेरे पास टेक्स्ट फ़ॉन्ट आकार 100 के साथ एक UITextView है। यह एक वास्तविक डिवाइस पर ठीक प्रदर्शित होता है, लेकिन टेक्स्ट एक सिम्युलेटर पर अदृश्य होते हैं।
माइकल रेवलिस

38

UITextView एक आंतरिक परामर्श प्रदान नहीं करता है, इसलिए आपको इसे उप-लिंक करने और एक प्रदान करने की आवश्यकता है। इसे स्वचालित रूप से विकसित करने के लिए, IntrinsicContentSize को लेआउट्सब्यूस में अमान्य करें। यदि आप डिफ़ॉल्ट सामग्री के अलावा कुछ भी उपयोग करते हैं (जो मैं अनुशंसा नहीं करता हूं), तो आपको आंतरिक गणना गणना को समायोजित करने की आवश्यकता हो सकती है।

@interface AutoTextView : UITextView

@end

#import "AutoTextView.h"

@implementation AutoTextView

- (void) layoutSubviews
{
    [super layoutSubviews];

    if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
        [self invalidateIntrinsicContentSize];
    }
}

- (CGSize)intrinsicContentSize
{
    CGSize intrinsicContentSize = self.contentSize;

    // iOS 7.0+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
        intrinsicContentSize.width += (self.textContainerInset.left + self.textContainerInset.right ) / 2.0f;
        intrinsicContentSize.height += (self.textContainerInset.top + self.textContainerInset.bottom) / 2.0f;
    }

    return intrinsicContentSize;
}

@end

1
इसने मेरे लिए अच्छा काम किया। इसके अलावा, मैं इस पाठ दृश्य के लिए इंटरफ़ेस बिल्डर में NO 'स्क्रॉल' को सेट करूँगा, क्योंकि यह पहले से ही स्क्रॉल किए बिना अपनी सभी सामग्री दिखाता है। इससे भी महत्वपूर्ण बात, अगर यह एक वास्तविक स्क्रॉल दृश्य के अंदर बैठता है, तो आप पाठ दृश्य के निचले भाग के पास कर्सर कूदने का अनुभव कर सकते हैं, यदि आप पाठ दृश्य पर स्क्रॉलिंग को अक्षम नहीं करते हैं।
idStar

यह अच्छी तरह से काम करता है। दिलचस्प बात यह है कि जब आप setScrollEnabled:हमेशा इसे सेट करने के लिए ओवरराइडिंग करते हैं, NOतो आपको एक बढ़ती हुई आंतरिक सामग्री के आकार के लिए अनंत लूप मिलेगा।
पास्कल

IOS 7.0 पर, मुझे प्रत्येक कीस्ट्रोक के बाद टेक्स्टव्यू (और किसी भी आश्रित बाधाओं की पुन: गणना करने) के लिए ऑटो लेआउट के लिए प्रतिनिधि कॉलबैक [textView sizeToFit]में कॉल करने की आवश्यकता थी textViewDidChange:
फॉलोबेन

6
यह प्रतीत होता है कि iOS 7.1 में अब जरूरी नहीं है। पश्चगामी संगतता को ठीक करने और प्रदान करने के लिए, शर्त को इसमें -(void)layoutSubviewsलपेटें और सभी कोड -(CGSize)intrinsicContentSizeको version >= 7.0f && version < 7.1f+else return [super intrinsicContentSize];
David James

1
@DavidJames यह अभी भी ios 7.1.2 में आवश्यक है, मुझे नहीं पता कि आप कहां परीक्षण कर रहे हैं।
सॉफ्टेलियन

28

आप इसे स्टोरीबोर्ड के माध्यम से कर सकते हैं, बस "स्क्रॉलिंग सक्षम" अक्षम करें :)

स्टोरीबोर्ड


2
इस सवाल पर सबसे अच्छा जवाब
इवान ब्येल्को

जब आप ऑटो लेआउट के साथ काम करते हैं तो यह सबसे अच्छा समाधान है।
जनापोटेकर

1
ऑटो लेआउट सेटिंग्स (अग्रणी, अनुगामी, ऊपर, नीचे, कोई ऊँचाई / चौड़ाई ) + स्क्रॉलिंग अक्षम। और तुम जाओ धन्यवाद!
फरहान अरशद

15

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

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

import UIKit

class FlexibleTextView: UITextView {
    // limit the height of expansion per intrinsicContentSize
    var maxHeight: CGFloat = 0.0
    private let placeholderTextView: UITextView = {
        let tv = UITextView()

        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.backgroundColor = .clear
        tv.isScrollEnabled = false
        tv.textColor = .disabledTextColor
        tv.isUserInteractionEnabled = false
        return tv
    }()
    var placeholder: String? {
        get {
            return placeholderTextView.text
        }
        set {
            placeholderTextView.text = newValue
        }
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        isScrollEnabled = false
        autoresizingMask = [.flexibleWidth, .flexibleHeight]
        NotificationCenter.default.addObserver(self, selector: #selector(UITextInputDelegate.textDidChange(_:)), name: Notification.Name.UITextViewTextDidChange, object: self)
        placeholderTextView.font = font
        addSubview(placeholderTextView)

        NSLayoutConstraint.activate([
            placeholderTextView.leadingAnchor.constraint(equalTo: leadingAnchor),
            placeholderTextView.trailingAnchor.constraint(equalTo: trailingAnchor),
            placeholderTextView.topAnchor.constraint(equalTo: topAnchor),
            placeholderTextView.bottomAnchor.constraint(equalTo: bottomAnchor),
        ])
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var text: String! {
        didSet {
            invalidateIntrinsicContentSize()
            placeholderTextView.isHidden = !text.isEmpty
        }
    }

    override var font: UIFont? {
        didSet {
            placeholderTextView.font = font
            invalidateIntrinsicContentSize()
        }
    }

    override var contentInset: UIEdgeInsets {
        didSet {
            placeholderTextView.contentInset = contentInset
        }
    }

    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize

        if size.height == UIViewNoIntrinsicMetric {
            // force layout
            layoutManager.glyphRange(for: textContainer)
            size.height = layoutManager.usedRect(for: textContainer).height + textContainerInset.top + textContainerInset.bottom
        }

        if maxHeight > 0.0 && size.height > maxHeight {
            size.height = maxHeight

            if !isScrollEnabled {
                isScrollEnabled = true
            }
        } else if isScrollEnabled {
            isScrollEnabled = false
        }

        return size
    }

    @objc private func textDidChange(_ note: Notification) {
        // needed incase isScrollEnabled is set to true which stops automatically calling invalidateIntrinsicContentSize()
        invalidateIntrinsicContentSize()
        placeholderTextView.isHidden = !text.isEmpty
    }
}

एक बोनस के रूप में वहाँ UILabel के समान प्लेसहोल्डर पाठ को शामिल करने के लिए समर्थन है।


7

आप इसे बिना सबक्लास किए भी कर सकते हैं UITextViewमेरे जवाब पर एक नज़र डालें कि मैं iOS 7 पर अपनी सामग्री के लिए एक UITextView का आकार कैसे बनाऊँ?

इस अभिव्यक्ति के मूल्य का उपयोग करें:

[textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height

की ऊंचाई को अद्यतन करने constantके लिए ।textViewUILayoutConstraint


3
आप यह कहां कर रहे हैं और क्या आप यह सुनिश्चित करने के लिए कुछ और कर रहे हैं कि UITextView सभी सेट अप है? मैं यह कर रहा हूं, और पाठ स्वयं आकार देखता है, लेकिन पाठ स्वयं UITextView की ऊंचाई से आधा नीचे कट जाता है। आपके सामान को ऊपर करने से पहले पाठ को प्रोग्रामेटिक रूप से सेट किया गया है।
chadbag

यदि यह मैन्युअल रूप से चौड़ाई सेट करना चाहते हैं तो मुझे यह स्क्रॉल करने योग्य = कोई चाल से अधिक उपयोगी लगता है।
jchnxu

3

नोट करने के लिए एक महत्वपूर्ण बात:

चूंकि UITextView UIScrollView का उपवर्ग है, इसलिए यह UIViewController की स्वचालित रूप से AdAdsscrollViewInsets संपत्ति के अधीन है।

यदि आप लेआउट सेट कर रहे हैं और TextView UIViewControllers पदानुक्रम में पहला सबव्यू है, तो इसका कंटेंट संशोधित होगा यदि स्वतः लेआउट में अनपेक्षित व्यवहार कभी-कभी स्वचालित रूप से AdAdjustsScrollViewInsets सत्य है।

इसलिए यदि आपको ऑटो लेआउट और टेक्स्ट व्यू की समस्या है, automaticallyAdjustsScrollViewInsets = falseतो व्यू कंट्रोलर पर सेटिंग करने या टेक्स्ट व्यू को पदानुक्रम में आगे बढ़ाने का प्रयास करें।


2

यह एक बहुत ही महत्वपूर्ण टिप्पणी है

यह समझने की कुंजी है कि विटामिनवाटर के उत्तर कार्य तीन चीजें क्यों हैं:

  1. यह जान लें कि UITextView UIScrollView वर्ग का एक उपवर्ग है
  2. यह समझें कि स्क्रॉलव्यू कैसे काम करता है और इसकी सामग्री की गणना कैसे की जाती है। अधिक देखने के लिए यहां देखें उत्तर और इसके विभिन्न समाधान और टिप्पणियां।
  3. समझें कि सामग्री क्या है और इसकी गणना कैसे की जाती है। यहाँ और यहाँ देखें । यह भी मदद कर सकता है कि सेटिंग contentOffsetहै की संभावना के अलावा कुछ नहीं:

func setContentOffset(offset: CGPoint)
{
    CGRect bounds = self.bounds
    bounds.origin = offset
    self.bounds = bounds
}

अधिक देखने के लिए objc स्क्रॉलव्यू और स्क्रॉल स्क्रॉल को समझना


तीनों को एक साथ जोड़कर आप आसानी से समझ जाएंगे कि आपको टेक्स्ट व्यू के ऑटोलिएट बाधाओं के साथ काम करने के लिए टेक्स्ट व्यू की आंतरिक सामग्री की अनुमति देने की आवश्यकता है। यह लगभग वैसा ही है जैसे कि आप टेक्स्ट व्यू यूआईबेल की तरह काम कर रहे हों

ऐसा करने के लिए आपको स्क्रॉलिंग को अक्षम करना होगा जो मूल रूप से स्क्रॉलव्यू के आकार का मतलब है, सामग्री आकार और कंटेनर दृश्य जोड़ने के मामले में, फिर कंटेनर व्यू का आकार सभी समान होगा। जब वे वही हों तो आपके पास कोई स्क्रॉल न हो। और आपके पास होगा । होने का मतलब है कि आपने नीचे स्क्रॉल नहीं किया है। नीचे 1 अंक भी नहीं! एक परिणाम के रूप में textView सभी बाहर खींच लिया जाएगा।0 contentOffset0 contentOffSet

यह भी कुछ भी नहीं का मतलब है कि स्क्रॉलव्यू की सीमा और फ्रेम समान हैं। यदि आप 5 अंक नीचे स्क्रॉल करते हैं तो आपका कंटेंटऑफसेट होगा , जबकि आपका बराबर होगा0 contentOffset5scrollView.bounds.origin.y - scrollView.frame.origin.y5


1

प्लग एंड प्ले समाधान - Xcode 9

लिंक का पता लगाने , पाठ चयन , संपादन और स्क्रॉलिंग के UILabelसाथ ऑटोलॉयउट जैसा ।UITextView

स्वचालित रूप से संभालता है

  • सुरक्षित क्षेत्र
  • सामग्री insets
  • लाइन के टुकड़े की गद्दी
  • पाठ कंटेनर इनसेट
  • प्रतिबन्ध
  • ढेर दृश्य
  • लटके हुए तार
  • जो कुछ।

इन जवाबों में से बहुत से मुझे वहाँ 90% मिला, लेकिन कोई भी मूर्ख नहीं था।

इस UITextViewउपवर्ग में गिराओ और तुम अच्छे हो।


#pragma mark - Init

- (instancetype)initWithFrame:(CGRect)frame textContainer:(nullable NSTextContainer *)textContainer
{
    self = [super initWithFrame:frame textContainer:textContainer];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit
{
    // Try to use max width, like UILabel
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    
    // Optional -- Enable / disable scroll & edit ability
    self.editable = YES;
    self.scrollEnabled = YES;
    
    // Optional -- match padding of UILabel
    self.textContainer.lineFragmentPadding = 0.0;
    self.textContainerInset = UIEdgeInsetsZero;
    
    // Optional -- for selecting text and links
    self.selectable = YES;
    self.dataDetectorTypes = UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber | UIDataDetectorTypeAddress;
}

#pragma mark - Layout

- (CGFloat)widthPadding
{
    CGFloat extraWidth = self.textContainer.lineFragmentPadding * 2.0;
    extraWidth +=  self.textContainerInset.left + self.textContainerInset.right;
    if (@available(iOS 11.0, *)) {
        extraWidth += self.adjustedContentInset.left + self.adjustedContentInset.right;
    } else {
        extraWidth += self.contentInset.left + self.contentInset.right;
    }
    return extraWidth;
}

- (CGFloat)heightPadding
{
    CGFloat extraHeight = self.textContainerInset.top + self.textContainerInset.bottom;
    if (@available(iOS 11.0, *)) {
        extraHeight += self.adjustedContentInset.top + self.adjustedContentInset.bottom;
    } else {
        extraHeight += self.contentInset.top + self.contentInset.bottom;
    }
    return extraHeight;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    
    // Prevents flashing of frame change
    if (CGSizeEqualToSize(self.bounds.size, self.intrinsicContentSize) == NO) {
        [self invalidateIntrinsicContentSize];
    }
    
    // Fix offset error from insets & safe area
    
    CGFloat textWidth = self.bounds.size.width - [self widthPadding];
    CGFloat textHeight = self.bounds.size.height - [self heightPadding];
    if (self.contentSize.width <= textWidth && self.contentSize.height <= textHeight) {
        
        CGPoint offset = CGPointMake(-self.contentInset.left, -self.contentInset.top);
        if (@available(iOS 11.0, *)) {
            offset = CGPointMake(-self.adjustedContentInset.left, -self.adjustedContentInset.top);
        }
        if (CGPointEqualToPoint(self.contentOffset, offset) == NO) {
            self.contentOffset = offset;
        }
    }
}

- (CGSize)intrinsicContentSize
{
    if (self.attributedText.length == 0) {
        return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
    }
    
    CGRect rect = [self.attributedText boundingRectWithSize:CGSizeMake(self.bounds.size.width - [self widthPadding], CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin
                                                    context:nil];
    
    return CGSizeMake(ceil(rect.size.width + [self widthPadding]),
                      ceil(rect.size.height + [self heightPadding]));
}

0

विटामिन वाटर का जवाब मेरे लिए काम कर रहा है।

यदि आपके टेक्स्टव्यू का टेक्स्ट, संपादन के दौरान [textView setScrollEnabled:NO];, सेट होने के बाद ऊपर और नीचे उछल रहा है Size Inspector > Scroll View > Content Insets > Never

आशा करता हूँ की ये काम करेगा।


0

अपने टैक्स्टव्यू के नीचे छिपे हुए उइलैबेल को रखें। लेबल लाइनें = 0. UITextView की बाधाओं को सेट करें जो कि UILabel (centerX, centerY, width, height) के बराबर हो। तब भी काम करता है जब आप पाठ दृश्य का स्क्रॉल व्यवहार छोड़ देते हैं।


-1

BTW, मैंने एक उप-वर्ग का उपयोग करके एक विस्तृत UITextView का निर्माण किया और आंतरिक सामग्री के आकार को ओवरराइड किया। मैंने UITextView में एक बग की खोज की जिसे आप अपने स्वयं के कार्यान्वयन में जांचना चाहते हैं। यहाँ समस्या है:

यदि आप एक बार में एक अक्षर लिखते हैं, तो बढ़ते टेक्स्ट दृश्य को बढ़ते टेक्स्ट को समायोजित करने में मदद मिलेगी। लेकिन अगर आप इसमें टेक्स्ट का एक गुच्छा चिपकाते हैं, तो यह नीचे नहीं बढ़ेगा, लेकिन पाठ स्क्रॉल करेगा और शीर्ष पर स्थित पाठ दृश्य से बाहर है।

समाधान: ओवरराइड सेटबाउंड्स: आपके उपवर्ग में। किसी अज्ञात कारण से, चिपकाने से सीमा समाप्त हो गई। नगण्य। मेरा मूल्य गैर-ज़ी (प्रत्येक मामले में 33 जो मैंने देखा था) होना चाहिए। इसलिए मैं सेट ओवरहेड करता हूं: हमेशा सीमा पर सेट करें ।origin.y को शून्य। समस्या का समाधान किया।


-1

यहाँ एक त्वरित समाधान है:

यह समस्या तब हो सकती है यदि आपने अपने टेक्स्टव्यू के झूठे होने के लिए क्लिपटॉब्स प्रॉपर्टी सेट की है। यदि आप इसे हटा देते हैं, तो समस्या दूर हो जाती है।

myTextView.clipsToBounds = false //delete this line

-3
Obj C:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic) UITextView *textView;
@end



#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize textView;

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor grayColor]];
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(30,10,250,20)];
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}

- (void)textViewDidChange:(UITextView *)txtView{
    float height = txtView.contentSize.height;
    [UITextView beginAnimations:nil context:nil];
    [UITextView setAnimationDuration:0.5];

    CGRect frame = txtView.frame;
    frame.size.height = height + 10.0; //Give it some padding
    txtView.frame = frame;
    [UITextView commitAnimations];
}

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