2014-05-10 12 views
9

मेरे पास UIScrollView में एम्बेडेड एक गैर-स्क्रोल करने योग्य UITextView है और UITextView गतिशील रूप से टेक्स्ट जोड़ें। UIScrollView इसकी सामग्री को समायोजित करें टेक्स्ट व्यू के फ्रेम के आधार पर आकार बदलें। हालांकि, UITextView की ऊंचाई 8192 की ऊंचाई से अधिक हो जाने पर, पाठ अदृश्य हो जाएगा (लेकिन फिर भी वहां, क्योंकि आप टेक्स्ट को हाइलाइट करने के लिए आवर्धक ग्लास का उपयोग कर सकते हैं और आवर्धक ग्लास के माध्यम से टेक्स्ट के हिस्सों को भी देख सकते हैं)। आकार UITextView तदनुसार कोऊंचाई के बाद UITextView पाठ अदृश्य हो जाता है 8192.0

CGRect textviewFrame = self.TextView.frame; 
    textviewFrame.size.height = [self textViewHeightForAttributedText:self.TextView.attributedText andWidth:320.0]; 
    self.TextView.frame = textviewFrame; 
    self.ScrollView.contentSize = self.TextView.frame.size; 

हेल्पर समारोह:

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width 
{ 
    UITextView *textView = [[UITextView alloc] init]; 
    [textView setAttributedText:text]; 
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)]; 
    return size.height; 
} 

पता ही नहीं था जब तक मैं 8193 और करने के लिए अधिकतम आकार मजबूर कर स्पष्ट रूप से बाहर यह परीक्षण किया यह एक ही सटीक समस्या यह है कि अनसुलझी here था समस्या आई (जबकि 8192 के अधिकतम आकार में अभी भी पाठ सही ढंग से दिख रहा था)। कोई भी इस समस्या में भाग लेता है और आसपास के काम के बारे में जानता है? धन्यवाद

+0

समस्या यह नहीं है कि पाठ गायब हो जाता है। समस्या पाठ दृश्य की ऊंचाई है। यह एक प्रमुख कार्यान्वयन गलती की तरह लगता है। चारों ओर काम दृढ़ता से आपके यूआई के विवरण पर निर्भर करता है। – dasdom

+0

एक बग की तरह दिखता है, नियंत्रण इस तरह व्यवहार नहीं करना चाहिए। एप्पल को बग रिपोर्ट जमा करें। –

+0

@dasdom मेरे यूआई के बारे में क्या जानकारी आपके लिए उपयोगी होगी? अनिवार्य रूप से जब भी उपयोगकर्ता UIScrollView के नीचे स्क्रॉल करता है, तो UITextView में अधिक टेक्स्ट जोड़ा जाता है और UIScrollView की सामग्री आकार अपडेट किया जाता है। यह scrollViewDidChange विधि – SimplyLearning

उत्तर

3

मुझे हाल ही में इस समस्या से मारा गया था और इसके आसपास एक प्रभावी तरीका काम किया है। हालांकि यह आईओएस बग आईएमएचओ जैसा लगता है, यह वास्तव में नहीं है ... कैलियर आकारों के लिए व्यावहारिक सीमाएं हैं, साथ ही टेक्स्ट के 8 के उच्च टुकड़े को चित्रित करने में काफी समय लगता है। ऐप्पल के इरादे से करना बेहतर है और केवल उस पाठ का थोड़ा सा प्रस्तुत करना है जो दृश्यमान है ... यही कारण है कि UITextView UIScrollView को सभी के बाद बढ़ाता है।

समस्या यह है कि UITextView UI के अन्य बिट्स के साथ एकीकृत करने के लिए बहुत आसान नहीं है। मेरे मामले में मैं एक समाचार ऐप पर काम कर रहा हूं जहां आलेख को प्रस्तुत करने के लिए एक एकल UITextView का उपयोग किया जाता है, साथ ही इसके ऊपर और नीचे कुछ अलग यूआई (शीर्षक और बटन इत्यादि) हैं, सभी एक स्क्रोल करने योग्य कंटेनर में होस्ट किए गए हैं।

समाधान मैंने पाया दो दृश्य ... एक समर्पित UITextView कंटेनर जिसका फ्रेम पूरा टेक्स्ट आकार (यानी एक ही आकार के अपने UITextView के contentSize) और जो अपने UITextView के superview है में UITextView विभाजित करने के लिए है। आपके बच्चे UITextView का फ्रेम बाहरी स्क्रोल करने योग्य कंटेनर की सीमाओं पर सेट किया जाना चाहिए।

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

-4

हैलो मुझे लगता है कि उत्तर देने में देर नहीं हुई है। मुझे आपके जैसी ही समस्या मिली है। यह मेरा समाधान है:

textView.scrollEnabled = YES;  
contentTextView.attributedText = finalAttrString; 
// contentTextView.text = [attrString string]; 
contentTextView.font = kFont(contentTextFS + [valueOfStepper intValue]); 

[contentTextView sizeToFit]; 
contentTextView.height += 1;//This is the key code 
//contentTextView.height = 8192.0f 

उन्हें मैं मुसीबत का हल और मैं यहाँ एक पूरी तरह कार्यात्मक समाधान, किसी के लिए भी यह चाहते हैं, यह है iOS 8

+0

टेक्स्ट व्यू == सामग्री टेक्स्टव्यू – fltx

+0

पूछे गए प्रश्न के साथ इसका क्या संबंध है? –

1

पर आकार dynamic.Successfull बदल सकते हैं!

** अपनी सामग्री आकार मान लिया जाये कि दो पाठ विचारों **

यह समाधान काम करता है की सीमा से अधिक नहीं होगा आपके विचार के लिए दो UITextViews जोड़ने, और उन दोनों के बीच अपने पाठ विभाजित करके। यह जटिल लग रहा है, लेकिन यह वास्तव में बहुत आसान है!मैं सिर्फ एक बहुत वर्बोज़ वर्णन :)

चरण 1 में लिखा है - आपके विचार के लिए दो UITextViews जोड़ें:

मैं अपने स्टोरीबोर्ड में मेरा गयी। उन्हें रखें ताकि एक दूसरे के ऊपर सीधे हो, जिसमें उनके बीच कोई जगह न हो। ऊंचाई निर्धारित करने के बारे में चिंता न करें (हम इसे बाद में सेट करेंगे)।

विचारों पर

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

विचारों की ऊंचाई पर किसी भी बाधाओं सेट न करें, या यदि आप (बाधाओं निरीक्षक की चेतावनी से बचने के लिए) होगा, >= 20 होने के लिए दृश्यों में से एक की ऊंचाई सेट, या कुछ समान रूप से छोटी संख्या।

स्क्रॉलिंग, बाउंसिंग और स्क्रॉलिंग संकेतक दोनों को अपने टेक्स्ट दृश्यों के लिए अक्षम करें। यह समाधान एक निश्चित, गैर स्क्रोल करने योग्य ऊंचाई के विचारों पर निर्भर करता है, इसलिए यदि आप अपनी सामग्री को स्क्रॉल करना चाहते हैं, तो आपको एक कंटेनर के रूप में UIScrollView या UITableViewCell का उपयोग करना चाहिए।

आपके विचार नियंत्रक फ़ाइल में अपने दो नए पाठ विचारों के लिए दुकानों बनाएँ, उन्हें textView1 और textView2 की तरह कुछ नामकरण।

चरण 2 - सेट textContainerInsets शून्य करने के लिए:

शून्य करने के लिए दोनों पाठ विचारों पर textContainerInset प्रॉपर्टी सेट, या तो उपयोगकर्ता निर्धारित क्रम का उपयोग कर गुण:

या कोड:

self.textView1.textContainerInset = UIEdgeInsetsZero; 
self.textView2.textContainerInset = UIEdgeInsetsZero; 

यह सुनिश्चित करेगा कि कोई दृश्य स्थान ऐप नहीं करेगा सामग्री सेट होने पर दो विचारों के बीच कान, और अपने विचारों के आस-पास के अन्य अंतर को प्रभावित नहीं करना चाहिए।

चरण 3 -, अपनी सामग्री को विभाजित यह निर्धारित करते हैं, और देखने ऊंचाइयों अद्यतन:

बस अपने दृश्य नियंत्रक फ़ाइल (viewDidLoad) में निम्न कोड कॉपी करें और अपनी सामग्री के लिए contentString चर सेट।

/* Content is split across two UITextViews to avoid max drawing height */ 

NSString *contentString = @"Some very long piece of text..."; 

// Set text 
NSArray *components = [contentString componentsSeparatedByString:@"\n"]; 
NSInteger halfLength = [components count]/2; 
NSArray *firstHalf = [components subarrayWithRange:NSMakeRange(0, halfLength)]; 
NSArray *secondHalf = [components subarrayWithRange:NSMakeRange(halfLength, [components count] - halfLength)]; 
NSString *contentString1 = [firstHalf componentsJoinedByString:@"\n"]; 
NSString *contentString2 = [secondHalf componentsJoinedByString:@"\n"]; 
self.textView1.text = contentString1; 
self.textView2.text = contentString2; 

// Set text view heights 
CGFloat fixedWidth1 = self.textView1.frame.size.width; 
CGFloat fixedWidth2 = self.textView2.frame.size.width; 
CGSize newSize1 = [self.textView1 sizeThatFits:CGSizeMake(fixedWidth1, CGFLOAT_MAX)]; 
CGSize newSize2 = [self.textView2 sizeThatFits:CGSizeMake(fixedWidth2, CGFLOAT_MAX)]; 
CGRect newFrame1 = self.textView1.frame; 
CGRect newFrame2 = self.textView2.frame; 
newFrame1.size = CGSizeMake(fmaxf(newSize1.width, fixedWidth1), MIN(newSize1.height, 8192)); 
newFrame2.size = CGSizeMake(fmaxf(newSize2.width, fixedWidth2), MIN(newSize2.height, 8192)); 
self.textView1.frame = newFrame1; 
self.textView2.frame = newFrame2; 

यह कोड सामग्री को विभाजित करता है लगभग निकटतम न्यूलाइन की तलाश में, बीच में स्ट्रिंग। यदि आप अपनी सामग्री को किसी भिन्न चरित्र पर विभाजित करना चाहते हैं, तो बस ऊपर दिए गए \n की सभी घटनाओं को आप जो भी विभाजित करना चाहते हैं उसे बदलें।

चरण 4 - अपने कंटेनर दृश्य ऊंचाई सेट करें:

सेट अपने कंटेनर दृश्य (scrollview, tableViewCell, और जो कुछ भी) अपने दो पाठ विचारों की ऊंचाई, के साथ साथ जो कुछ भी अतिरिक्त जगह के लिए आप ऊपर निर्धारित किया है और उनके नीचे।

CGRect viewFrame = self.myView.frame; 
viewFrame.size.height = MIN(self.textView1.frame.size.height, 8192) + MIN(self.textView2.frame.size.height, 8192) + kTextViewContainerPadding; 
[self.myView setFrame:viewFrame]; 

(मेरी कोड में, kTextViewContainerPadding एक मैक्रो मैं ऊपर और मेरे दो पाठ विचारों नीचे अंतरिक्ष की राशि पर सेट किया है उनके कंटेनर के भीतर है)।

यही है! सौभाग्य।

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