2013-09-26 11 views
73

मैं आईओएस 6.1 से आईओएस 7 में से एक ऐप पोर्ट कर रहा हूं। मैं एक लेआउट का उपयोग कर रहा हूं जहां UITextView है जिसमें फिक्स चौड़ाई है, लेकिन इसकी ऊंचाई इसकी सामग्री पर आधारित है। आईओएस 6.1 के लिए materialize.height की जांच करना और इसे टेक्स्टव्यू की फ्रेम ऊंचाई के रूप में सेट करना पर्याप्त था, लेकिन यह आईओएस 7 पर काम नहीं करता है।आईओएस 7 UITextView materialize.height वैकल्पिक

फिर मैं एक निश्चित चौड़ाई के साथ UITextView कैसे बना सकता हूं, लेकिन गतिशील ऊंचाई पर आधारित वह पाठ जो दिखा रहा है?

नोट: मैं इन विचारों को कोड से बना रहा हूं, इंटरफ़ेस बिल्डर के साथ नहीं।

उत्तर

177

इस निम्न कोड के साथ, आप अपने UITextView एक निश्चित चौड़ाई के आधार पर की ऊंचाई बदल सकते हैं (यह iOS 7 और पिछले संस्करण पर काम कर रहा है): इस समारोह के साथ

- (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; 
} 

, आप एक NSAttributedString ले जाएगा और आवश्यक ऊंचाई को वापस करने के लिए एक निश्चित चौड़ाई।

आप एक विशिष्ट फ़ॉन्ट के साथ आप एक पाठ से फ्रेम गणना करना चाहते हैं, तो निम्न कोड का उपयोग करने की जरूरत है:

- (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size 
{ 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
    { 
     CGRect frame = [text boundingRectWithSize:size 
              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) 
             attributes:@{NSFontAttributeName:font} 
              context:nil]; 
     return frame.size; 
    } 
    else 
    { 
     return [text sizeWithFont:font constrainedToSize:size]; 
    } 
} 

आप जोड़ सकते हैं कि SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO अपनी परियोजना में अपने prefix.pch फ़ाइल पर के रूप में:

:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

तुम भी द्वारा पिछले परीक्षण SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) जगह ले सकता है

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])‌ 
+0

साथ tableView सेल मैं केवल यह कर सकते हैं 24 घंटे के बाद आपको यह दे दो। धैर्य रखें, यह तुम्हारा है :) –

+16

शायद आपको उन उत्तरों से लिंक करना चाहिए जिन्हें आपने उन्हें लिया था? http://stackoverflow.com/questions/18368567/uitableviewcell-with-uitextview-height-in-ios-7 – Anderscc

+0

@ जोर्डन मॉन्टेल, एक और प्रश्न के लिए, यदि मैंने चौड़ाई और ऊंचाई तय की है, तो मैं सबसे अच्छा फ़ॉन्ट आकार कैसे प्राप्त कर सकता हूं एक निर्दिष्ट स्ट्रिंग के लिए? मेरे पास आईओएस 7 पर समान समस्या है (आईओएस 6 पर, मैं यह कर सकता हूं) – Jacky

2

वहाँ, सरल समाधान कर रहे हैं इस पद्धति का उपयोग:

+(void)adjustTextViewHeightToContent:(UITextView *)textView; 
{ 
    if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f){ 
     textView.height = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height+2*fabs(textView.contentInset.top); 
    }else{ 
     textView.height = textView.contentSize.height; 
    } 
} 

युपीडी: बस पाठ प्रदर्शित करने के लिए काम कर रहे (isEditable = नहीं)

+0

ऐसा लगता है जैसे आपका समाधान काम नहीं करता है। जब टेक्स्टव्यू गोटो दूसरी पंक्ति 'usedRectForTextContainer' विधि समान ऊंचाई देता है। –

+0

ओह, हो सकता है, मैं इसे टेक्स्ट – HotJard

3

मेरे अंतिम समाधान HotJard के पर आधारित है, लेकिन दोनों शीर्ष शामिल और 2 * fabs (textView.contentInset) का उपयोग करने के बजाय टेक्स्ट कंटेनर के नीचे इन्सेट्स।शीर्ष):

- (CGFloat)textViewHeight:(UITextView *)textView 
{ 
    return ceilf([textView.layoutManager usedRectForTextContainer:textView.textContainer].size.height + 
       textView.textContainerInset.top + 
       textView.textContainerInset.bottom); 
} 
42

यह iOS6 के लिए मेरे लिए काम किया है और 7:

CGSize textViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)]; 
    self.myTextView.height = textViewSize.height; 
+0

टेक्स्ट प्रदर्शित करने के लिए उपयोग कर रहा हूं हाय, हाँ यह मेरे लिए मजाक कर रहा है ... मुझे "txtviewHeight.contentSize.height" के बजाय "txtviewHeight.frame.size.height" का उपयोग किया जाता है। – Mani

+0

ओह .. सुपर आसान! – BufferStack

+0

मुझे "UITextView" प्रकार की वस्तु पर संपत्ति की ऊंचाई क्यों नहीं मिल रही है? – Hexark

15

उपयोग इस छोटे से समारोह

-(CGSize) getContentSize:(UITextView*) myTextView{ 
    return [myTextView sizeThatFits:CGSizeMake(myTextView.frame.size.width, FLT_MAX)]; 
} 
+0

मेरे लिए आईओएस 6 और आईओएस 7 में काम करता है। धन्यवाद! –

20

iOS7 में, UITextViewNSLayoutManager का उपयोग करता है पाठ लेआउट करने के लिए:

// If YES, then the layout manager may perform glyph generation and layout for a given portion of the text, without having glyphs or layout for preceding portions. The default is NO. Turning this setting on will significantly alter which portions of the text will have glyph generation or layout performed when a given generation-causing method is invoked. It also gives significant performance benefits, especially for large documents. 
@property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout; 

अक्षम करेंcontentSize ठीक करने के लिए:

textView.layoutManager.allowsNonContiguousLayout = NO; 
+6

आपका उत्तर प्रश्न के अनुरूप नहीं है, लेकिन मेरी समस्या को फिट है। तो मैं वोट देता हूं :) –

+0

यह मेरे लिए सामग्री आकार को ठीक नहीं करता है। स्क्रॉलिंग अक्षम है। – Dvole

+0

कोड के इस टुकड़े ने मेरी समस्या हल की, लेकिन पीढ़ी के कारण विधि से आप टिप्पणी करते हैं? –

1
_textView.textContainerInset = UIEdgeInsetsZero; 
    _textView.textContainer.lineFragmentPadding = 0; 

बस lineFragmentPadding

0

सरल समाधान के लिए मत भूलना - textView.isScrollEnabled = false जब एक और पुस्तक दृश्य के अंदर सही काम करता है, या UITableViewAutomaticDimension