Tag: 自定义过渡

使用iOS 9上的NavigationController自定义推送animation

我有一个embedded在UINavigationController视图控制器之间的自定义推入转换,当使用iOS 7/8构build时工作正常,但是在针对iOS 9 SDK构build时呈现错误的布局。 – (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [transitionContext.containerView addSubview:toViewController.view]; … 然后继续进行animation。 问题是toViewController的内容,即使它使用正确的顶部布局指南自动布局约束,呈现导航栏后面的内容。 不过,它在iOS 8上工作的很好,如果我们强制重绘(例如,发送应用程序到背景并将其返回,在顶部呈现模式并将其解除,等等)将导致整个自动布局系统自我重绘toViewController的视图跳转到正确的位置(作为顶部布局指南,来自导航栏的x像素而不是来自设备屏幕顶部的x像素)。 添加 [self.view setNeedsUpdateConstraints]; [self.view layoutIfNeeded]; 作品,如果放在viewDidAppear:animated ,但不工作viewDidLoad或viewWillAppear:animated 。 这不是一个解决scheme,因为用户在viewDidAppear:animated时发生重绘时会看到视图跳跃

UIPercentDrivenInteractiveTransition在完成时产生无关的animation

我正在使用UIPercentDrivenInteractiveTransition进行交互式自定义推送转换。 手势识别器成功地调用交互控制器的updateInteractiveTransition 。 同样,当我调用交互控制器的finishInteractiveTransition时,animation成功完成。 但是,有时我会在最后看到额外的分散注意力的animation(似乎重复animation的后半部分)。 使用相当简单的animation,我很less在iPhone 5上看到这种症状(虽然我经常在慢速笔记本电脑上模拟器上看到它)。 如果我使animation在计算上更昂贵(例如,大量的阴影,animation不同方向的多个视图等),则设备上的这个问题的频率增加。 有没有其他人看到这个问题,并想出了一个解决scheme,而不是简化animation(我承认应该这样做)和/或编写我自己的交互控制器? UIPercentDrivenInteractiveTransition方法具有一定的优雅性,但是我对其不确定地行为不端的事实感到不安。 有其他人看到这种行为? 有谁知道其他解决scheme? 为了说明效果,请参阅下面的图片。 注意第二个场景,红色视图,当animation结束时,似乎是第二次重复animation的后半部分。 这个animation是由以下产生的: 反复调用updateInteractiveTransition ,进度从0%更新到40%; 暂时暂停(这样就可以区分交互式转换和由finishInteractiveTransition产生的完成animation); 然后调用finishInteractiveTransition完成animation; 和 animation控制器的animationcompletion块为transitionContext调用completeTransition ,以清理所有东西。 做了一些诊断,似乎是触发这一无关animation的最后一步。 animation完成时调用animation控制器的完成块,但只要我调用completeTransition ,它有时会重复animation的最后一位(特别是在使用复杂animation时)。 我不认为这是相关的,但这是我的代码configuration导航控制器执行交互式转换: – (void)viewDidLoad { [super viewDidLoad]; self.navigationController.delegate = self; self.interationController = [[UIPercentDrivenInteractiveTransition alloc] init]; } – (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC { if (operation == UINavigationControllerOperationPush) return [[PushAnimator alloc] init]; […]

在自定义转换后触摸不到

我在iPad上有自定义转换的问题。 我创build了一个自定义的过渡animation正确,似乎工作(即发生转变)。 但是,当我到达目标视图控制器(执行isLoggedIn块后)时,目标视图控制器无响应(它不响应触摸事件)。 我有一种感觉,它与调用[container insertSubview:toViewController.view belowSubview:fromViewController.view]; 因为如果我调用[container insertSubview:toViewController.view aboveSubview:fromViewController.view]; 触摸按预期工作(但不能看到animation,因为它发生在源视图控制器上)。 任何想法为什么触摸事件不被识别? -(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *container = [transitionContext containerView]; //Prepare the view if (self.isLoggedIn) { //Insert the main view under the login view CGRect frame = CGRectMake(0, 0, toViewController.view.frame.size.height, toViewController.view.frame.size.width); toViewController.view.frame = frame; [container insertSubview:toViewController.view belowSubview:fromViewController.view]; […]

iOS呈现视图控制器animation为“推”(左右animation)

目前,我有一个视图控制器呈现其他视图控制器。 我想要做的是重新创build推动视图控制器时使用的默认animation。 我目前的做法是: FirstViewController : @IBAction private func push(sender: AnyObject) { let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SecondViewController") let transition = CATransition() transition.duration = 0.5 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight view.window?.layer.addAnimation(transition, forKey: kCATransition) presentViewController(vc, animated: false, completion: nil) } SecondViewController : @IBAction private func pop(sender: AnyObject) { let transition = […]