我推送的ViewController
包含的视图不多,UIScrollView
里面包含10个视图,我有一个单例ViewController
并一次又一次地推送它而不再释放和分配ViewController
,所以我在viewDidLoad()
和viewWillAppear()
中执行的所有操作,但动画缓慢且不连贯,可能是什么?
答案 0 :(得分:90)
我遇到一个问题,当UIViewController A执行pushViewController推送UIViewController B时,推送动画将停止在25%左右,停止,然后在剩下的时间内滑动B.
这个DID不会发生在iOS 6上,但是当我开始在XCode 5中使用iOS 7作为基础SDK时,就会发生这种情况。
修复是视图控制器B在其根视图上没有设置backgroundColor(根视图是viewController.view的值,您通常在loadView中设置)。在该根视图的初始化程序中设置backgroundColor可以解决问题。
我设法解决了这个问题:
// 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;
}
答案 1 :(得分:27)
只解决此问题,不要将主视图的背景颜色设置为清除颜色。
当您的下一个视图超过上一个视图时,如果您将背景设置为清除颜色,则表示它是透明的,之前的视图在某些时候始终可见,这会破坏动画。
答案 2 :(得分:4)
您可以先使用Instruments> Time Profiler,查看代码中是否有任何部分需要的时间超过必要时间。
你也可以使用仪器>核心动画工具,可用于标记未有效绘制/动画的部分屏幕。
如果您使用的是旧款iPhone或原装iPod - 复杂的屏幕,我注意到一些应用程序有些不稳定。
答案 3 :(得分:0)
我遇到了这个问题,这是因为推送视图控制器中的旧代码导致视图“淡入”,在viewWillAppear上将alpha设置为0,并在viewDidAppear上将alpha设置为1。
我删除了执行此操作的旧代码,并且推送工作正常。
-(void)viewWillAppear {
self.view.alpha = 0; //REMOVE THIS LINE
}
答案 4 :(得分:0)
我的问题是我将批量加载代码放在viewWillAppear
中。我的情况是
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
我有很多行,所以pushViewController是滞后的。
答案 5 :(得分:0)
答案 6 :(得分:0)
在我的情况下,我在viewWillLayoutSubviews()方法中设置了ui更改代码(例如shadow和cornerRadius和...),当我将这些代码放入其他方法(如viewWillAppear())中时,过渡会变得更加顺畅
答案 7 :(得分:0)
快速:如果您要在任何视图上应用阴影,那么您也可以尝试以下代码。
view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale