2013-09-21 39 views
16

Mục tiêu của tôi là cung cấp quá trình chuyển đổi thu phóng từ người dùng từ chế độ xem tương tự như biểu tượng bàn đạp phóng to khi khởi chạy ứng dụng.Thanh điều hướng được điều chỉnh sau khi gọi completeTransition: trong chuyển đổi tùy chỉnh

Trình điều khiển chế độ xem được trình bày phóng to chính xác, nhưng thanh điều hướng có vị trí sai trong thanh trạng thái. Vị trí này được sửa sau khi gọi [transitionContext completeTransition: finished] ;. Làm thế nào tôi có thể làm cho nó chính xác từ đầu của quá trình chuyển đổi?

Đây là một ghi âm màn hình của lỗi: http://youtu.be/7LKU4lzb-uw (các trục trặc là trong lần thứ hai 6 của bản ghi)

Mã UIViewControllerAnimatedTransitioning:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIView *container = [transitionContext containerView]; 

    CGPoint viewCenter = self.view.center; 
    CGSize viewSize = self.view.frame.size; 
    CGSize controllerSize = toViewController.view.frame.size; 

    CGFloat controllerFromX = viewCenter.x - (controllerSize.width/2); 
    CGFloat controllerFromY = viewCenter.y - (controllerSize.height/2); 

    CGAffineTransform transform = CGAffineTransformMakeTranslation(controllerFromX, controllerFromY); 
    transform = CGAffineTransformScale(transform, viewSize.width/controllerSize.width, viewSize.height/controllerSize.height); 

    if (self.reverse) { 
     [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
    } else { 
     toViewController.view.transform = transform; 
     [container addSubview:toViewController.view]; 
    } 

    [UIView animateKeyframesWithDuration:ZoomTransitioningDuration 
            delay:0 
           options:0 
           animations:^{ 
       if (self.reverse) { 
        fromViewController.view.alpha = 0.0f; 
        fromViewController.view.transform = transform; 
       } else { 
        toViewController.view.transform = CGAffineTransformIdentity; 
       } 
     } 
           completion:^(BOOL finished) { 
       [transitionContext completeTransition:finished]; 
     }]; 
} 
+0

Bạn không thể điều chỉnh nguồn gốc của chế độ xem tương ứng? –

+0

Khi tôi làm điều đó, khu vực bên dưới thanh trạng thái là màu đen, không phải màu xanh lá cây (toàn bộ bộ điều khiển được dịch chuyển xuống dưới). –

+0

Tự chụp ảnh ở đâu? Bộ điều khiển hiển thị có phải là bộ điều khiển hoạt ảnh không? – bilobatum

Trả lời

25

Vấn đề là bạn đang thiết biến đổi trước chèn xem quan điểm điều khiển của đích vào container.

Switching thứ tự nên sửa chữa nó:

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    [container addSubview:toViewController.view]; 
    toViewController.view.transform = transform; 
} 

Xem điểm 4 here. Vì bạn đã áp dụng biến đổi trước khi chèn chế độ xem của trình điều khiển điều hướng dưới dạng chế độ xem phụ, công cụ bố cục không nghĩ thanh điều hướng ở cạnh trên cùng của cửa sổ và do đó không cần điều chỉnh để tránh trạng thái quán ba.

+0

Nó làm việc cho tôi! Cảm ơn! – Bivis

+0

Làm việc cho tôi! Cảm ơn! – Georg

+0

Đã dành nửa ngày để tìm một giải pháp - hoạt động hoàn hảo! – Vytis

6

Tôi đã tìm thấy một giải pháp, mặc dù khá hacky. Tôi phải tự điều chỉnh khung thanh điều hướng trước khi hình ảnh động khởi động:

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    toViewController.view.transform = transform; 
    [container addSubview:toViewController.view]; 

    // fix navigation bar position to prevent jump when completeTransition: is called 
    if ([toViewController isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* navigationController = (UINavigationController*) toViewController; 
     UINavigationBar* bar = navigationController.navigationBar; 
     CGRect frame = bar.frame; 
     bar.frame = CGRectMake(frame.origin.x, frame.origin.y + 20.0f, frame.size.width, frame.size.height); 
    } 
} 
+2

Vấn đề với điều này là nó chỉ sửa chữa vấn đề lần đầu tiên. Trình bày cùng một bộ điều khiển xem một lần nữa sau đó sẽ khiến thanh điều hướng là 20 pixel quá _low_. – roperklacks

+0

hoạt động tốt nhưng không hoạt động với thanh điều hướng màu. – yershuachu

+1

bar.frame = CGRectMake (frame.origin.x, frame.origin.y, frame.size.width, frame.size.height + 20.0f); là tốt hơn nhiều;) – yershuachu

0

này vẫn là một hack, dựa trên Ondřej Mirtes' một nhưng nó hoạt động tốt hơn nếu bạn có một thanh trạng thái trong cuộc gọi và bạn đang trên iOS8

if([toViewController isKindOfClass:[UINavigationController class]]) { 
    UINavigationController *navCtrl = (UINavigationController *)toViewController; 
    UINavigationBar *navBar = navCtrl.navigationBar; 
    if(navBar.frame.origin.y == 0 && navBar.frame.size.height == 44) { 
    navBar.frame = CGRectMake(0, 0, navBar.frame.size.width, fmin(44 + [UIApplication sharedApplication].statusBarFrame.size.height, 64)); 
    } 
} 

Vẫn còn xấu xí mặc dù:/

1

Thêm toViewControllerView đầu tiên vào ContainerView, sau đó đặt biến đổi toViewControllerView như được đưa ra dưới đây.

[container addSubview: toViewController.view];

toViewController.view.transform = transform;

Điều này sẽ giải quyết được sự cố.

Các vấn đề liên quan