2012-11-21 16 views
10

मैं एक टिप्पणी अनुभाग बना रहा हूं जैसे कि फेसबुक के आईओएस ऐप में इसके मैसेजिंग सेक्शन के लिए एक फेसबुक का उपयोग करता है। मैं UITextView ऊंचाई को आकार देने के लिए चाहता हूं, इसलिए जिस पाठ को मैं टाइप कर रहा हूं उसे उस पाठ को देखने के लिए स्क्रॉल करने के बजाय इसके अंदर फिट बैठता है। कोई विचार है कि मैं ऐसा करने के बारे में कैसे जा सकता हूं?इसके अंदर टाइप करते समय UITextView का आकार कैसे बदलें?

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

मैं मुझे लगता है कि पता लगाता समारोह के कुछ प्रकार की जरूरत है जब पाठ तक पहुँच जाता है मान लेते हैं: मैं शायद एक CGRect है कि आकार और पाठ दृश्य की ऊंचाई जो तब सामग्री आकार से मेल खाता है करने के लिए असाइन किया गया है का उपयोग करते हुए देखा है UITextView की सीमाएं और फिर दृश्य की ऊंचाई का आकार बदलती हैं? क्या किसी ने भी इस अवधारणा से संघर्ष किया है?

+0

आप विस्तृत कार्य समाधान [यहां] (http://stackoverflow.com/a/37633816/2066428) – malex

उत्तर

20

आप इस प्रतिनिधि विधि में फ्रेम समायोजित कर सकते हैं, टेक्स्ट व्यू के प्रतिनिधि को स्वयं में सेट करना न भूलें।

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
     [self adjustFrames]; 
     return YES; 
} 


-(void) adjustFrames 
{ 
    CGRect textFrame = textView.frame; 
    textFrame.size.height = textView.contentSize.height; 
    textView.frame = textFrame; 
} 

इस समाधान iOS6 और पूर्व के लिए है ... iOS7 इस

StackOverflow Answer का उल्लेख के लिए

+0

देख सकते हैं वास्तव में? मुझे नहीं लगता था कि यह इतना आसान होगा .. ठीक है धन्यवाद, मैं इसे जाने दूंगा! – Ollie177

+0

यह आपकी मदद के लिए बहुत अच्छा काम करता है! – Ollie177

+3

यह आईओएस 7.0 – Stavash

1

contentsize में ios 7 काम नहीं करेगा इस प्रयास करें:

CGFloat textViewContentHeight = textView.contentSize.height; 

textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9); 
+4

क्यों जादुई संख्या? – vvMINOvv

6

यह मेरा समाधान है, autolayout और textView.contentSize.height का उपयोग कर। आईओएस 8 एक्सकोड 6.3 बीटा 4 पर परीक्षण किया गया।

अंत में setContentOffset के बारे में एक पकड़ है। लाइन गिनती में बदलाव होने पर मैंने इसे "गलत सामग्री ऑफसेट" आर्टेफैक्ट से बचने के लिए रखा है। यह आखिरी पंक्ति के नीचे एक अतिरिक्त अवांछित रिक्त स्थान जोड़ता है और यह तब तक बहुत अच्छा नहीं दिखता जब तक कि आप बाधा को बदलने के बाद इसे ठीक से सेट न करें। इसे समझने के लिए मुझे घंटों लग गए!

// set this up somewhere 
let minTextViewHeight: CGFloat = 32 
let maxTextViewHeight: CGFloat = 64 

func textViewDidChange(textView: UITextView) { 

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal 

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height 
     height = minTextViewHeight 
    } 
    if (height > maxTextViewHeight) { // max cap 
     height = maxTextViewHeight 
    } 

    if height != textViewHeight.constant { // set when height changed 
     textViewHeight.constant = height // change the value of NSLayoutConstraint 
     textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes 
    } 
} 
+0

'textViewHeight' कहां घोषित किया गया है? – lf215

+1

@ lf215 यह UITextView की ऊँचाई का 'NSLayoutConstraint' वस्तु है। मैं क्षमा चाहता हूँ भूल गया। – Hlung

+0

मैं इसके लिए बहुत नया हूं। क्या आप टेक्स्टव्यू हाइट कैसे प्राप्त करें यह दिखाने के लिए कृपया विस्तृत कोड जोड़ सकते हैं? NSLayoutConstraint 'जो आप अपने' इंटरफ़ेस में UITextView' बिल्डर की ऊंचाई बाधा से कनेक्ट: – lf215

4

TableViewController कि UITextView रखती है पर, tableViewDataSource से डेटा सेल में डाल दिया जाता है और फिर बस इस फोन है कि अद्यतन:

tableView.beginUpdates() 
    tableView.endUpdates() 

विपरीत tableView.reloadData(), यह नहीं है फोन resignFirstResponder

+0

यह सही है! धन्यवाद। ObjC में यहाँ एक ही: '- (शून्य) textViewDidChange: (UITextView *) TextView {[self.tableView beginUpdates]; [self.tableView endUpdates]; } 'आप एनीमेशन भी मुफ्त में प्राप्त करते हैं;) – Holtwick

2

सबसे पहले अपने TextView के लिए न्यूनतम ऊंचाई की कमी सेट:

textView.heightAnchor.constraint(greaterThanOrEqualTo: view.heightAnchor, multiplier: 0.20) 

या सरल (सुनिश्चित करें कि आप greaterThanOrEqualTo बाधा सेट कर रहे हैं, इसलिए यदि आंतरिक सामग्री ऊंचाई इस ऊंचाई से अधिक है कि, यह आंतरिक सामग्री ऊंचाई लेता है) निरंतर

textView.heightAnchor.constraint(greaterThanOrEqualToConstant: someConstant) 

अपने TextView को विन्यस्त करते हैं, करने के लिए isScrollEnabled सेट झूठी

textView.isScrollEnabled = false 

अब जब आप TextView पर टाइप करें, उसके अंतर्निहित सामग्री आकार ऊंचाई में वृद्धि होगी और यह अपने आप में यह नीचे विचारों धक्का होगा।

संबंधित मुद्दे