有效地对UIView进行子类化

时间:2011-10-23 16:23:26

标签: iphone ios uiview subclass quartz-graphics

伙计我在为UIView做一些麻烦。 我正在创建一个IconView。 它只是一些其他子视图的容器。 在我的IconView中我有这个iVar: UIImageView _background UIImageView _icon UILabel _iconLabel。

当我初始化IconView时,我使用图像,文本和一些石英效果(如roundCorner和Shadow)设置了这个3 iVar,然后我将它们添加到自我视图中。 一切都很好但是如果我在空的scrollview中插入一些IconView(即10),则滚动效果不平滑。我在滚动视图中插入数千个简单的UIViews之前尝试过,滚动动画效果很好。 只有10个我的IconView,滚动动画效果非常糟糕。

我可以采用不同的方式保留UIImages而不是UIImageViews,并将其绘制在drawRect:方法中,但在这种情况下,我将失去Autoresizing属性和Quartz效果。

有什么建议吗? 谢谢,加布里埃尔。

2 个答案:

答案 0 :(得分:1)

不幸的是,UIScrollView变得非常快。关于此主题的帖子和文章很多,例如this Questionthis (defect) blogpost以及it's sample code。在2010年的WWDC视频中还有三个关于“iOS中的性能优化”的会议,我强烈建议您观看。总结结论:使用尽可能少的子视图,并特别注意避免透明度。

好的,对于一般的'ScrollViews中的表现'谈话,现在你的情况:遇到同样的问题,我使用了上面的文章和视频的所有提示,虽然他们改善了性能,但它不是足够。我和你一样,使用圆角一些图像,我发现这绝对会杀死性能。只是停用它们比其他任何事情更有帮助。它与阴影效果可能相同。

现在,很可能,你想保留那些圆角。我建议您使用those awesome classes创建图像的副本(或者如果可能的话,使用原始图像),然后直接操作它们。这样,效果只会应用一次。它对我来说很完美。对于阴影,您可以在Photoshop中创建一些并在新的ImageView中使用它们。

如果这还不够,您应该尝试缓存IconViews,如TableViewCells缓存,如果您还没有这样做。

答案 1 :(得分:1)

问题可能是石英阴影。如果经常使用它们,它们可以真正减慢渲染速度。

在将它们写下来之前,您可以尝试将CALayer的shouldRasterize属性设置为YES。这使得quartz只渲染一次阴影并将其存储在缓冲区中。看看它如何。