Quyết định của tôi để giải quyết hoạt ảnh "che ngang" như phương pháp đẩy UINavigationViewController bằng cách sử dụng UIViewControllerTransitioningDelegate.
1.Tạo chuyển tiếp tùy chỉnh.
Tiêu đề
@interface CoverHorizontalTransition: NSObject<UIViewControllerAnimatedTransitioning>
@property (assign, nonatomic) BOOL dismiss;
@end
Thực hiện
@implementation CoverHorizontalTransition
- (void)animateTransition:(nonnull id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController;
fromViewController =
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController;
toViewController =
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *containerView = transitionContext.containerView;
CGRect animatedViewFrame;
animatedViewFrame = containerView.bounds;
animatedViewFrame.origin = CGPointMake(CGRectGetWidth(animatedViewFrame), 0);
[containerView addSubview:toViewController.view];
if (_dismiss) {
[containerView bringSubviewToFront:fromViewController.view];
[UIView
animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
fromViewController.view.frame = animatedViewFrame;
} completion:^(BOOL finished) {
[containerView.superview addSubview:toViewController.view];
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
} else {
toViewController.view.frame = animatedViewFrame;
[UIView
animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
toViewController.view.center = containerView.center;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
}
- (NSTimeInterval)transitionDuration:(nullable id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.25;
}
@end
2.Create chuyển tiếp đại biểu.
@implementation CustomViewControllerTransitioningDelegate
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
return [CoverHorizontalTransition new];
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
CoverHorizontalTransition *transition;
transition = [CoverHorizontalTransition new];
transition.dismiss = YES;
return transition;
}
@end
Mẫu sử dụng.
...
// Save delegate to strong property
secondController.customTransitioningDelegate =
[BaseViewControllerTransitioningDelegate new];
secondController.transitioningDelegate =
secondController.customTransitioningDelegate;
secondController.modalPresentationStyle = UIModalPresentationCustom;
[self presentViewController:secondController animated:YES completion:nil];
Mã này hoạt động cho iOS 10 trở lên.
Nguồn
2017-12-27 14:07:11
Không, nó không hoạt động, chỉ đơn giản là không có hoạt ảnh. secondController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; // Hãy xem enum này typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, } UIModalTransitionStyle; [self presentViewController: secondController animated: YES completion: nil]; –
@SubramanianRaj Thêm UIModalPresentationStyle quá – Ch0k0l8
@SubramanianRaj Kiểm tra mã mới – Ch0k0l8