2012-12-14 40 views
9

लेआउट बाधाओं के साथ [UIView transitionFromView:toView:...] का उपयोग करने का सही तरीका क्या है?UIView संक्रमण FromView: toView: और लेआउट बाधाएं

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

उत्तर

20

मैं UIViewAnimationOptionShowHideTransitionViews विकल्प का उपयोग करता हूं, जो संक्रमण से पहले दृश्य दृश्य पदानुक्रम में देखने के लिए और दृश्य दोनों को अनुमति देता है, लेकिन एक दिखाता है और दूसरे को छुपाता है।

छिपाने के लिए देखने के लिए सेट करें, इसे पर्यवेक्षण में जोड़ें, और संक्रमण से पहले बाधाओं को स्थापित करें। फिर आप समापन ब्लॉक में पुराने दृश्य को हटा सकते हैं। कुछ इस तरह:

[toView setHidden: YES]; 
[containerView addSubview: toView]; 
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"|[toView]|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(containerView, toView)]]; 
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|[toView]|" options: 0 metrics: nil views: NSDictionaryOfVariableBindings(containerView, toView)]]; 

[UIView transitionFromView: fromView toView: toView duration: 1.0 options: UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionShowHideTransitionViews completion:^(BOOL finished) { 
    [fromView removeFromSuperview]; 
}]; 
+0

।। जो दिखाई देता है, उससे दृश्य को स्वचालित रूप से पर्यवेक्षण से हटा दिया जाता है, भले ही शो/छुपाएं विकल्प दिखाया गया हो। – Andy

+1

कॉल के बाद दृश्य पदानुक्रम को देखते हुए, व्यूव्यू को पर्यवेक्षण से कम से कम नहीं हटाया जाता है (कम से कम आईओएस 6 और आईओएस 7 पर) – honus

+0

ऐसा लगता है कि ऑटोलाउट बाधा के साथ फ्लिप एनीमेशन का उपयोग करने के लिए, हमें 'UIViewAnimationOptionShowHideTransitionViews' सेट करना होगा –

0

संक्रमण कॉल के बाद की कमी को जोड़ने (लेकिन रन पाश से पहले की प्रगति) काम करता है: अमान्य :-(था कि मेरी पूर्व परीक्षण क्षमा शोर के लिए

NSArray *priorConstraints = _constraints; 
    [UIView transitionFromView:priorView 
         toView:newView 
         ... 
        completion:^(BOOL finished) { 
         [_containerView removeConstraints:priorConstraints]; 
         .... 
        }]; 
    _constraints = [self constrainSubview:newView toBeCongruentWithSuperview:_containerView]; 


- (NSArray/*[NSLayoutConstraint]*/ *)constrainSubview:(UIView *)subview 
          toBeCongruentWithSuperview:(UIView *)superview { 
    subview.translatesAutoresizingMaskIntoConstraints = NO; 
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subview); 

    NSArray *constraints = [NSLayoutConstraint 
          constraintsWithVisualFormat:@"H:-(0)-[subview]-(0)-" 
          options:0 
          metrics:nil 
          views:viewsDictionary]; 
    constraints = [constraints arrayByAddingObjectsFromArray: 
        [NSLayoutConstraint 
        constraintsWithVisualFormat:@"V:-(0)-[subview]-(0)-" 
        options:0 
        metrics:nil 
        views:viewsDictionary]]; 
    [superview addConstraints:constraints]; 
    return constraints; 
} 
संबंधित मुद्दे