我一直在关注一些教程,以便在从一个视图转换到另一个视图时创建自定义动画.
我在这里使用自定义segue的测试项目工作正常,但有人告诉我,不再鼓励在自定义segue中进行自定义动画,我应该使用UIViewControllerAnimatedTransitioning.
我遵循了几个使用此协议的教程,但所有这些教程都是关于模态演示(例如本教程).
我想要做的是在导航控制器树中推送segue,但是当我尝试使用show(push)segue做同样的事情时它不再起作用了.
请告诉我在导航控制器中自定义将动画从一个视图转换到另一个视图的方法.
无论如何我可以使用一种方法来处理所有过渡动画吗?如果有一天我想做同样的动画但最终必须复制代码两次以处理模态与控制器转换,那将是很尴尬的.
精简版:
当与自定义转换和UINavigationControlleriOS7 结合使用时,我遇到了自动布局顶部布局指南的问题.具体而言,顶级布局指南和文本视图之间的约束不受尊重.有没有人遇到过这个问题?
长版:
我有一个场景明确定义了约束(即顶部,底部,左侧和右侧),呈现如下视图:

但是当我在导航控制器上使用自定义转换时,顶部布局指南的顶部约束似乎关闭,它呈现如下,好像顶部布局指南位于屏幕顶部,而不是底部导航控制器:

使用自定义转换时,导航控制器的"顶部布局指南"似乎变得混乱.其余约束正确应用.如果我旋转设备并再次旋转它,一切都会突然正确呈现,所以看起来并不是没有正确定义约束.同样,当我关闭自定义转换时,视图会正确呈现.
话虽如此,当我运行时_autolayoutTrace报告UILayoutGuide对象受到影响AMBIGUOUS LAYOUT:
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
Run Code Online (Sandbox Code Playgroud)
但是每当我看到它们时,这些布局指南总是被报告为含糊不清,即使我已经确保没有遗漏约束(我已经习惯性地选择视图控制器并选择"为视图控制器添加缺少的约束"或选择全部控制和为他们做同样的事情).
在如何我正是这样做的过渡方面,我指定符合对象UIViewControllerAnimatedTransitioning的animationControllerForOperation方法:
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if (operation == UINavigationControllerOperationPush)
return [[PushAnimator alloc] init];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
和
@implementation PushAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.5;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
[[transitionContext containerView] addSubview:toViewController.view];
CGFloat width = fromViewController.view.frame.size.width;
toViewController.view.transform = CGAffineTransformMakeTranslation(width, 0); …Run Code Online (Sandbox Code Playgroud) 我正在使用一个交互式自定义推送转换UIPercentDrivenInteractiveTransition.手势识别器成功调用交互控制器updateInteractiveTransition.同样,当我调用交互控制器时动画成功完成finishInteractiveTransition.
但是,有时我会在结尾处获得额外的一些分散注意力的动画(它似乎重复了动画的后半部分).有了相当简单的动画,我很少在iPhone 5上看到这种症状(虽然我在慢速笔记本电脑上工作时经常在模拟器上看到它).如果我使动画的计算成本更高(例如,大量阴影,多个视图为不同方向设置动画等),则设备上此问题的频率会增加.
有没有其他人看到这个问题,并找出一个解决方案,除了简化动画(我承认应该做的)和/或编写我自己的交互控制器?这种UIPercentDrivenInteractiveTransition方法有一定的优雅,但我对它不确定地行为不端的事实感到不安.别人看到过这种行为吗?有谁知道其他解决方案?
要说明效果,请参见下图.注意第二个场景,红色视图,当动画结束时,似乎第二次重复动画的后半部分.

此动画由以下内容生成:
反复呼叫updateInteractiveTransition,进度从0%升级到40%;
暂时停顿(因此您可以区分交互式过渡和完成动画finishInteractiveTransition);
然后调用finishInteractiveTransition完成动画; 和
动画控制动画的completion块调用completeTransition的transitionContext,以清理一切.
做一些诊断,似乎是最后一步触发了无关的动画.动画完成时会调用动画控制器的完成块,但是一旦我调用completeTransition它,它有时会重复动画的最后一位(特别是在使用复杂的动画时).
我不认为它是相关的,但这是我的配置导航控制器以执行交互式转换的代码:
- (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];
return nil;
}
- (id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController*)navigationController
interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>)animationController
{
return self.interationController;
}
Run Code Online (Sandbox Code Playgroud)
我PushAnimator是:
@implementation …Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义容器控制器,其工作方式类似于UIPageViewController我可以实现一些自定义转换和数据源逻辑.我试图模仿新的客户视图控制器转换API在iOS 7中的工作方式,除了在取消转换时视图外观回调的一些恼人的怪癖之外它运行良好...
beginAppearanceTransition:animated:和endAppearanceTransition被调用?我的自定义容器类有一些代码如下:
- (BOOL)shouldAutomaticallyForwardAppearanceMethods
{
return NO; // Since the automatic callbacks are wrong for our custom transition.
}
- (void)startTransition:(CustomTransitionContext *)context
{
// Get reference to the view controllers involved in the transition.
UIViewController *oldVC = [context viewControllerForKey:UITransitionContextFromViewController];
UIViewController *newVC = [context UITransitionContextToViewController];
// Prepare parent/child relationship changes.
[oldVC willMoveToParentViewController:nil];
[self addChildViewController:newVC];
// Begin view appearance transitions.
[oldVC beginAppearanceTransition:NO animated:[context isAnimated]];
[newVC beginAppearanceTransition:YES animated:[context isAnimated]];
// Register a completion …Run Code Online (Sandbox Code Playgroud) 我有兴趣实现视图控制器之间的转换,非常类似于Evernote的iOS应用程序中的转换:

当点击"位置"时,它会平滑地扩展为看起来像UINavigationController的绿色边框.要折叠它,我可以点击"返回"或从屏幕左侧滑动以逐渐过渡到主屏幕.
我不是在寻找准确的代码示例来进行复制粘贴,而是寻找有关哪些概念和Apple API可以利用的高级指导.进一步来说,
objective-c uiviewcontroller uiviewanimationtransition ios custom-transition
如何在主视图控制器的顶部显示"半视图"控制器?
要求: - 呈现第二个视图控制器,它在主视图控制器的顶部滑动. - 第二个视图控制器应仅显示主视图控制器的一半以上 - 主视图控制器应保持在第二个视图控制器后面可见(透明背景,下方未显示黑色) - 第二个视图控制器应使用类似于模态垂直覆盖的动画制作动画,或者iOS 7自定义转换 - 当第二个视图控制器处于活动状态时,用户仍然可以与主视图控制器上的按钮交互(即第二个视图控制器不覆盖整个主视图控制器)r - 第二个视图控制器有自己的复杂逻辑(不能简单视图) - 仅限故事板,Segues,iOS 7 - 仅限iPhone,而非iPad.
我尝试过使用模态视图控制器,但这不允许与主视图控制器交互.有人可以提供一个如何使用iOS7自定义转换或其他方法执行此操作的示例.
我正在尝试自己制作一个自定义alertView(适用于iOS7 +),但我在使用alertView演示文稿时遇到了困难.
我有一个黑色背景的UIViewController(alpha设置为0.25f),以及一个alertView作为子视图.
当我想显示alertView时,我以模态方式呈现viewController:
-(void) show
{
UIWindow* window = [[UIApplication sharedApplication] keyWindow];
self.modalTransitionStyle = UIModalPresentationCustom;
self.transitioningDelegate = self;
[window.rootViewController presentViewController:self animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
这是我的动画师对象:
-(NSTimeInterval) transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
NSLog(@"%s",__PRETTY_FUNCTION__);
return 2;
}
-(void) animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
NSLog(@"%s",__PRETTY_FUNCTION__);
UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey];
toView.alpha = 0;
UIView* container = [transitionContext containerView];
[container addSubview:toView];
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
toView.alpha = 0.5;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
Run Code Online (Sandbox Code Playgroud)
事情是:模态VC在背景中呈现VC呈现淡化,但是当动画结束时,呈现VC将从背景中移除.
如果我[transitionContext completeTransition:YES];改为调用,则呈现VC在后台但是在动画结束时删除了模态VC,所以如果我们发送'NO',我猜上下文取消了演示.
有没有办法将演示VC保留在后台而不必创建它的快照并将其设置为模态VC视图的背景?
今天我尝试为UINavigationController推/弹操作执行自定义segue ,但我找不到解决方案.
我显然可以使用自定义segue执行推送操作没有问题,但弹出操作(使用默认后退按钮)似乎很复杂(有些注意到这里https://developer.apple.com/library/ios/technotes/ tn2298/_index.html).
另一方面iOS 7执行自定义转换非常简单,我可以通过新的API实现自定义推/弹操作.
在哪种情况下,您选择创建自定义过渡以及何时使用自定义segue?
我的问题可能很通用,这取决于我们需要做什么......但我想得到你的意见.
如下图所示,Twitter为每个推送的视图控制器使用不同的导航栏颜色.
我几乎尝试了所有东西(setbackgroundimage,backgroundcolor,bartintcolor等),但似乎没有任何效果.我认为Twitter使用自定义过渡来模拟推送,因为,在我看来,每个视图控制器都有自己的导航栏和自己的颜色.


uinavigationbar uinavigationcontroller ios custom-transition
我在嵌入的视图控制器之间有一个自定义推送转换,UINavigationController当使用iOS 7/8构建时它工作正常,但在针对iOS 9 SDK构建时呈现错误的布局.
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[transitionContext.containerView addSubview:toViewController.view];
...
Run Code Online (Sandbox Code Playgroud)
然后它继续并执行动画.问题是toViewController,即使使用右上方布局指南自动布局约束,内容也会显示导航栏后面的内容.
尽管如此,它在iOS 8上运行正常,如果我们强制重绘(例如,将应用程序发送到后台并将其恢复,在顶部呈现模式并将其解除等)将导致整个自动布局系统重绘并且toViewController视图跳转到正确的位置(作为顶部布局指南,导航栏中的x像素,而不是设备屏幕顶部的x像素).
添加
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)
如果放入viewDidAppear:animated,但不起作用viewDidLoad或工作viewWillAppear:animated.这不是一个解决方案,因为用户会在重绘时看到视图跳跃viewDidAppear:animated
ios ×8
ios7 ×5
autolayout ×1
cocoa-touch ×1
ios9 ×1
objective-c ×1
storyboard ×1
transitions ×1