菜鸟教程小白 发表于 2022-12-12 09:29:18

ios - 使用自定义 segue 转到 ViewController 会导致 viewWillAppear 被调用两次


                                            <p><p>我写了一个自定义的segue,因为我想给它添加我自己的动画。一切正常,除了目标 ViewCiewController 中的 viewDidLoad 方法被调用了两次。这是我的 segue 的 perform 方法:</p>

<pre><code>- (void)perform
{
    UIViewController* sourceViewController = self.sourceViewController;
    UIViewController* destinationViewController = self.destinationViewController;

    ;

    CGPoint originalCenter = destinationViewController.view.center;
    destinationViewController.view.center = CGPointMake(self.originatingPoint.x * 3, self.originatingPoint.y);

    [UIView animateWithDuration:0.25
      delay:0.0
      options:UIViewAnimationOptionCurveEaseInOut
      animations:^{
            destinationViewController.view.center = originalCenter;
      }
      completion:^(BOOL finished) {
            ; // present VC
      }];
}
</code></pre>

<p>有人知道是什么原因造成的吗?</p>

<p>[----- 编辑 -----]</p>

<p>segue 作为一个自定义 segue 出现在故事​​板中,具有我自己编写的 segue 类。在我的类(class)中唯一不同的是我上面提到的 perform 方法。 segue通过按钮调用,prepareForSegue方法只调用一次。</p>

<p>[----- 编辑 2 -----]</p>

<p>我检查了 targetVC 的 viewDidLoad 方法,每个 segue 只调用一次。尽管如此,使用 viewWillAppear 对我来说会更方便,所以你知道我可以用什么不同的方式来制作这个动画吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我建议您使用 <code>UIViewControllerTransitioningDelegate</code> 和 <code>UIViewControllerAnimatedTransitioning</code> 这是自 iOS 7.0 起更适合用于转换的约定。从 iOS 8.0 开始,您还获得了 <code>UIPresentationController</code> 支持,允许您构建更丰富的过渡。</p>

<p>例子:</p>

<pre><code>@interface ModalTransitionAnimator : NSObject&lt;UIViewControllerAnimatedTransitioning&gt;

@property (nonatomic) CGPoint originatingPoint;

@end

@implementation ModalTransitionAnimator

- (NSTimeInterval)transitionDuration:(id&lt;UIViewControllerContextTransitioning&gt;)transitionContext {
    return 0.25;
}

- (void)animateTransition:(id&lt;UIViewControllerContextTransitioning&gt;)transitionContext {
    NSTimeInterval duration = ;
    UIView* sourceView = ;
    UIView* destinationView = ;
    UIView* container = transitionContext.containerView;

    ;

    CGPoint originalCenter = destinationView.center;

    destinationView.center = CGPointMake(self.originatingPoint.x * 3, self.originatingPoint.y);

    [UIView animateWithDuration:duration animations:^{
            destinationView.center = originalCenter;
      }
      completion:^(BOOL finished) {
            ;
      }];
}

@end
</code></pre>

<p>然后在 <code>prepareForSegue</code> 中,您只需分配过渡委托(delegate)并实现 <code>UIViewControllerTransitioningDelegate</code> 以返回适当的动画器以进行演示或解除。</p>

<pre><code>@interface ViewController : UIViewController&lt;UIViewControllerTransitioningDelegate&gt;
@end

@implementation ViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIViewController* controller = (UIViewController*)segue.destinationViewController;

    controller.transitioningDelegate = self;
    controller.modalPresentationStyle = UIModalPresentationCustom;
    controller.modalPresentationCapturesStatusBarAppearance = YES;
}

- (id &lt;UIViewControllerAnimatedTransitioning&gt;)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
    ModalTransitionAnimator *animator = [ init];
    animator.originatingPoint = /* ... */;

    return animator;
}

@end
</code></pre>

<p>由于这是一个模态转换,因此您必须在使用它呈现 Controller 时使用 <code>presentViewController:animated:</code>。因此,在 Storyboard 中使用普通的“显示”转场,它们会自动运行所有动画,无需在这里重新发明转场。</p>

<p>我有一个如何在 Github 上的某个地方构建自定义转换的示例:</p>

<p> <a href="https://github.com/pronebird/CustomModalTransition/tree/ios8" rel="noreferrer noopener nofollow">https://github.com/pronebird/CustomModalTransition/tree/ios8</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用自定义 segue 转到 ViewController 会导致 viewWillAppear 被调用两次,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/33253112/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/33253112/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用自定义 segue 转到 ViewController 会导致 viewWillAppear 被调用两次