从一个 UIView 到另一个 UIView 的平滑过渡

Posted

技术标签:

【中文标题】从一个 UIView 到另一个 UIView 的平滑过渡【英文标题】:Smoother transition from one UIView to another UIView 【发布时间】:2012-08-13 14:02:47 【问题描述】:

我有一个UIViewController,它有多个子视图。每个子视图都是UIView 子类,我想通过点击工具栏按钮在视图之间切换。我通过使用动画块来做到这一点:

例子:

[UIView animateWithDuration:0.5 
                      delay:0.0 
                    options:UIViewAnimationOptionTransitionFlipFromRight 
                 animations:^
                         [StoreView removeFromSuperview];
                         [self.view addSubview:HomeView]; 
                     
                 completion:NULL];

实际上一切正常。问题是过渡并不是很顺利。例如,HomeView 有五个分散的按钮(作为设计的一部分),每当我从一个视图切换到HomeView 时,这些按钮会从一个角落出来并在转换后重新排列,这不是很漂亮看看。

那么我将如何使这些按钮保持原位?

【问题讨论】:

如果您应该展示您正在尝试实现的目标的屏幕截图或模型以及您现在获得的图片,您可能会得到一些答案。 我不太清楚你的问题是什么......我认为你的问题现在没有足够的信息。您是否尝试过使用[UIView transitionFromView:HomeView toView:StoreView duration:0.75 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];?这将替换您当前的动画块。 另外,这取决于StoreView 中包含的内容。这只是一个普通的视图吗?它是否包含来自网络的数据?它是否包含高分辨率图像?解决方案因问题而异。 StoreView 不是问题所在。它完美地显示出来。没有任何延误。 HomeView 是我唯一关心的一个。 HomeView 包含自定义的UIButtons,其中包含图像。基本上,这些 UIButton 会将我重定向到其他视图。这些其他视图实际上不包含除 Home 按钮之外的任何按钮,因此当我从 HomeView 动画到另一个视图时没有问题。至于截图,我很乐意提供,但我很难捕捉到一张,因为它发生得非常快。 【参考方案1】:

在使用复杂的子视图制作动画时,您有时会遇到不希望的结果。不仅会出现一些奇怪的东西,而且有时它们的成本很高,具体取决于视图结构的复杂性。我会提出的一个建议是,您可以将视图渲染到图形上下文并在UIImageView 中为生成的图像设置动画,而不是为复杂视图本身设置动画,使用技巧使其看起来像是在为视图设置动画等级制度。在这种情况下,您可以避免对HomeViewStoreView 执行相当于复杂转换的操作,而是使用UIImageView 实例进行简单翻转。考虑以下示例代码:

UIImageView *storeImage = //  pointer to the image rendered to a graphics context
UIImageView *homeImage =  //  pointer to the image rendered to a graphics context

[self.view addSubview:storeImage];
[storeView removeFromSuperview];

[UIView animateWithDuration:0.5 
                      delay:0.0 
                    options:UIViewAnimationOptionTransitionFlipFromRight 
                 animations:^
                         [storeImage removeFromSuperview];
                         [self.view addSubview:homeImage]; 
                     
                 completion:^(BOOL finished) 
                     [self.view addSubview:homeView];
                     [homeImage removeFromSuperview];
                 ];

【讨论】:

您好,感谢您的回复。我会试试这个,看看它是否有效。 为了将来参考,在 ios 7 上获取快照的最佳方式是使用snapshotViewAfterScreenUpdates:

以上是关于从一个 UIView 到另一个 UIView 的平滑过渡的主要内容,如果未能解决你的问题,请参考以下文章

将 UIGestureRecognizer 的所有事件从一个 UIView 传递到另一个 UIView(子视图)[重复]

通过 UINavigationController 将整个 UIView 从一个 ViewController 传递到另一个

将 UIView 从一个选项卡移动到另一个选项卡

使用自动布局时如何将动画从一个 UIView 翻转到另一个?

尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用

如何将 UIView 复制到另一个