2012-11-15 49 views
6

मेरे पास UITextView है, और जब मैं बटन पर उपयोगकर्ता टैप करता हूं तो फ्रेम के बदलाव को एनिमेट करने का प्रयास कर रहा हूं। असल में पाठ दृश्य स्क्रीन फिट करने के लिए बड़ा हो जाता है ताकि यह अधिक टेक्स्ट प्रदर्शित कर सके, और फिर जब उपयोगकर्ता फिर से बटन को टैप करता है तो यह इसके मूल फ्रेम में बदल जाता है।UITextView फ्रेम के एनिमेटिंग परिवर्तन टेक्स्ट रीयलोकेशन को एनिमेट नहीं करता है

मैं ब्लॉकों का उपयोग कर एनीमेशन करते हैं, इस तरह:

if(!isDisplayingDetailView) 
{ 
    //Expand view 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.view.frame; 
        } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = YES; 
        }]; 
} 
else{ 
    //Shrink view. 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.detailFrame; 
         } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = NO; 
        }]; 
} 

कहाँ self.detailView UITextView है, और self.detailFrame सिर्फ एक CGRect मूल फ्रेम पकड़े है। isDisplayingDetailView यह देखने के लिए बस एक बूल है कि दृश्य का विस्तार किया गया है या नहीं। मेरी समस्या यह है कि पाठ का आकार एनिमेटिंग नहीं है। अनुप्रयोग डिफ़ॉल्ट दृश्य:: मैं मेरी समस्या को वर्णन करने के लिए एक परीक्षण app से कुछ स्क्रीनशॉट बनाया Default view

विस्तृत दृश्य:

: बटन दोहन के बाद

Expanded view

TextView बस एक पल

Shrinking view

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

+0

हाय, यू इस का हल मिला, यदि हाँ मेरे साथ साझा करें, मैं भी एक ही समस्या –

+0

@VinayakaKarjigi खेद में फंस कर रहा हूँ, लेकिन मैं कोई समाधान मिल गया। –

+0

एक ही समस्या थी। मेरी समाधान TextView रख दिया जहां TextView किया गया था, TextView छिपाने की एक छवि प्रस्तुत करने के लिए, और फिर छवि चेतन था। – peko

उत्तर

2

टेक्स्टव्यू में टेक्स्ट हमेशा अपेक्षित कार्य नहीं करता है। इसके लिए आपको एक एनएसटीमर स्थापित करना होगा और प्रत्येक टिक पर फ्रेम आकार सेट करना होगा।

की तरह कुछ कार्य करें:

textview.frame = CGRectMake (textview.frame.origin.x, textview.frame.origin.y, textview.frame.size.width-1, textview.frame.size.height-1); 

फिर जब यह मैं पूरी तरह से superview से TextView को हटा दें और शून्य पर सेट होगा, और फिर एक नया एक init किया है। इसका कारण यह है कि किसी कारण से टेक्स्टव्यू के फ्रेम को बदलते समय पाठ के बॉक्स के चारों ओर पैडिंग जोड़ा जाता है। आप इसे तब तक नहीं देख पाएंगे जब तक कि आप फ्रेम को कम से कम 100 बार बदल नहीं देते।

[textview removeFromSuperview]; 
textview = nil; 
textview = [[UITextView alloc] initWithFrame:CGRectMake(x, y, width, height)]; 
textview.text = yourTextString; 
//You will also have to set whatever non default properties you want, such as text or background color 
[view addSubview:textview]; 
+0

यह वास्तव में काम करता है हालांकि मुझे लगता है कि यह एक बहुत अच्छा समाधान नहीं है। मैं इसे स्वीकार्य के रूप में चिह्नित करूंगा। अपने कोड में, हम भी नए TextView के पाठ सेट करना होगा। –

+1

मैं मानता हूं कि यह एक अच्छा समाधान नहीं है, लेकिन मुझे यकीन नहीं है कि कोई अन्य विकल्प है या नहीं। दुर्भाग्यवश आपकी समस्या में दो यूकिट तत्व शामिल हैं जो अपेक्षा के अनुसार काम नहीं करते हैं। UIView एनिमेशन और टेक्स्टव्यू आकार बदलना। इसलिए आपको अपनी खुद की एनीमेशन एनएसटीमर का उपयोग करना है, और टेक्स्टव्यू का आकार बदलने के बजाय, आपको इसे वांछित आकार से पूरी तरह से रीमेक करना होगा। – Sean

1

एक और समाधान सीमा परिवर्तन को एनिमेट करना है।

कुछ तरीके हैं, लेकिन यहां UITextView का एक सरल उपवर्ग जो वास्तव में इस करता है।

import Foundation 
import UIKit 

import QuartzCore 

class SmoothTextView : UITextView { 

    override func actionForLayer(layer: CALayer!, forKey key: String!) -> CAAction! { 

     if key == "bounds" { 

      let x = super.actionForLayer(layer, forKey: "backgroundColor") 

      if let action:CAAnimation = x as? CAAnimation { 

       let transition = CATransition() 

       transition.type    = kCATransitionFade 
       transition.beginTime  = action.beginTime 
       transition.duration   = action.duration 
       transition.speed   = action.speed 
       transition.timeOffset  = action.timeOffset 
       transition.repeatCount  = action.repeatCount 
       transition.repeatDuration = action.repeatDuration 
       transition.autoreverses  = action.autoreverses 
       transition.fillMode   = action.fillMode 

       transition.timingFunction = action.timingFunction 
       transition.delegate = action.delegate 

       return transition 
      } 
     } 

     return super.actionForLayer(layer, forKey: key) 
    } 
} 

यह आईओएस के रूप में 8.

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

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero