2011-07-11 16 views
6

this उदाहरण में एनिमेट नहीं करता है।एक UIView फ्रेम को एनिमेट करना, UIScrollView सबव्यूव हमेशा

जब मैं टैबबंट्रोलर (पूर्णस्क्रीन प्रभाव के लिए) को एनिमेट करता हूं तो मैं PhotoViewerViewController के फ्रेम को एनिमेट कर रहा हूं। फोटोव्यूयर ऐप्पल के फोटो ऐप के समान प्रभाव उत्पन्न करने के लिए एक यूस्क्रोलव्यू का उपयोग करता है। किसी भी कारण से कभी-कभी यह मेरे फोटो व्यूअर फ्रेम के साथ एनिमेट करता है, और कभी-कभी ऐसा नहीं होता है।

फ्रेम आकार को बढ़ाने के दौरान आप पहले उदाहरण में देख सकते हैं, लेकिन फ्रेम आकार को कम करने और टैब बार को पुनर्स्थापित करते समय अच्छी तरह से एनिमेट करता है)।

हालांकि this उदाहरण में जब फोटो लंबवत है तो यह दोनों दिशाओं में कूदता है।

दोनों मामलों में यदि मैं स्क्रॉलव्यू के साथ फोटो पर ज़ूम इन करता हूं, तो यह दोनों दिशाओं में सही ढंग से एनिमेट करता है।

मुझे पता है कि सबूत हैं, लेकिन मैं यहां क्या हो रहा है पर अपनी अंगुली नहीं डाल सकता।

void (^updateProperties) (void) =^{ 
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; 
    if (self.tabBarController) { 

     int height = self.tabBarController.tabBar.bounds.size.height; 
     for(UIView *view in self.tabBarController.view.subviews) 
     { 
      int newHeight; 
      UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
      if (UIInterfaceOrientationIsPortrait(orientation)) { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height; 
      } else { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height; 
      } 


      if([view isKindOfClass:[UITabBar class]]) 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)]; 
      } 
      else 
      { 
       CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight); 
       [view setFrame:newFrame]; 

       // update our VC frame with animation 
       [self.view setFrame:newFrame]; 

      } 

     } 
    } 

}; 

कोड एसओ पर एक पोस्ट से अनुकूलित: UITabBar wont hide

github पर पूर्ण स्रोत

यहाँ मेरी एनीमेशन ब्लॉक है।

उत्तर

6

याद कर रहा हूँ सामान्य में, चलो टी, ऐसा इसलिए है क्योंकि बाद के मामले में देरी से प्रदर्शन करने से उन्हें संबंधित संपत्ति को अपने अंतिम मूल्य पर सेट करके प्रभावी रूप से रद्द कर दिया जा सकता है।

UIScrollView के विशेष मामले में यह अक्सर होता है कि -layoutSubviews आपके एनीमेशन ब्लॉक बंद होने के बाद एनीमेशन एक रन लूप के बिना बुलाया जाता है। इस कारण से मैं आमतौर पर उस विधि में कोई लेआउट करने से बचने की कोशिश करता हूं जहां मेरे पास दृश्य पदानुक्रम में है (क्योंकि विशेष रूप से आईओएस 5, UIScrollView से पहले लेआउट की आवश्यकता के लिए खुद को स्थापित करने में वास्तव में ट्रिगर-खुश है)।

मैं आपकी कॉल को -[EGOPhotoImageView layoutScrollViewAnimated:] पर -layoutSubviews से हटाने की सलाह दूंगा और इसे इसके बजाय -setFrame: पर एक ओवरराइड में जोड़ दूंगा।

यदि आप आईओएस 4 और ऊपर लक्षित कर सकते हैं, तो UIViewAnimationOptionLayoutSubviews पर भी एक नज़र डालें। एक विकल्प के रूप में इस के साथ ब्लॉक-आधारित एनीमेशन का उपयोग करना किसी और चीज को बदले बिना काम कर सकता है।

+0

धन्यवाद। उत्तरार्द्ध काम नहीं करता था, लेकिन मैं पूर्व के साथ जाने दूंगा। –

+0

जबकि मैंने इसे अभी तक हल नहीं किया है, मुझे लगता है कि आपने मुझे सही दिशा में इंगित किया है। मुझे यकीन नहीं है कि क्या यह विशेष परिवर्तन PhotoImageView पर ही ट्रिगर किया जा रहा है, या उस स्क्रॉल में शामिल है। –

+0

व्यक्तिगत रूप से मैं स्क्रॉलव्यू की सामग्री को स्क्रॉलव्यू उप-वर्ग में केंद्रित करने के लिए सभी तर्कों को स्थानांतरित कर दूंगा। वहां, आप ज़ूम प्रतिनिधि विधियों का उपयोग करने के बजाय लेआउट निष्पादित करने के लिए -सेट सामग्रीऑफसेट ओवरराइड कर सकते हैं। – hatfinch

0

मैंने आईपैड 4.2 और 4.3 सिमुलेटर पर आपके जीथ्यूब कोड की कोशिश की और यह ठीक काम करता है ... कोई भी छवि आकार बदलने का कोई काम नहीं! कुछ संस्करण मुद्दे हो सकते हैं। इसके अलावा, मैं बदल रहा है आपके एनिमेशन ब्लॉक की कोशिश की और निम्नलिखित एक ही उद्देश्य में कार्य करता:

void (^updateProperties) (void) =^{ 
      self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
      self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; } 

मुझे अगर एनिमेशन कभी कभी काम करते हैं और कभी कभी डॉन 'पता है कि मैं कुछ :)

+0

वीडियो में जो प्रदर्शन कर रहा था उसका परीक्षण करने के लिए, आपको इसे एक टैबबार नियंत्रक में जोड़ना होगा, और जब आप इसे बनाते हैं तो मैं फ़्लिकर से छवियों के अच्छे वर्गीकरण की अनुशंसा करता हूं। यदि आपको आवश्यकता हो तो मैं एक नमूना एक साथ रख सकता हूं। –

+0

यकीन है कि ... मदद करेगा। – tipycalFlow

संबंधित मुद्दे