2011-05-20 16 views
16

स्क्रॉल करने योग्य, गैर-संपादन योग्य UITextView में कौन सा टेक्स्ट दिखाना है?आईओएस - UITextView में पाठ की दृश्य सीमा क्या है?

उदाहरण के लिए मैं अगले पैराग्राफ को दिखाने के लिए आवश्यकता हो सकती है, तो मैं वर्तमान दिखाई दे रहे पाठ श्रृंखला मिल और पाठ दृश्य

उत्तर

4

जिस तरह से मैं यह करता हूं वह प्रत्येक पैराग्राफ के सभी आकारों की गणना करना है। SizeWithFont के साथ: बाध्य करने के लिए: लाइनब्रैक मोड:

तब आप [textView सामग्री ऑफ़सेट] से कौन सा पैराग्राफ दिखाई दे सकते हैं, यह काम करने में सक्षम होंगे।

स्क्रॉल करने के लिए, scrollRangeToVisible का उपयोग न करें, केवल setContentOffset का उपयोग करें: इसके लिए CGPoint y पैरामीटर या तो अगले पैराग्राफ में सभी ऊंचाई आकारों का योग होना चाहिए, या केवल textView.frame.size.height जोड़ें, अगर वह अगले अनुच्छेद की शुरुआत से करीब है।

यह समझ में आता है?

जवाब में टिप्पणी करने के लिए requst कोड bellow (untested):

CGFloat paragraphOffset[MAX_PARAGRAPHS]; 

    CGSize constraint = CGSizeMake(widthOfTextView, 999999 /*arbitrarily large number*/); 
    NSInteger paragraphNo = 0; 
    CGFloat offset = 0; 

    for (NSString* paragraph in paragraphs) { 
     paragraphOffset[paragraphNo++] = offset; 
     CGSize paragraphSize = [paragraph sizeWithFont:textView.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
     offset += paragraphSize.height; 
    } 

    // find visible paragraph 
    NSInteger visibleParagraph = 0; 
    while (paragraphOffset[visibleParagraph++] < textView.contentOffset.y); 


    // scroll to paragraph 6 
    [textView setContentOffset:CGPointMake(0, paragraphOffset[6]) animated:YES]; 
+0

क्या आप कुछ उदाहरण कोड दे सकते हैं? मुझे यकीन नहीं है कि आकार किस प्रकार से है: बाध्यकारी: लाइनब्रैक मोड: काम करता है, बाध्य करने के लिए क्या है: आकार? –

+0

ऊपर जोड़ा गया कोड। एफवाईआई पैराग्राफ पैराग्राफ स्ट्रिंग्स का एक एनएसएआरएआर है –

+2

ध्यान दें कि आप 99 99 999 को FLT_MAX (एक बड़े मूल्य के लिए डिफ़ॉल्ट आईफ़ोन वैरिएबल) – Niko

1

एक विकल्प आपके पास करने के लिए है स्क्रॉल करने के लिए इसका इस्तेमाल करते हैं उचित सीमा की गणना और scrollRangeToVisible: उपयोग करने के लिए करना चाहते हैं UITextView के बजाय UIWebView का उपयोग करें। फिर आप टेक्स्ट में उचित स्थानों पर स्क्रॉल करने के लिए एंकर और जावास्क्रिप्ट का उपयोग कर सकते हैं। आप इसे आसान बनाने के लिए प्रत्येक अनुच्छेद की शुरुआत में प्रोग्रामर रूप से एंकरों को प्रोग्राम कर सकते हैं।

+0

मैं जावास्क्रिप्ट और जटिल HTML सामान से परिचित नहीं हूं, क्या आप मुझे कुछ उदाहरण दे सकते हैं? UIWebView UITextView –

+0

@ xlc0212 से निपटने के लिए कठिन हो सकता है: यदि आपको UIWebview का उपयोग करके संपादन की आवश्यकता नहीं है, तो प्रत्येक बार जब आपको स्क्रॉल करने की आवश्यकता होती है तो UITextView के टेक्स्ट आकार की गणना करने से अधिक आसान (और संभवतः तेज़) होगा। बस 'एचटीएमएल एंकर' क्या हैं - यह जटिल नहीं है। – roop

7

मैं एक और समाधान यहां ढूंढें। यह मेरी आंखों में इस समस्या को हल करने का एक बेहतर तरीका है। https://stackoverflow.com/a/9283311/889892

चूंकि UITextView UIScrollView का उप-वर्ग है, इसकी सीमाएं संपत्ति इसकी समन्वय प्रणाली के दृश्य भाग को दर्शाती है। तो इस तरह कुछ काम करना चाहिए:

-(NSRange)visibleRangeOfTextView:(UITextView *)textView { 
    CGRect bounds = textView.bounds; 
    UITextPosition *start = [textView characterRangeAtPoint:bounds.origin].start; 
    UITextPosition *end = [textView characterRangeAtPoint:CGPointMake(CGRectGetMaxX(bounds), CGRectGetMaxY(bounds))].end; 
    return NSMakeRange([textView offsetFromPosition:textView.beginningOfDocument toPosition:start], 
     [textView offsetFromPosition:start toPosition:end]); 
} 

यह ऊपर-से-नीचे, बाएं से दाएं पाठ लेआउट मानता है। यदि आप इसे अन्य लेआउट दिशाओं के लिए काम करना चाहते हैं, तो आपको कड़ी मेहनत करनी होगी। :)

+0

द्वारा प्रतिस्थापित कर सकते हैं जब आप कहते हैं, "ऐसा कुछ काम करना चाहिए", क्या आपने वास्तव में इसे आजमाया है? यह मेरे लिए वास्तविक दृश्य पाठ की लगभग तीन गुना वापसी कर रहा है। धन्यवाद। –

2

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

public extension UITextView { 

    public var visibleRange: NSRange? { 
     if let start = closestPositionToPoint(contentOffset) { 
      if let end = characterRangeAtPoint(CGPointMake(contentOffset.x + CGRectGetMaxX(bounds), contentOffset.y + CGRectGetMaxY(bounds)))?.end { 
       return NSMakeRange(offsetFromPosition(beginningOfDocument, toPosition: start), offsetFromPosition(start, toPosition: end)) 
      } 
     } 
     return nil 
    } 
} 
0

स्विफ्ट 3.0/3.1 समाधान पर जवाब "मौत की नूडल" आधारित है।

public extension UITextView { 

    public var visibleRange: NSRange? { 
     if let start = closestPosition(to: contentOffset) { 
      if let end = characterRange(at: CGPoint(x: contentOffset.x + bounds.maxX, y: contentOffset.y + bounds.maxY))?.end { 
       return NSMakeRange(offset(from: beginningOfDocument, to: start), offset(from: start, to: end)) 
      } 
     } 
     return nil 
    } 
}