6

पृष्ठभूमि

तो, iOS 6 एक UITextView एक attributedString, जो सिंटेक्स हाइलाइटिंग के लिए उपयोगी हो सकता है ले जा सकते हैं।UITextView attributedText और वाक्य रचना हाइलाइटिंग

मैं -textView:shouldChangeTextInRange:replacementText: में कुछ रेगेक्स पैटर्न कर रहा हूं और कई बार मुझे पहले से टाइप किए गए शब्द का रंग बदलने की जरूरत है। मुझे जिम्मेदार पाठ को रीसेट करने से कोई अन्य विकल्प नहीं दिखता है, जिसमें समय लगता है।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    //A context will allow us to not call -attributedText on the textView, which is slow. 
    //Keep context up to date 
    [self.context replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:self.textView.typingAttributes]]; 

    // […] 

    self.textView.scrollEnabled = FALSE; 

    [self.context setAttributes:self.defaultStyle range:NSMakeRange(0, self.context.length)]; 
    [self refresh]; //Runs regex-patterns in the context 
  textView.attributedText = self.context; 

    self.textView.selectedRange = NSMakeRange(range.location + text.length, 0); 
    self.textView.scrollEnabled = TRUE; 

    return FALSE; 
} 

इस सिम्युलेटर पर okayish चलाता है, लेकिन एक iPad 3 पर प्रत्येक -setAttributedText मिलीसेकेंड के कुछ ही सैकड़ों लेता है।

मैंने एट्रिब्यूटेड टेक्स्ट को म्यूट करने में सक्षम होने के अनुरोध के साथ ऐप्पल को एक बग दायर किया। इसे डुप्लिकेट के रूप में चिह्नित किया गया है, इसलिए मैं नहीं देख सकता कि वे इसके बारे में क्या कह रहे हैं।

सवाल

अधिक विशिष्ट प्रश्न: मैं कैसे कुछ पर्वतमाला के रंग एक UITextView में, एक बड़े बहुरंगी पाठ के साथ, काफी अच्छा प्रदर्शन के साथ हर shouldReplaceText... में यह करने के लिए बदल सकते हैं?

अधिक व्यापक प्रश्न: आईओएस 6 में यूआईटीएक्स्टव्यू के साथ सिंटैक्स हाइलाइटिंग कैसे करते हैं?

+0

मैं भी अपने वेब वक्ता अनुप्रयोग में बोली जा रही पाठ हाइलाइट करने के लिए कोशिश कर रहा हूँ:

यहाँ एक आसान वर्ग है। मैंने सोचा कि मैं iOS6 के साथ आसानी से ऐसा करने में सक्षम हो जाएगा, लेकिन मैं एपीआई गतिशील निश्चित सीमा में स्ट्रिंग रंग बदलने के लिए नहीं मिल सका .. पूर्ण जिम्मेदार ठहराया पाठ हर बार बहुत ज्यादा समय लगता है की स्थापना। –

+0

मैंने ऐप्पल को एक बग रिपोर्ट भी दायर की। हमें इस विधि की तरह कुछ चाहिए। "TextView_.attributedText addAttribute: मूल्य: फ़ॉन्ट रेंज:" –

+0

हाँ, पर मुझे यकीन है कि हम attributedText की एक अस्थायी संस्करण कभी नहीं देखेंगे, क्योंकि TextView पता करने के लिए जब भी स्ट्रिंग बदल गया है की जरूरत है। withText:: मैं या तो एक होशियार सेटर, या की UITextInput के '-replaceRange एक जिम्मेदार ठहराया संस्करण के लिए आशा' –

उत्तर

0

विशेषता वाले टेक्स्ट एक्सेसर्स को HTML से/से राउंड-ट्रिप करना है, इसलिए यह सिंटैक्स-हाइलाइट किए गए टेक्स्ट व्यू कार्यान्वयन के लिए वास्तव में गैर-इष्टतम है। आईओएस 6 पर, आप शायद CoreText का उपयोग सीधे करना चाहते हैं।

+0

मुझे नहीं पता कि टेक्स्टव्यू के एचटीएमएल कैसे काम करता है, लेकिन आप गुणों को डीओएम में कुछ पाठ बदलने और टेक्स्टव्यू के पाठ को अपडेट करने के रूप में आसान बदल सकते हैं, है ना? –

1

मैं अपने आवेदन जैप-गिटार (नो-तार-संलग्न) जहाँ मैं उन टाइप करने के लिए/पेस्ट/अपने स्वयं के गाने और अनुप्रयोग पर प्रकाश डाला मान्यता प्राप्त chords संपादित की अनुमति देने के लिए एक ही समस्या का सामना करना पड़ा।

हां यह सच है सेब एक HTML लेखक और पार्सर का उपयोग जिम्मेदार पाठ प्रदर्शित करने के लिए करता है। दृश्य के पीछे एक अद्भुत स्पष्टीकरण यहां पाया जा सकता है: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

इस समस्या के लिए मुझे मिला एकमात्र समाधान जिम्मेदार पाठ का उपयोग नहीं करना है जो सिंटैक्स हाइलाइटिंग के लिए एक ओवरकिल है।

इसके बजाय मैं सादे पाठ के साथ अच्छे पुराने UITextView पर वापस लौटा और टेक्स्ट दृश्य में बटन जोड़ा जहां हाइलाइट की आवश्यकता थी। बटन फ्रेम गणना करने के लिए मैं इस सवाल का जवाब प्रयोग किया है: How to find position or get rect of any word in textview and place buttons over that?

30% तक यह कम CPU उपयोग (दे या लेने के लिए)।

@implementation UITextView (WithButtons) 
- (CGRect)frameForTextRange:(NSRange)range { 
    UITextPosition *beginning = self.beginningOfDocument; 
    UITextPosition *start = [self positionFromPosition:beginning offset:range.location]; 
    UITextPosition *end = [self positionFromPosition:start offset:range.length]; 
    UITextRange *textRange = [self textRangeFromPosition:start toPosition:end]; 
    CGRect rect = [self firstRectForRange:textRange]; 
    return [self convertRect:rect fromView:self.textInputView]; 
} 

@end