我推送一个
ViewController
,其中不包含太多视图,UIScrollView
,其中包含10个视图,我有一个单例ViewController
,并一次又一次地推送它,而无需再次释放和分配ViewController
,所以所有的事情我用viewDidLoad()
和viewWillAppear()
来做,但是动画很慢而且断断续续,这可能是什么?
我遇到了一个问题,当 UIViewController A 执行 PushViewController 来推送 UIViewController B 时,推送动画会在大约 25% 处停止,停止,然后在剩下的时间内滑动 B。
这在 iOS 6 上没有发生,但是当我开始使用 iOS 7 作为 XCode 5 中的基础 SDK 时,这种情况就开始发生。
解决方法是视图控制器 B 没有在其根视图上设置 backgroundColor(根视图是 viewController.view 的值,通常在 loadView 中设置)。在根视图的初始值设定项中设置背景颜色解决了问题。
我设法解决这个问题如下:
// CASE 1: The root view for a UIViewController subclass that had a halting animation
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
// Do some initialization ...
// self.backgroundColor was NOT being set
// and animation in pushViewController was slow and stopped at 25% and paused
}
return self;
}
// CASE 2: HERE IS THE FIX
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
// Do some initialization ...
// Set self.backgroundColor for the fix!
// and animation in pushViewController is no longer slow and and no longer stopped at 25% and paused
self.backgroundColor = [UIColor whiteColor]; // or some other non-clear color
}
return self;
}
解决这个问题的唯一方法,永远不要将主视图的背景颜色设置为透明颜色。
当您的下一个视图覆盖前一个视图时,如果您将背景设置为透明颜色,则意味着它是透明的,前一个视图在某些时候始终可见,这会破坏动画。
您可以首先使用“仪器”>“时间分析器”,查看代码中是否有任何部分花费的时间超过必要的时间。
您还可以使用“仪器”>“核心动画”工具,该工具可用于标记屏幕上无法有效绘制/动画的部分。
如果您使用的是旧 iPhone 或原装 iPod - 屏幕复杂,我注意到一些应用程序有点不稳定。
我遇到了这个问题,这是因为推送的视图控制器中的旧代码导致视图“淡入”,在 viewWillAppear 上将 alpha 设置为 0,在 viewDidAppear 上将 alpha 设置为 1。
我删除了执行此操作的旧代码,并且推送工作正常。
-(void)viewWillAppear {
self.view.alpha = 0; //REMOVE THIS LINE
}
我的问题是我将质量负载代码放入
viewWillAppear
中。我的情况是
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
而且我有很多行,所以pushViewController很滞后。
在我的例子中,我在viewWillLayoutSubviews()方法中设置了ui更改代码(例如shadow和cornerRadius等等),当我将这些代码放入其他方法(如viewWillAppear())时,过渡变得更平滑
Swift:如果您要在任何视图等上应用阴影,那么您也可以尝试下面的代码。
view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale
12 年后,可以确认确保在 viewDidLoad 中在控制器视图上设置背景颜色仍然是这里的解决方案:D