1

我的目标是使用自定义动画制作自定义 segue,如下所示:我希望 segue 使用来自 destinationViewController 的按钮覆盖 sourceViewController 中的按钮,其效果类似于导航控制器的推送效果,即新按钮应该将旧按钮从右向左推开。

我已经能够根据需要使旧按钮(来自 sourceViewController)移开:

[UIView animateWithDuration:1.0 animations:^{
        // set the target frame for animated view
        sourceViewController.optionsButton.frame = leftButtonTargetFrame;
    } completion:^(BOOL finished) {
        [navigationController pushViewController:destinationViewController animated:NO];
        // reset the button's frame back to its original frame
        sourceViewController.optionsButton.frame = leftButtonInitFrame;
}];

但是我正在努力使新按钮(来自destinationViewController)移入。原因是我无法访问destinationViewController 的视图元素:在执行segue 时,它​​们没有被实例化。而且我无法为未实例化的按钮设置动画。

那么如何用destinationViewController 中的按钮替换sourceViewController 中的按钮呢?

4

2 回答 2

0

您是正确的,您不能为尚不存在的对象设置动画。但是,您可以伪造它。

  1. 创建一个占位符按钮,该按钮看起来与新视图控制器中的按钮相同。
  2. 将其动画到正确的位置。
  3. 当目标视图控制器进入时,它的按钮应该是不可见的。
  4. 在视图控制器就位后(即 segue 已完成),目标视图控制器可以确保其按钮的正确放置并使其实际按钮可见。

希望这可以帮助。

于 2013-03-09T14:20:19.583 回答
0

当您尝试访问按钮时,目标视图控制器的视图尚未初始化/加载。要加载目标视图控制器的视图,您可以简单地访问视图属性。在使用按钮之前执行此操作:[destinationViewController view];

destinationViewController.view;也可以,但会产生编译器警告。

背景资料:

如果您访问视图属性并且其值当前为 nil,则视图控制器会自动调用 loadView 方法并返回结果视图。

loadView方法加载控制器管理的视图。你不应该直接调用这个方法。

于 2013-03-11T10:47:45.700 回答