2012-12-15 17 views
5

के दौरान सब्सक्राइब सही ढंग से पोजिशन नहीं किया गया है मेरे पास एक साधारण एनीमेशन है जहां मैं पुराने के केंद्र से एक नया दृश्य विस्तार कर रहा हूं, जबकि वह एक फीका हो गया है। हालांकि, इस नए दृश्य (एक बटन और एक लेबल) के सबव्यूज़ स्क्रीन के निचले दाएं हाथ से "फ्लाई" करते हैं क्योंकि नया दृश्य पूरे स्क्रीन को ले जाता है। मैंने ऑटोलायआउट चालू किए बिना और बिना प्रयास किए हैं, और जबकि दोनों परिदृश्य अलग-अलग परिणाम देते हैं, वे दोनों गलत हैं।एनीमेशन

सेट अप सरल है, मैं एक स्टोरीबोर्ड में दो असंबद्ध दृश्य नियंत्रक है, और दृश्य परिवर्तन चेतन के लिए निम्न कोड का उपयोग करें:

-(void)switchViews2:(id)sender { 
    UIWindow *win = self.view.window; 
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"]; 
    yellow.view.frame = CGRectMake(0, 0, 1, 1); 
    yellow.view.center = self.view.center; 
    [win addSubview:yellow.view]; 
    CGRect frame = self.view.frame; 
    [UIView animateWithDuration:5 animations:^{ 
     yellow.view.frame = frame; 
     self.view.alpha = 0; 
    } 
      completion:^(BOOL finished) { 
       [self.view removeFromSuperview]; 
       win.rootViewController = yellow; 
     }]; 
} 

सवाल है, क्यों subviews नहीं रहते जहां वे अपने पर्यवेक्षण के अंदर एनिमेटेड के रूप में माना जाता है।

उत्तर

3

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

अपने अंतिम फ्रेम के साथ अपना सबव्यूव जोड़ें, इसके परिवर्तन को एक स्केलिंग एफ़िन ट्रांसफॉर्म के रूप में सेट करें, कहें, 0.1, फिर इसे पहचान ट्रांसफॉर्म पर एनिमेट करें। यह सही स्थिति में सभी सबव्यू के साथ केंद्र बिंदु से बाहर निकल जाएगा।

+0

धन्यवाद, मुझे ट्रांसफॉर्म के साथ ज्यादा अनुभव नहीं है, इसलिए मैं चीजों को करने के तरीके के बारे में भूल जाता हूं। मुझे लगता है मुझे पढ़ना चाहिए। – rdelmar

1

समस्या लेआउट बाधाओं के साथ थी। यदि इसके बजाय एनीमेशन ब्लॉक में दृश्य फ्रेम की स्थापना की, मैं खिड़की और नए दृश्य के बीच बाधाओं जोड़ें, फिर एनीमेशन ब्लॉक में layoutIfNeeded फोन इसे सही ढंग से काम करता है:

-(void)switchViews2:(id)sender { 
    UIWindow *win = self.view.window; 
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"]; 
    [yellow.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    yellow.view.frame = CGRectMake(0, 0, 1, 1); 
    yellow.view.center = self.view.center; 
    [win addSubview:yellow.view]; 

    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeLeading relatedBy:0 toItem:win attribute:NSLayoutAttributeLeading multiplier:1 constant:0]; 
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:win attribute:NSLayoutAttributeTop multiplier:1 constant:20]; 
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:win attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]; 
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeBottom relatedBy:0 toItem:win attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; 

    [win addConstraints:@[con1,con2,con3,con4]]; 

    [UIView animateWithDuration:1 animations:^{ 
     [win layoutIfNeeded]; 
     self.view.alpha = 0; 
    } 
      completion:^(BOOL finished) { 
       [self.view removeFromSuperview]; 
       win.rootViewController = yellow; 
     }]; 
} 
+0

ध्यान दें कि यदि आप पूर्ण फॉर्म का उपयोग कर रहे हैं, तो 'एनिमेट विथ अवधि: देरी: विकल्प: एनिमेशन: समापन:', आप 'UIViewAnimationOptionLayoutSubviews' को पारित कर सकते हैं और यह आपके लिए 'layoutIfNeeded' करेगा। –

+0

@robmayoff, वास्तव में इस स्थिति में काम नहीं किया। अगर मैं उस विकल्प को शामिल करता हूं तो मुझे कोई एनीमेशन नहीं मिलता है - यह अंतिम स्थिति में कूद जाता है। – rdelmar