- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我写了一个自定义转场,因为我想给它添加我自己的动画。除了目标 View CiewController 中的 viewDidLoad 方法被调用两次之外,一切正常。这是我的 segue 的执行方法:
- (void)perform
{
UIViewController* sourceViewController = self.sourceViewController;
UIViewController* destinationViewController = self.destinationViewController;
[sourceViewController.view addSubview:destinationViewController.view];
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) {
[sourceViewController presentViewController:destinationViewController animated:NO completion:NULL]; // present VC
}];
}
有人知道是什么原因造成的吗?
[----- 编辑 -----]
segue 作为自定义 segue 出现在故事板中,带有我自己编写的 segue 类。在我的类(class)中唯一不同的是我在上面提出的执行方法。通过按钮调用segue,只调用一次prepareForSegue方法。
[----- 编辑 2 -----]
我检查了 targetVC 的 viewDidLoad 方法,每个 segue 只调用一次。尽管如此,使用 viewWillAppear 对我来说会方便得多,所以您是否知道我制作此动画的不同方式?
最佳答案
我建议您使用 UIViewControllerTransitioningDelegate
和 UIViewControllerAnimatedTransitioning
,它们是自 iOS 7.0 以来更适合用于转换的约定。从 iOS 8.0 开始,您还获得了 UIPresentationController
支持,这使您可以构建更丰富的过渡效果。
例子:
@interface ModalTransitionAnimator : NSObject<UIViewControllerAnimatedTransitioning>
@property (nonatomic) CGPoint originatingPoint;
@end
@implementation ModalTransitionAnimator
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
return 0.25;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
NSTimeInterval duration = [self transitionDuration:transitionContext];
UIView* sourceView = [transitionContext viewForKey:UITransitionContextFromViewKey];
UIView* destinationView = [transitionContext viewForKey:UITransitionContextToViewKey];
UIView* container = transitionContext.containerView;
[container addSubview:destinationView];
CGPoint originalCenter = destinationView.center;
destinationView.center = CGPointMake(self.originatingPoint.x * 3, self.originatingPoint.y);
[UIView animateWithDuration:duration animations:^{
destinationView.center = originalCenter;
}
completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
@end
然后在 prepareForSegue
中,您只需分配转换委托(delegate)并实现 UIViewControllerTransitioningDelegate
以返回适当的动画师以进行演示或解雇。
@interface ViewController : UIViewController<UIViewControllerTransitioningDelegate>
@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 <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
ModalTransitionAnimator *animator = [[ModalTransitionAnimator alloc] init];
animator.originatingPoint = /* ... */;
return animator;
}
@end
因为这是一个模态转换,你必须使用 presentViewController:animated:
来呈现 Controller 。因此,在 Storyboards 中使用正常的“显示”segues,它们将自动运行引擎盖下的所有动画,无需在这里重新发明 segues。
我在 Github 的某处有关于如何构建自定义转换的示例:
https://github.com/pronebird/CustomModalTransition/tree/ios8
关于ios - 使用自定义 segue 转到 ViewController 会导致 viewWillAppear 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33253112/
我将我的 iAd/AdMob 广告代码放在... -(void)viewWillAppear:(BOOL)animated{} 广告在所有 iOS 设备上的效果都很好,就像我现在使用的那样。当我将我的
我最近对 iOS View Controller 包含感到头疼。 一切都按预期工作,除了一种特殊情况: 如果父 View Controller 包含在父 View Controller 中,而父
我有 UIScrollView 和多个 UIVIew subview 。我想更新每个 UIView 显示在 UIScrollView 的可见部分中时显示的数据。 触发的回调是什么?我尝试了 viewW
这个问题在这里已经有了答案: Why does viewWillAppear not get called when an app comes back from the background? (7
我正在使用 NSUserDefaults使一个对象在多个 UIViewController 之间保持同步UITabbarController 中使用的 s .为此,我正在实现以下 - (void)vi
我读过许多关于人们在 正确创建 View 层次结构时遇到 viewWillAppear 问题的帖子。我的问题是我不明白那是什么意思。 如果我创建一个 RootViewController 并在该 Co
当 B ->present ->C 时,它自动调用 viewWillAppear,但是当我从 C 解除到 B 并再次 B ->present ->C 时,viewWillAppear 在我触摸屏幕后调
我正在使用 Storyboard在 iOS 7 上编写应用程序。 我有一个导航 Controller 作为我的 Root View Controller ,我在其中嵌入了一个 View Control
我有一个加载记录的表格 View ,请参阅下面的代码: - (void)viewDidLoad { self.navigationItem.title=@"Accounts"; // N
在我的应用程序中,我的 View 中输入字段中的数据不断变化,因此每次将 View 显示到屏幕上时,我都需要运行一个函数来对显示的内容进行排序。 我找到了 -(void)viewWillAppear,
我有一个嵌入在导航 Controller (NAV1) 中的 View Controller (VC1)。在它的 viewWillAppear 方法中,我调用以模态方式呈现另一个 View Contr
我正在使用“viewWillAppear”来检查 UserDefaults.standard,如果我有关于默认值的数据,我想重定向到仪表板 View 并退出登录。 当我正确登录时,应用程序正常重定向,
我的 ViewWillAppear 方法中有这段代码,它只是将一组标签向下移出屏幕: override func viewWillAppear(animated: Bool) { super.
我的应用程序的工作流程是,当我失去连接时,我将应用程序重定向到特定的 viewController,然后在 viewWillAppear 上我做一些处理。 在 foreground 模式下,这非常有效
我已经设置了一个基本的测试应用程序,它显示一个包含标签的 View ,没有使用 IB。我想使用自定义 UIView 子类和自定义 UIViewController 子类。 这将按预期运行,但 MyVi
我有以下设置 只有横向 View 的 XIB 文件。此 View 连接到我的 Controller 此 View 上有一个标签连接到 IBOutlet UILabel* label 这个标签是这样配置
根据我的统计,调用 viewWillAppear 的唯一两个实例是当您初始化 View Controller 时,或者当您在导航堆栈上弹出位于其顶部的 View Controller 时(即向前插入
我有这个 View Controller class ViewController: UIViewController { override func viewWillAppear(animated
我读过许多关于人们在 正确创建 View 层次结构时遇到 viewWillAppear 问题的帖子。我的问题是我不明白那是什么意思。 如果我创建一个 RootViewController 并在该 Co
我正在编写一个应用程序,如果用户在打电话时正在查看应用程序,我需要更改 View 。 我已经实现了以下方法: - (void)viewWillAppear:(BOOL)animated { [
我是一名优秀的程序员,十分优秀!