为啥 UIButton 框架设置这么慢
Posted
技术标签:
【中文标题】为啥 UIButton 框架设置这么慢【英文标题】:Why is UIButton frame setting so slow为什么 UIButton 框架设置这么慢 【发布时间】:2014-03-13 11:35:52 【问题描述】:最近我一直在对某个应用的工具进行一些性能分析。这是我注意到的:
即UIButton框架设置很慢。
为了排除它是由类型转换(从 int 到 CGFloat)引起的可能性,我尝试了以下方法:
我也试过了:
不,也没有多大帮助。
最后但并非最不重要的一点是,我确定它不是由 CGRectMake 引起的:
该函数被调用了大约650-670次,这使得每帧设置调用大约0.173ms?听起来对吗?如何提高性能?
【问题讨论】:
【参考方案1】:嗯...我不是 100% 确定,但您使用的是具有固定大小的按钮类型 UIButtonTypeDetailDisclosure
。
尝试只设置它的中心而不是框架。
myDetailButton.center = CGPointMake(12, 12);
而不是...
myDetailButton.frame = CGRectMake(0, 0, 23, 23);
f
也不是必需的,IIRC 实际上在使用时会占用比所需更多的内存。只需使用23
或23.0
而不是23.0f
。不过,我必须为此找到参考。
编辑
话虽如此,我刚刚在问题底部看到了您的计时统计信息。
您在此处看到的百分比是相对的。 0.173ms 几乎没有时间。
如果不多次运行该函数,您可能会获得更好的性能提升。你运行它 700 次。好多啊!你真的需要运行它很多次吗?您甚至无法一次在屏幕上放置那么多按钮。
也许您需要将它们出列?毕竟你使用的是MKMapView
。
【讨论】:
出队是什么意思? 好吧,我需要查看更多代码才能弄清楚您要对按钮执行什么操作。 tableView 和 collection view 管理它们的单元格的方式与 map 管理注释视图的方式相同。如果一个表格有 100 个项目,但屏幕上只有 10 个,那么它只会创建 10 个单元格。然后,当一个单元格离开屏幕时,该单元格再次被标记为可用于下一个项目,因此只有 10 个单元格。做这样的事情而不是将 700 个按钮加载到内存中是有意义的。只够在屏幕上显示并重复使用它们。 非常感谢您的帮助,但这有点困难,因为服务器在第一次查询时返回了 600+ 个结果,所以除非我更改查询的处理方式,否则无法解决很容易。 您仍然可以拥有一个包含 600 个项目的数组。但只需为在任何给定点实际出现在屏幕上的按钮加载按钮。以上是关于为啥 UIButton 框架设置这么慢的主要内容,如果未能解决你的问题,请参考以下文章