【问题标题】:Keep first View Controller visible on custom Segue在自定义 Segue 上保持第一个 View Controller 可见
【发布时间】:2015-07-31 23:06:10
【问题描述】:

我有三个视图控制器,它们的排列方式类似于 snapchat。 main 嵌入在 UINavigationController 中,位于中间,左侧是视图控制器,右侧是视图控制器。 过渡效果很好,左/右动画。但是在 snapchat 中,当您切换到相机旁边的控制器或反之亦然时,相机将在自定义 segue 上保持可见(而不是黑色)。有了我的,如果我将第二个视图控制器推入堆栈,当我希望它保持完全可见时,第一个视图控制器似乎会随着动画的开始淡化为黑色。我猜我必须在我的自定义 segue 中改变一些东西。

 @implementation toTheRight

- (void) perform{
UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

CATransition *transition = [CATransition animation];
transition.duration = .5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

[sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[sourceViewController.navigationController pushViewController:destinationViewController animated:NO];
}

【问题讨论】:

    标签: ios xcode uinavigationcontroller uistoryboardsegue


    【解决方案1】:

    以这两个项目中修改CustomSegue和CustomUnwindSegue为例。 https://github.com/soleares/SOLPresentingFun https://github.com/Phillipus/CustomSegue

    CustomSegue.m

    #import "CustomSegue.h"
    #import "SOLSlideTransitionAnimator.h"
    
    @interface CustomSegue()<UIViewControllerTransitioningDelegate>
    @property (nonatomic,strong) SOLSlideTransitionAnimator* animator;
    @end
    
    @implementation CustomSegue
    
    - (void)perform {
        UIViewController *sourceViewController = self.sourceViewController;
        UIViewController *destinationViewController = self.destinationViewController;
    
        destinationViewController.transitioningDelegate = self;
        destinationViewController.modalPresentationStyle = UIModalPresentationCustom;
    
        [sourceViewController presentViewController:destinationViewController animated:YES completion:nil];
    }
    
    /*
     Called when presenting a view controller that has a transitioningDelegate
     */
    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
                                                                      presentingController:(UIViewController *)presenting
                                                                          sourceController:(UIViewController *)source
    {
        self.animator.appearing = YES;
        return self.animator;
    }
    
    -(SOLSlideTransitionAnimator*) animator
    {
        if(!_animator)
        {
            _animator = [[SOLSlideTransitionAnimator alloc] init];
            _animator.appearing = NO;
            _animator.duration = 0.35;
            _animator.edge = SOLEdgeRight;
        }
        return _animator;
    }
    
    @end
    

    CustomUnwindSegue.m

    @interface CustomUnwindSegue()<UIViewControllerTransitioningDelegate>
    @property (nonatomic,strong) SOLSlideTransitionAnimator* animator;
    @end
    
    
    
    #import "CustomUnwindSegue.h"
    #import "SOLSlideTransitionAnimator.h"
    
    @implementation CustomUnwindSegue
    
    - (void)perform {
        UIViewController *sourceViewController = self.sourceViewController;
    
        sourceViewController.transitioningDelegate = self;
        sourceViewController.modalPresentationStyle = UIModalPresentationCustom;
    
        [sourceViewController dismissViewControllerAnimated:YES completion:nil];
    }
    
    -(SOLSlideTransitionAnimator*) animator
    {
        if(!_animator)
        {
            _animator = [[SOLSlideTransitionAnimator alloc] init];
            _animator.appearing = NO;
            _animator.duration = 0.35;
            _animator.edge = SOLEdgeRight;
        }
        return _animator;
    }
    
    /*
     Called when dismissing a view controller that has a transitioningDelegate
     */
    - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
    {
        self.animator.appearing = NO;
        return self.animator;
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多