मैं इसकी सामग्री के लिए एक UITextView आकार कैसे करूँ?


521

क्या UITextViewइसकी सामग्री के अनुरूप आकार को समायोजित करने का एक अच्छा तरीका है? उदाहरण के लिए कहो UITextViewकि मेरे पास पाठ की एक पंक्ति है:

"Hello world"

मैं फिर पाठ की एक और पंक्ति जोड़ता हूं:

"Goodbye world"

कोको टच में एक अच्छा तरीका है rectकि टेक्स्ट व्यू में सभी लाइनें पकड़ें ताकि मैं पैरेंट व्यू को उसी हिसाब से एडजस्ट कर सकूं?

एक अन्य उदाहरण के रूप में, कैलेंडर एप्लिकेशन में घटनाओं के लिए नोट्स के क्षेत्र को देखें - ध्यान दें कि सेल (और UITextViewइसमें शामिल है) नोट्स के स्ट्रिंग में पाठ की सभी पंक्तियों को रखने के लिए फैलता है।


कृपया सही उत्तर को अपडेट करने पर विचार करें, क्योंकि स्वीकार किए जाने के बाद अनावश्यक गणना की जाती है, अब इस मुद्दे के लिए एक संतुष्ट संपत्ति है।
जुआन बोएरो

जवाबों:


610

यह iOS 6.1 और iOS 7 दोनों के लिए काम करता है:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

या स्विफ्ट में (iOS 11 में स्विफ्ट 4.1 के साथ काम करता है)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

यदि आप iOS 6.1 के लिए समर्थन चाहते हैं तो आपको यह भी करना चाहिए:

textview.scrollEnabled = NO;

1
UITableViewCell में UITextView का आकार बदलने के लिए iOS 7 पर परीक्षण किया गया। वास्तव में महान काम करता है। यह एकमात्र उत्तर है जिसने आखिरकार मेरे लिए काम किया। धन्यवाद!
एलेक्स

37
मुझे textview.scrollEnabled = NO;iOS 7.
ब्रायन

19
मैं CGFLOAT_MAXइसके बजाय मैक्रो का उपयोग करने की सलाह देता हूं MAXFLOAT। दोनों 32/64 बिट प्लेटफार्मों पर उचित।
Eonil

2
अगली पंक्ति में प्रवेश करने से पहले थोड़ा उतार-चढ़ाव का सामना करने वाले इस `NSRange नीचे = NSMakeRange (textView.text.length -1, 1) जोड़ें; [textView scrollRangeToV अदृश्य: नीचे]; `
ajay_nasa

4
स्विफ्ट संस्करण में दो अलग-अलग कॉल का आकार क्यों है? के लिए पहली पंक्ति क्या है?
नेकोनारी

576

यह अब iOS 7 या इसके बाद के संस्करण पर काम नहीं करता है

UITextViewसामग्री की सही ऊँचाई के आकार का आकार बदलने के लिए वास्तव में एक बहुत आसान तरीका है। यह का उपयोग करके किया जा सकता है UITextView contentSize

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

एक बात ध्यान देने योग्य है कि सही contentSize ही उपलब्ध है के बादUITextView से देखने के लिए जोड़ दिया गया है addSubview। उससे पहले यह बराबर हैframe.size

ऑटो लेआउट ON है तो यह काम नहीं करेगा। ऑटो लेआउट के साथ, सामान्य दृष्टिकोण का उपयोग करना हैsizeThatFits विधि करना और constantमूल्य को ऊंचाई की बाधा पर अद्यतन करना है ।

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint एक लेआउट बाधा है जिसे आप आम तौर पर एक स्टोरीबोर्ड में बनाई गई ऊंचाई की बाधा से संपत्ति को जोड़कर एक IBOutlet के माध्यम से सेटअप करते हैं।


बस इस अद्भुत उत्तर को जोड़ने के लिए, 2014, यदि आप:

[self.textView sizeToFit];

iPhone6 ​​+ के साथ व्यवहार में अंतर हैकेवल :

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

केवल 6+ (5s या 6 नहीं) के साथ यह UITextView में "एक और रिक्त रेखा" जोड़ता है। "आरएल समाधान" इसे पूरी तरह से ठीक करता है:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

यह 6 + पर "अतिरिक्त लाइन" समस्या को ठीक करता है।


2
आपने मेरा दिन बचाया। मैं इस बारे में भूल कर सेल्फकल्चिंग क्लास फंक्शन एक्सटेंशन से जूझ रहा था। धन्यवाद।
लुकाज़

4
अहा! मैं पाठ दृश्य ऊँचाई सेट कर रहा था और फिर युक्त दृश्य की ऊँचाई समायोजित कर रहा था। जाहिर है जब मैंने किया था कि पाठ दृश्य ऊंचाई समायोजित किया जा रहा था। युक्त दृश्य ऊँचाई सेट करने से पहले चीज़ें अपेक्षा के अनुरूप (या, बेहतर, आशा के लिए) काम करती हैं।
हॉट लिप्स

11
[_TextView sizeToFit] का उपयोग करना सामग्री को ताज़ा करता है, इसे स्क्रॉलव्यू में जोड़ने की आवश्यकता को पहले से हटा देता है।
रॉड्रिगो

1
यदि ऑटोलेयआउट का उपयोग कर रहे हैं, layoutIfNeededतो पर्यवेक्षण पर कॉल करें । तब आप ऊंचाई को पकड़ सकते हैं contentSize
फातमान

4
हालांकि यह बाहरी कंटेनर का आकार बदलने के बारे में है। IOS 7 में वह व्यवहार बदल गया है। मैं लिंक किए गए प्रश्न में दिखाता हूं कि sizeToFit और layoutIfNeeded को कहां जोड़ा जाए।
हेनरिक एरलैंडसन

93

एक गतिशील आकार बनाने के लिए UITextViewएक के अंदर UITableViewCell, मैंने पाया निम्नलिखित संयोजन iOS 8 SDK के साथ Xcode 6 में काम करता है:

  • एक जोड़े UITextViewएक करने के लिएUITableViewCell और पक्षों पर विवश करें
  • सेट UITextViewके scrollEnabledलिए संपत्ति NO। स्क्रॉलिंग सक्षम होने के साथ, का फ्रेमUITextView इसकी सामग्री के आकार से स्वतंत्र है, लेकिन स्क्रॉलिंग अक्षम होने के साथ, दोनों के बीच एक संबंध है।
  • यदि आपकी तालिका 44 की मूल डिफ़ॉल्ट पंक्ति की ऊंचाई का उपयोग कर रही है, तो यह स्वचालित रूप से पंक्ति की ऊँचाइयों की गणना करेगा, लेकिन यदि आपने डिफ़ॉल्ट पंक्ति की ऊँचाई को किसी और चीज़ में बदल दिया है, तो आपको पंक्ति की ऑटो-गणना पर मैन्युअल रूप से स्विच करने की आवश्यकता हो सकती है viewDidLoad:

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;

रीड-ओनली डायनामिक साइज़िंग UITextViews के लिए, बस। यदि आप उपयोगकर्ताओं को अपने में पाठ को संपादित करने की अनुमति दे रहे हैं UITextView, तो आपको निम्न करने की आवश्यकता है:

  • प्रोटोकॉल की textViewDidChange:विधि को लागू करें UITextViewDelegate, और tableViewपाठ को संपादित किए जाने पर हर बार खुद को फिर से बताने के लिए कहें :

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
  • और UITextViewडेलीगेट को कहीं और सेट करने के लिए मत भूलना , या तो में Storyboardया अंदरtableView:cellForRowAtIndexPath:


मेरे लिए सबसे अच्छा जवाब। पूरी तरह से काम किया और UITableViewAutomaticDimension को iOS 5 में जोड़ा गया ताकि यह पीछे की ओर संगत हो।
स्ममेलर

4
मेरे लिए काफी काम नहीं किया। TextViewDidChange विधि के कारण हर बार मेरे द्वारा किसी वर्ण को टाइप करने के लिए मेरा टेबलव्यू बाउंस हो जाता है। मेरा सुझाव है कि उस पद्धति का उपयोग करने के बजाय, तालिका में देखें: cellForRowAtIndexPath विधि, उस पर टेक्स्टव्यू के साथ पंक्ति के लिए, यदि आप केवल पढ़ने के लिए मोड सेट हैं। NO को संकलित करें और यदि आप संपादन दृश्य सेट में हैं। YES में स्क्रॉल सक्षम है। इस तरह से जब इसे प्रदर्शित किया जाएगा तो यह हमेशा पूर्ण पाठ दिखाएगा और जब इसे संपादित किया जाएगा तो यह पूर्ण पाठ के साथ शुरू होगा और जैसा कि आप आगे पाठ जोड़ते हैं, पहले के पाठ को ऊपर से स्क्रॉल करते हुए एक ही आकार रहेगा
साइमनडाइवर

3
इसके अलावा मैंने टेक्स्टव्यू में एक> = ऊंचाई की बाधा को जोड़ा क्योंकि खाली टेक्स्टफील्ड की कोई ऊंचाई नहीं थी और संपादन शुरू करने के लिए टैप नहीं किया जा सकता था।
साइमनइंडवर

उत्कृष्ट समाधान। मेरे लिए, tableView.rowHeight = UITableViewAutomaticDimensionअनावश्यक था।
क्रिस्टोफर पिक्सले

फिर से धन्यवाद ब्रेट डोनाल्ड! मैं यह भूल गया कि यह कैसे करना है और 1 साल बाद एक बार फिर आपका जवाब मिला 😀
एरिक कॉनर

74

कोड और स्टोरीबोर्ड दोनों का उपयोग करके बहुत आसान काम समाधान।

कोड द्वारा

textView.scrollEnabled = false

स्टोरीबोर्ड द्वारा

स्क्रॉलिंग सक्षम को अनचेक करें

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

इसके अलावा कुछ करने की जरूरत नहीं है।


5
यह उत्तर सही है। StoryBoard में आपके पास एक UILabel की तरह TextView AutoSize है। हमें बस इतना करना है कि स्क्रॉल करें सक्षम किया गया है = गलत।
pnavk

4
अनिवार्य रूप से, यह सही है: यदि आप ऑटोलेयूट बाधाओं का उपयोग कर रहे हैं और स्क्रॉलिंग बंद कर रहे हैं, तो पूरी चीज काम करती है।
दान रोसेनस्टार्क

2
बहुत बहुत धन्यवाद। यह इतना आसान था, बस स्टोरीबोर्ड या कोड में स्क्रॉल करना अक्षम करें, यह लाइनों के साथ UILabel की तरह होगा 0.
samir105

@Mansuu .... यह एक गारंटीकृत समाधान नहीं है, क्योंकि ऐसी चीजें हैं जो आप आंतरिक सामग्री के आकार को ओवरराइड करने के लिए कर सकते हैं, और यदि आप दृश्य निर्धारित होने के बाद पाठ को बदलते हैं तो यह तब तक अपडेट नहीं होगा जब तक आप इसे सेट नहीं करते। तक। लेकिन, उन चीजों को एक टेक्स्टफील्ड पर नंबरऑफलाइन = 0 सेट करने के लिए सही रहता है। यदि यह काम नहीं करता है, तो संभवतः आपके पास अन्य बाधाएं हैं जो स्पष्ट रूप से एक ऊंचाई निर्धारित करेंगी।
जेक टी।

2
@ आईओएस यदि आप ऊंचाई की सीमा को जोड़ रहे हैं तो बाधाओं को प्राथमिकता कम करें अन्यथा यह काम नहीं करेगा।
आलोक

61

स्विफ्ट:

textView.sizeToFit()

14
इसके अलावा, मैंने पाया कि मुझे काम करने के लिए झूठे को स्क्रॉलिंग सेट करने की आवश्यकता थी। textView.scrollEnabled = false
tmarkiewicz

1
आपको textView.layoutIfNeeded () textView.sizeToFit () के बाद कॉल करना याद रखना चाहिए
डैनियल कुटा

5
@tmarkiewicz यह तब काम करता है जब टेक्स्ट आपके डिवाइस की स्क्रीन पर फिट बैठता है लेकिन यह तब समस्या होगी जब आपका टेक्स्ट स्क्रीन पर मौजूद स्पेस से बड़ा हो। बाकी टेक्स्ट को देखने के लिए आप इसे स्क्रॉल नहीं कर पाएंगे।
फ्रांसिस्को रोमेरो

ये है जवाब !!! अधिक जटिल समाधान के लिए कोई ज़रूरत नहीं है !!! @FranciscoRomero टेबुलव्यू को टेबिल सेल या कोलीसिटॉन व्यू सेल में क्यों नहीं रखा जाता है, तो आप हमेशा टेबल या कोलीसिटन दृश्य को स्क्रॉल कर सकते हैं ....
बेन स्मिथ

23

मेरे (सीमित) अनुभव में,

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

न्यूलाइन वर्णों का सम्मान नहीं करता है, इसलिए आप CGSizeवास्तव में आवश्यक की तुलना में बहुत कम के साथ समाप्त हो सकते हैं ।

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

लगता है newlines का सम्मान करते हैं।

इसके अलावा, पाठ वास्तव में शीर्ष पर प्रदान नहीं किया गया है UITextView। मेरे कोड में, मैंने विधियों UITextViewद्वारा लौटी ऊंचाई से 24 पिक्सेल बड़ा होने के लिए नई ऊँचाई निर्धारित की है sizeOfFont


3
इसे आकार मिलता है जैसे कि यह एक UILabel पर पाठ को आकर्षित करेगा। यदि आप उस आकार को uitextview के फ्रेम में सेट करते हैं तो आपके पास अभी भी उसमें कुछ स्क्रॉलिंग आवश्यक होगी।
केवलर

22

IOS6 में, आप contentSizeटेक्स्ट सेट करने के तुरंत बाद UITextView की संपत्ति की जांच कर सकते हैं। IOS7 में, यह अब काम नहीं करेगा। यदि आप iOS7 के लिए इस व्यवहार को पुनर्स्थापित करना चाहते हैं, तो निम्न कोड को UITextView के एक उपवर्ग में रखें।

- (void)setText:(NSString *)text
{
    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    }
}

2
मैं इसके बारे में और कहां पढ़ सकता हूं? मैं इस बारे में iOS 7 में प्रतीत होता है कि नए व्यवहार के रूप में पूरी तरह से खो गया हूं।
स्टियन होइलैंड

चर CGSize आकार का अर्थ क्या है?
Tchelow

मैंने आकार हटा दिया, यह वहां नहीं होना चाहिए था।
21

18

मैं इस बिंदु पर पढ़ने के लिए किसी के बहादुर (या पर्याप्त निराश) होने पर पृष्ठ के नीचे सही समाधान पोस्ट करूंगा।

यहाँ उन लोगों के लिए gitHub रेपो है, जो उस सभी पाठ को पढ़ना नहीं चाहते हैं: resizableTextView

यह iOs7 के साथ काम करता है (और मुझे विश्वास है कि यह iOs8 के साथ काम करेगा) और ऑटोलॉयआउट के साथ। आपको जादू की संख्या की आवश्यकता नहीं है, लेआउट और सामान को अक्षम करें। संक्षिप्त और सुरुचिपूर्ण समाधान।

मुझे लगता है, कि सभी बाधाओं से संबंधित कोड को updateConstraintsविधि पर जाना चाहिए । तो, चलो अपना खुद का बनाते हैं ResizableTextView

यहाँ हम पहली समस्या यह है कि viewDidLoadविधि से पहले वास्तविक सामग्री का आकार नहीं जानते हैं । हम लंबी और छोटी सड़क ले सकते हैं और इसे फ़ॉन्ट आकार, लाइन ब्रेक आदि के आधार पर गणना कर सकते हैं, लेकिन हमें मजबूत समाधान की आवश्यकता है, इसलिए हम करेंगे:

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

तो अब हम जानते हैं कि वास्तविक सामग्री को कोई फर्क नहीं पड़ता कि हम कहाँ हैं: पहले या बाद में viewDidLoad। अब textView (स्टोरीबोर्ड या कोड के माध्यम से, कोई फर्क नहीं पड़ता) पर ऊंचाई की बाधा जोड़ें। हम उस मान को अपने साथ समायोजित करेंगे contentSize.height:

[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
    if (constraint.firstAttribute == NSLayoutAttributeHeight) {
        constraint.constant = contentSize.height;
        *stop = YES;
    }
}];

अंतिम बात यह है कि सुपरक्लास को बताना है updateConstraints

[super updateConstraints];

अब हमारा वर्ग ऐसा दिखता है:

ResizableTextView.m

- (void) updateConstraints {
    CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

    [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            constraint.constant = contentSize.height;
            *stop = YES;
        }
    }];

    [super updateConstraints];
}

सुंदर और साफ है, है ना? और आपको अपने नियंत्रकों में उस कोड से निपटने की ज़रूरत नहीं है !

लेकिन रुकें! Y नहीं एनिमेशन!

आप आसानी से textViewखिंचाव को सुगम बनाने के लिए आसानी से चेतन कर सकते हैं । यहाँ एक उदाहरण है:

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        [self.view layoutIfNeeded];
    } completion:nil];

4
का उपयोग करें CGFLOAT_MAX, नहीं FLT_MAX
लूट मय २३'१४

काश, मैं आपको इस भयानक समाधान के लिए एक से अधिक वोट दे पाता !!
स्कूटर

13

क्या आप ने कोशिश की [textView sizeThatFits:textView.bounds] ?

संपादित करें: sizeThatFits आकार लौटाता है लेकिन वास्तव में घटक का आकार नहीं बदलता है। मुझे यकीन नहीं है कि अगर आप चाहते हैं, या यदि [textView sizeToFit]आप क्या देख रहे हैं तो यह अधिक है। किसी भी मामले में, मुझे नहीं पता कि यह पूरी तरह से आपकी पसंद की सामग्री को फिट करेगा या नहीं, लेकिन यह पहली कोशिश है।


2
sizetofit दिन बचाता है
michaelsnowden

9

एक अन्य विधि यह है कि विधि के उपयोग से एक विशेष स्ट्रिंग आकार लेगा NSString:

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

यह आयत का आकार देता है जो दिए गए फ़ॉन्ट के साथ दिए गए स्ट्रिंग को फिट करता है। वांछित चौड़ाई और अधिकतम ऊंचाई के साथ एक आकार में पास करें, और फिर आप पाठ को फिट करने के लिए वापस लौटी ऊंचाई को देख सकते हैं। एक संस्करण है जो आपको लाइन ब्रेक मोड को भी निर्दिष्ट करने देता है।

फिर आप अपने दृश्य के आकार को बदलने के लिए लौटे आकार का उपयोग कर सकते हैं।


8

यदि आपके पास UITextViewकाम नहीं है (उदाहरण के लिए, आप टेबल व्यू सेल्स को साइज़ कर रहे हैं), तो आपको स्ट्रिंग को मापकर आकार की गणना करनी होगी, फिर ए के प्रत्येक पक्ष पर पैडिंग के 8 पीटी का हिसाब देना होगा UITextView। उदाहरण के लिए, यदि आप अपने पाठ दृश्य की वांछित चौड़ाई जानते हैं और इसी ऊंचाई का पता लगाना चाहते हैं:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

यहां, प्रत्येक 8 चार गद्देदार किनारों में से एक के लिए लेखांकन है, और 100000 बस एक बहुत बड़े अधिकतम आकार के रूप में कार्य करता है।

व्यवहार में, आप font.leadingऊंचाई में एक अतिरिक्त जोड़ना चाह सकते हैं ; यह आपके पाठ के नीचे एक रिक्त रेखा जोड़ता है, जो पाठ दृष्टि के नीचे सीधे दृष्टिगत भारी नियंत्रण होने पर बेहतर लग सकता है।


आईओएस 8.1 में सही परिणाम
लॉजिक

पैडिंग मेरे लिए महत्वपूर्ण थी
थिबुत नोह

8

हम इसे बाधाओं से कर सकते हैं।

  1. UITextView के लिए ऊंचाई की बाधाओं को निर्धारित करें। यहाँ छवि विवरण दर्ज करें

2. उस ऊंचाई बाधा के लिए IBOutlet बनाएँ।

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. अपने टेक्स्टव्यू के लिए प्रतिनिधि सेट करना न भूलें।

4।

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

तो इस तरह अपने बाधा अद्यतन :)


यह एक काल्पनिक उपनाम है!
फेटी

[TextView layoutIfNeeded] द्वारा पीछा की जाने वाली निरंतर आवश्यकताओं की स्थापना; एनीमेशन ब्लॉक में। (Autolayout एनिमेशन की तरह करते हैं।)
विल Larche

7

निम्नलिखित बातें पर्याप्त हैं:

  1. बस अपने लिए कोई स्क्रॉलिंग सक्षम करने के लिए याद रखें :UITextView

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

  1. ऑटो लेआउट बाधाओं को उचित रूप से सेट करें।

तुम भी उपयोग कर सकते हैं UITableViewAutomaticDimension


6

माइक मैकमास्टर के उत्तर के साथ संयुक्त, आप कुछ ऐसा करना चाहते हैं:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}

6

मुझे इसके अंदर पाठ के अनुसार एक पाठ क्षेत्र की ऊंचाई का आकार बदलने का एक तरीका पता चला और पाठ क्षेत्र की ऊंचाई के आधार पर इसके नीचे एक लेबल की भी व्यवस्था करें! यहाँ कोड है।

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];

यहाँ '5' में y - UILabel का समन्वय वह अंतर है जो मुझे textView और Label के बीच चाहिए।
धीरज

6

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

किसी अन्य एपीआई का उपयोग करने की आवश्यकता नहीं है। बस एक लाइन सभी मुद्दे को ठीक कर देगी।

[_textView sizeToFit];

यहाँ, मैं केवल ऊंचाई के साथ चिंतित था, चौड़ाई को स्थिर रखते हुए और स्टोरीबोर्ड में मेरे टेक्स्ट व्यू की चौड़ाई की कमी को याद किया था।

और यह सेवाओं से गतिशील सामग्री को दिखाने के लिए था।

आशा है कि यह मदद कर सकता है ..


6

IOS 8 के साथ शुरू करना, UITableView के ऑटो लेआउट फीचर्स का उपयोग करना संभव है, कोई कस्टम कोड के साथ UITextView का स्वचालित रूप से आकार बदलने के लिए। मैंने एक परियोजना github में रखी है जो इस क्रिया में प्रदर्शित करता है, लेकिन यहाँ कुंजी है:

  1. UITextView में स्क्रॉलिंग अक्षम होना चाहिए, जिसे आप प्रोग्रामेटिक रूप से या इंटरफ़ेस बिल्डर के माध्यम से कर सकते हैं। स्क्रॉल करने में सक्षम होने पर यह आकार नहीं देगा क्योंकि स्क्रॉल करने से आप बड़ी सामग्री देख सकते हैं।
  2. UITableViewController के लिए ViewDidLoad में, आपको अनुमानितReHeight के लिए मान सेट करना होगा और फिर सेट करना rowHeightहोगा UITableViewAutomaticDimension

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. प्रोजेक्ट परिनियोजन लक्ष्य iOS 8 या अधिक होना चाहिए।

1
इस तरह के जवाब हतोत्साहित करते हैं। आपको यहां संबंधित कोड पोस्ट करना चाहिए।
अंटीज

5

मैंने सभी उत्तरों की समीक्षा की और सभी निश्चित चौड़ाई रख रहे हैं और केवल ऊँचाई को समायोजित कर रहे हैं। यदि आप भी चौड़ाई समायोजित करना चाहते हैं तो आप इस विधि का उपयोग आसानी से कर सकते हैं:

इसलिए अपने पाठ दृश्य को कॉन्फ़िगर करते समय, स्क्रॉल को अक्षम करें पर सेट करें

textView.isScrollEnabled = false

और फिर प्रतिनिधि विधि func textViewDidChange(_ textView: UITextView)में यह कोड जोड़ें:

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

आउटपुट:

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

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


प्रतिनिधि विधि @Peter Stajger
Mansuu ....

4

यह अच्छी तरह से काम करता है जब मुझे UITextViewएक विशिष्ट क्षेत्र में एक पाठ बनाने की आवश्यकता होती है :

// पाठ को पहले से ही सबव्यू में जोड़ा जाना चाहिए, या सामग्री साक्षात्कार गलत होगा।

- (शून्य) को कम करेंफोंट: (UITextView *) टीवी {
    UIFont * फ़ॉन्ट = tv.font;
    double pointSize = font.pointSize;

    जबकि (tv.contentSize.height> tv.frame.size.height और& pointSize> 7.0) {
        पॉइंटसाइज़ - = 1.0;
        UIFont * newFont = [UIFont fontWithName: font.fontName size: pointSize];
        tv.font = newFont;
    }
    अगर (इंगित करें! = font.pointSize)
        NSLog (@ "% से नीचे फ़ॉन्ट।% से .ff% .ff", पॉइंटसाइज़, tv.font.pointfize);
}

4

यहाँ @jibberd का स्विफ्ट संस्करण है

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell

6
प्रश्न वास्तव में भाषा अज्ञेय है। क्या UIKit संबंधित प्रश्नों पर सभी उत्तरों के लिए वापस जाना और स्विफ्ट पोर्ट लिखना वास्तव में आवश्यक है? लगता है कि एक शोर बातचीत के लिए बनाता है।
eremzeit

समस्या यह है कि इन प्रश्नों में से अधिकांश में कोई विशिष्ट प्रोग्रामिंग भाषा नहीं है, इसलिए आप इसे Google में पाएंगे भले ही आप तेज भाषा के लिए खोज करते हों
फरीद अलन्मृती

4

स्क्रॉल करना अक्षम करें

अड़चनें जोड़ें

और अपना पाठ जोड़ें

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

यदि आप उपयोग करते UIScrollViewहैं तो आपको इसे भी जोड़ना चाहिए;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}


2

UITextViewDelegate का उपयोग करना सबसे आसान तरीका है:

func textViewDidChange(_ textView: UITextView) {
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height
}

1

उम्मीद है की यह मदद करेगा:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}

यह काम नहीं करता है! यह एक त्रुटि का कारण बनता है: "असाइनमेंट के बाएं ऑपरेंड के रूप में आवश्यक अंतराल"
लेविथान

आप केवल असाइन कर सकते हैं textView.frame
ज्वेरीच

1

अगर कोई अन्य यहाँ मिलता है, तो यह समाधान मेरे लिए काम करता है, 1 "रॉनी एलवाईई" +4 "उपयोगकर्ता 63934" (मेरा पाठ वेब सेवा से आता है): 1000 पर ध्यान दें (मेरे मामले में इतना बड़ा "कुछ भी नहीं हो सकता)

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

और वह है ... चीयर्स


1

सबसे अच्छा तरीका है जो मुझे पाठ के आकार के अनुसार UITextView की ऊंचाई को फिर से आकार देने के लिए मिला।

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

या आप उपयोग कर सकते हैं

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];

1

उन लोगों के लिए जो टेक्स्टव्यू चाहते हैं कि वे वास्तव में ऊपर जाएं और नीचे की रेखा की स्थिति बनाए रखें

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}

1

काम करने वाला एकमात्र कोड वह है जो 'SizeToFit' का उपयोग करता है जैसा कि ऊपर दिए गए जवाब में होता है लेकिन वास्तव में इसे तब तक नहीं उठाया जाएगा जब तक कि आप इसे ViewDidAppear में नहीं कहते हैं या इसे UITextView पाठ परिवर्तित किए गए ईवेंट में तार नहीं करते हैं।


1

निकिता टूक के जवाब के आधार पर मैं स्विफ्ट में निम्नलिखित समाधान पर आया जो iOS 8 पर ऑटोलेयूट के साथ काम करता है:

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }

1

स्विफ्ट उत्तर: निम्नलिखित कोड आपके टेक्स्ट व्यू की ऊंचाई की गणना करता है।

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

अब आप अपने textView की ऊंचाई सेट कर सकते हैं myTextHeight


क्षमा करें, इसका क्या मतलब है: let attribute = [NSFontAttributeName: textView.text.font!] क्या यह वास्तव में त्रुटियों के बिना स्विफ्ट कोड है?) क्या आपका मतलब है let attribute = [NSFontAttributeName: textView.font!]
बड़े पैमाने पर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.