8

मुझे UITextView बनाने में दिलचस्पी है जो पाठ टाइप करते समय गतिशील रूप से विस्तार कर रहा है, और स्केलिंग उपयोगकर्ता स्क्रीन को पिन करता है (इसी तरह का व्यवहार TinyPost में पाया जा सकता है)।आईओएस: पिनिंग के साथ UITextView स्केलिंग?

जब आप टेक्स्ट व्यू को ठीक से टाइप करते हैं (बिना पिनिंग के)। जब आप चुटकी (टाइपिंग के बिना) ठीक काम करते हैं, लेकिन जब आप चुटकी करते हैं और फिर टाइप करते हैं, तो अंदर का पाठ कट जाता है।

UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleTextView:)]; 
     pinchGestRecognizer.delegate = self; 
     [bgFrameImageView addGestureRecognizer:pinchGestRecognizer]; 

    - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ 
     createTextView.transform = CGAffineTransformScale(createTextView.transform, pinchGestRecognizer.scale, pinchGestRecognizer.scale); 

     pinchGestRecognizer.scale = 1;   
    } 

    - (void)textViewDidChange:(UITextView *)textView{ 

     CGSize textSize = textView.contentSize; 

     textView.frame = CGRectMake(CGRectGetMinX(textView.frame), CGRectGetMinY(textView.frame), textSize.width, textSize.height); //update the size of the textView 
    } 

आपको क्या लगता है:

यहाँ मेरी कोड है?

+2

आप क्यों नहीं बस लपेट नहीं है में एक 'UIScrollView' और 'viewForZoomingInScrollView:' विधि से टेक्स्ट दृश्य वापस कर दें? –

उत्तर

11

प्रयास करें:

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ 
    CGFloat scale = pinchGestRecognizer.scale; 

    createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale]; 

    [self textViewDidChange:createTextView];  
} 

यह मूल रूप से फ़ॉन्ट आकार मापता है और फिर textViewDidChange में अपने कोड का उपयोग सामग्री आकार पुनर्गणना।

+0

मैं अनुशंसा करता हूं कि आप बताएं कि प्रत्येक पंक्ति – Sirens

+0

@The डेवलपर किया गया है, – k20

+0

हाय @ के 20 के लिए खेद है, मुझे एक ही समस्या है और मैं टेक्स्ट का उपयोग करता हूं, क्या आप मुझे कुछ समाधान दे सकते हैं ... धन्यवाद .. – ilesh

0

UITextView UIScrollView का एक उपवर्ग है और इस तरह के रूप में आप क्या आप किसी भी पुस्तक को देखने के साथ कर ज़ूमिंग सक्षम करने के लिए क्या करने की जरूरत: के माध्यम से

  • सेट न्यूनतम और अधिकतम जूम पैमाने गुण
  • viewForZooming सेट स्क्रॉलव्यू प्रतिनिधि विधि

... जो पूरे टेक्स्ट दृश्य को ज़ूम करता है।

आप उसके बाद ही पाठ ज़ूम करने के लिए चाहते हैं तो आप एक चुटकी इशारा पहचानकर्ता के माध्यम से इन चरणों को पूरा करने के लिए है:

  • वर्तमान जिम्मेदार ठहराया स्ट्रिंग को पुनः प्राप्त
  • फ़ॉन्ट पर्वतमाला के माध्यम से चलने और साथ फॉन्ट विशेषता की जगह एक एक
  • बढ़ाया अपने संशोधित संस्करण के साथ पाठ दृश्य में पाठ बदलने
  • शायद आप भी पाठ सेट करने के बाद पाठ चयन निर्धारित करने की आवश्यकता
+1

कोई भी मौका आप फ़ॉन्ट के माध्यम से चलने के लिए नमूना कोड प्रदान कर सकते हैं uitextview की विशेषता स्ट्रिंग में टेक्स्ट आकार और टेक्स्ट आकार बढ़ाना। मैं बस ऐसा करने की कोशिश कर रहा हूं। –

+0

मेरे पास यह आसान एटीएम नहीं है, अनिवार्य रूप से आपको केवल जिम्मेदार स्ट्रिंग पर फ़ॉन्ट विशेषता का आकलन करना होगा और फिर उसे स्केल किए गए एक से बदलना होगा। – Cocoanetics

0

सर्वश्रेष्ठ नहीं है लेकिन आसान समाधान होगा:

मैं बिल्कुल आपके उपयोग के मामले पता नहीं है, लेकिन मुझे लगता है कि जबकि पाठ लिखने एक एप्लिकेशन चुटकी ज़ूम में समर्थन करने के लिए कई मामलों में कोई मतलब नहीं है। मैं सिर्फ एक ध्वज सेट करता हूं, जो उपयोगकर्ता टाइपिंग करते समय चुटकी ज़ूम को रोकता है।

यदि आपका टेक्स्ट टाइपिंग का मतलब है, तो टेक्स्ट व्यू संपादित करना आप चुटकी इशारा की शुरुआत में संपादन को समाप्त कर सकते हैं और चुटकी इशारा खत्म होने के बाद संपादन शुरू कर सकते हैं।

2

उपरोक्त @ कोकोनेटिक्स उत्तर पर विस्तृत करने के लिए। मैंने आईओएस 7 पर जिम्मेदार तारों के लिए इशारा हैंडलिंग विचार लागू किया है, लेकिन जब आपकी स्ट्रिंग में बहुत अधिक फ़ॉन्ट परिवर्तन होते हैं तो यह निषिद्ध रूप से धीमा होता है। आईओएस 7 में एक हास्यास्पद बफरिंग बग भी है जहां पिनिंग बंद करने के बाद बदलें अधिसूचनाएं फायरिंग जारी रखती हैं - मुझे पीसी-डॉस के शुरुआती संस्करणों में बेवकूफ कीबोर्ड बफर की याद दिलाती है। वैसे भी, मैंने नीचे दिया गया कोड रखा है जो यह मेरे लिए काम कर रहा है - हालांकि यह केवल मुझे सूचित करने के परिणामस्वरूप है कि यह समय बर्बाद है और मुझे अपने उपयोगकर्ताओं को अपने फ़ॉन्ट्स को स्केल करने का कोई और तरीका देना है।

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestureRecognizer 
{ 
    CGFloat scale = 0; 
    NSMutableAttributedString *string; 

    switch (pinchGestureRecognizer.state) { 
     case UIGestureRecognizerStateBegan: 
      self.old_scale = 1.0; 
      self.last_time = [NSDate date]; 
      break; 

     case UIGestureRecognizerStateChanged: 
      scale = pinchGestureRecognizer.scale - self.old_scale; 

      if([self.last_time timeIntervalSinceNow] < -0.2) {  // updating 5 times a second is best I can do - faster than this and we get buffered changes going on for ages! 
       self.last_time = [NSDate date]; 
       string = [self getScaledStringFrom:[self.textview.attributedText mutableCopy] withScale:1.0 + scale]; 
       if(string) { 
        self.textview.attributedText = string; 
        self.old_scale = pinchGestureRecognizer.scale; 
       } 
      } 
      break; 

     case UIGestureRecognizerStateEnded: 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateFailed: 
      break; 

     default: 
      break; 
    } 
} 

- (NSMutableAttributedString*) getScaledStringFrom:(NSMutableAttributedString*)string withScale:(CGFloat)scale 
{ 
    [string beginEditing]; 
    [string enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, string.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { 
     if (value) { 
      UIFont *oldFont = (UIFont *)value; 
      UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * scale]; 
      [string removeAttribute:NSFontAttributeName range:range]; 
      [string addAttribute:NSFontAttributeName value:newFont range:range]; 
     } 
    }]; 
    [string endEditing]; 
    return string; 
} 
+0

हाय amergin। इस कोड पर कोई सुधार या आपने वास्तव में इसे छोड़ दिया है? आपके जवाब के लिए धन्यवाद। – Winston

+0

@ विंस्टन - हाँ, फ़ॉन्ट स्केलिंग पर छोड़ दिया गया है और उपयोगकर्ता को अभी चुनने के लिए प्रीसेट आकार की पेशकश कर रहा है। बिट लंगड़ा लेकिन मैं ढांचे की सीमाओं के भीतर काम कर रहा हूं। अंतर्निहित कोड में सुधार हुआ है या नहीं, यह देखने के लिए भविष्य में फिर से कोशिश कर सकते हैं। – amergin

+0

मेरे मामले में यह वास्तव में अच्छी तरह से काम कर रहा है, क्योंकि मेरे पास जितने फोंट हैं उतने फ़ॉन्ट नहीं हैं। मेरी एकमात्र समस्या अब पिंचिंग इशारा को रोकने के लिए अधिकतम और न्यूनतम फ़ॉन्ट आकार को सीमित कर रही है ताकि पाठ बहुत बड़ा या बहुत छोटा न हो, और कभी-कभी गायब हो जाए। कोई सुझाव? धन्यवाद। – Winston

2

सबसे पहले viewDidLoad विधि में pinchGestureRecognize जोड़ें:

UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)]; 
    [self.myTextField addGestureRecognizer:pinchOnTextfield]; 

फिर अपने ViewController में इस विधि डाल फ़ॉन्ट पाठ फ़ील्ड पैमाने पर करने के:

- (void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognizer *)pinchGestRecognizer{ 


     if (pinchGestRecognizer.state == UIGestureRecognizerStateEnded 
      || pinchGestRecognizer.state == UIGestureRecognizerStateChanged) { 

      CGFloat currentFontSize = self.myTextField.font.pointSize; 
      CGFloat newScale = currentFontSize * pinchGestRecognizer.scale; 


      if (newScale < 20.0) { 
       newScale = 20.0; 
      } 
      if (newScale > 60.0) { 
       newScale = 60.0; 
      } 

      self.myTextField.font = [UIFont fontWithName:self.myTextField.font.fontName size:newScale]; 
      pinchGestRecognizer.scale = 1; 

     } 

    } 
+0

जब ज़ूम इन और आउट uitextview पर लागू होता है, उस समय मूल टेक्स्टव्यू स्वरूपण को chnage नहीं करना चाहिए। लेकिन यह छोटे टेक्स्ट –

+0

के साथ कन्नड़ और बोल्ड और इटालिक टेक्स्ट कन्वर्ट करेगा, मेरे मामले में, यह चयनित उत्तर से बेहतर समाधान है :) धन्यवाद! – Panayot