2012-12-14 22 views
9

Cách chính xác để sử dụng [UIView transitionFromView:toView:...] có ràng buộc bố cục là gì?Chuyển đổi UIViewTừ chế độ xem: sangView: và các ràng buộc bố cục

Tôi muốn cài đặt các ràng buộc trong chế độ xemView bị hạn chế. Tôi không thể làm điều đó trước khi chuyển đổi cuộc gọi như toView chưa có một giám sát. (Tương tự cho sau khi cuộc gọi nhưng trước khi vòng lặp chạy tiến triển.) Chờ cho đến khi khối hoàn thành để cài đặt nó có nghĩa là xem sẽ có hoạt hình mà không có ràng buộc.

Trả lời

20

Tôi muốn sử dụng tùy chọn UIViewAnimationOptionShowHideTransitionViews, cho phép cả toView và fromView ở trong phân cấp khung nhìn trước khi chuyển đổi, nhưng hiển thị một và ẩn khác.

Đặt thànhView để ẩn, thêm nó vào superview và cài đặt các ràng buộc trước khi chuyển đổi. Sau đó, bạn có thể xóa chế độ xem cũ trong khối hoàn thành. Một cái gì đó như thế này:

[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

.. Từ những gì tôi thấy, fromView bị xóa khỏi superview tự động ngay cả khi hiển thị/ẩn tùy chọn được sử dụng – Andy

+1

Nhìn vào hệ thống phân cấp khung nhìn sau cuộc gọi, fromView là defiantly không bị loại bỏ khỏi superview (ít nhất là trên iOS 6 và iOS 7) – honus

+0

để sử dụng hoạt ảnh lật với ràng buộc AutoLayout, chúng tôi phải đặt 'UIViewAnimationOptionShowHideTransitionViews' –

0

Thêm những hạn chế sau khi cuộc gọi chuyển tiếp (nhưng trước khi vòng lặp chạy tiến) hoạt động: kiểm tra trước của tôi đó là không hợp lệ :-(Xin lỗi vì tiếng ồn

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; 
} 
Các vấn đề liên quan