导航控制器在pushViewController时的动画卡顿问题

昨天在调试导航控制器的时候发现在push的时候动画有卡顿的现象,出现卡顿问题的代码如下:

1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
2     UIViewController* newController = [[UIViewController alloc] init];
3     newController.title = @"新的控制器";
4     [self.navigationController pushViewController:newController animated:YES];
5 }

  一开始以为是电脑性能问题,就没在管它,今天早上再次调试的时候还是有这个问题,因为这次切换后的控制器是UITableViewController,重新运行后发现卡顿现象没了,代码如下:

1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
2     UITableViewController* newController = [[UITableViewController alloc] init];
3     newController.title = @"新的控制器";
4     [self.navigationController pushViewController:newController animated:YES];
5 }

然后就对这个问题来兴趣了,为什么切换成UIViewController时会有卡顿的问题呢?先对比一下UITableViewController和UIViewController的不同之处,UITableViewController的View是一个列表,背景色默认为白色,UIViewController的View时空白的,背景显示黑色。背景显示黑色一般有两个原因:

1、背景色是黑色的。

2、UIColor的alpha值是0。

难道UIViewController的View默认是黑色的?先来验证一下。

1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
2     UIViewController* newController = [[UIViewController alloc] init];
3     UIColor* color = newController.view.backgroundColor;
4     NSLog(@"Color: %@", color);
5     newController.title = @"新的控制器";
6     [self.navigationController pushViewController:newController animated:YES];
7 }

控制条输出结果是:

2015-06-04 12:30:17.007 Weibo[5110:607] Color: (null)

UIViewController的View的color属性是空的,很明显,背景显示黑色的原因是因为颜色是透明的。

UITableViewController的验证结果如下:

1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
2     UITableViewController* newController = [[UITableViewController alloc] init];
3     UIColor* color = newController.view.backgroundColor;
4     NSLog(@"Color: %@", color);
5     newController.title = @"新的控制器";
6     [self.navigationController pushViewController:newController animated:YES];
7 }

输出结果:

2015-06-04 12:34:12.555 Weibo[5128:607] Color: UIDeviceRGBColorSpace 1 1 1 1

所以,导致卡顿的的罪魁祸首就是UIViewController的View的默认color为空,背景色是透明的。这其实不是卡顿,而是由于透明颜色重叠后视觉上的问题,设置一个背景色就可以了。

时间: 2024-10-11 09:41:03

导航控制器在pushViewController时的动画卡顿问题的相关文章

解决UINavigationController在pushViewController时出现的"卡顿"问题

进行开发中,遇到了个小问题: 在使用UINavigationController的-pushViewController:animated:执行入栈一个子控制器操作时(即最新栈顶子控制器),会出现推出(即入栈)"卡顿"现象, 原因:这是因为从iOS7开始, UIViewController的根view的背景颜色默认为透明色(即clearColor),所谓"卡顿"其实就是由于透明色重叠后,造成视觉上的错觉,所以这并不是真正的"卡顿",但这种&quo

CSS3 动画卡顿性能优化解决方案--摘抄

最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区,不过项目在磕磕绊绊中完成的差不多了,但是遇到了CSS3动画渲染的性能问题,所以我也是被逼的,再回过头来从浏览器渲染网页的流程出发,去找动画卡顿的症结. 浏览器渲染网页的流程如下: 使用 HTML 创建文档对象模型(DOM) 使用 CSS 创建 CSS 对象模型(CSSOM) 基于 DOM 和 CSS

Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)

最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿! 这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个.我是菜鸟,我承认 呵呵,虽然不见得完全和他们的一样,但是确实解决了翻页时那一刻的卡顿现象. 因为未发现网上有相关文章,希望对朋

解决input[type=file]打开时慢、卡顿问题

为什么在input标签类型为file上传文件时在标签中设置属性 accpet="image/*",打开本地文件夹的速度特别慢? 经过测试发现,在mac里面safari.Firefox.Chrome(opera不知道为啥老闪退)都没有卡顿问题 在windows里面,Firefox不卡顿,只有Chrome卡顿. 于是我决定先去掉accpet试试……果然就没有了卡顿的问题.那么本包在试试accpet="image/jpg"果然也不卡卡的了!!看来问题的所在就是"

linux服务器登录时慢出现卡顿

使用SSH远程登录Linux在输入用户名之后在过了好几秒之后才会出现输入密码.严重影响工作效率.登录很慢,登录上去后速度正常,这种情况的主要原因为: DNS反向解析的问题 SSH在登录的时候一般我们输入服务器的ip地址.它根据该IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间. 解决办法: 在目标服务器上修改sshd服务器端配置,并重启sshd vi /etc/ssh/sshd_config

UIKit框架(11)导航控制器UINavigationController

介绍多控制器管理中非常重要的一个控制器UINavigationController 它负责管理多个控制器,能够轻松完成控制器间的切换 如:iOS系统上的设置 父类是UIViewController,但其功能并非是管理view,而是管理多个控制器 控制器栈式管理: 当切换时,将一个控制器入栈,当返回时,栈顶控制器出栈 当前显示的永远是栈顶控制器的view,栈结构如下: @property(nonatomic, copy) NSArray *viewControllers  //管理的所有控制器  

导航控制器 控制视图间的切换

委托下是一个UINavigationController导航控制器.三个视图的先后切换,分别为UITableViewController.UITableViewController.UIViewController. 导航控制器的 pushViewController:animated: Pushes a view controller onto the receiver’s stack and updates the display. - (void)pushViewController:(U

键盘--自动弹出不卡顿的小技巧

1 /** 2 * 在view已经显示的时候弹出键盘, 这样可避免切换控制器的时的小卡顿 3 */ 4 - (void)viewDidAppear:(BOOL)animated 5 { 6 [super viewDidAppear:animated]; 7 [self.searchBar becomeFirstResponder]; 8 }

Android中app卡顿原因分析示例

在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. ========================================================= 我来说下我所知道的事情.我不知道iOS为什么流畅,但我知道一些Android为什么不流畅的原因. 首先,就题主所说的问题,我用iPad和小米Pad对比了一下微博滑动滚屏这件事情(2014年8月10日目前微博