我有一个UIScrollView,可以动画很多UIViews(可能太多了)。此外,这些UIViews代表“页面”,有时多个页面堆叠在一起,导致页面“堆积”(通过将子视图添加到给定视图来设置)。
我知道滚动过多的UIViews会导致性能不佳,但我想知道是否有人提出一些提高性能的一般提示?
目前,在drawRect中手动绘图并不是我想要考虑的因为它会弄乱各种“页面堆”动画。我会记住它是最后的手段,但我绝对希望尽可能避免它。
更新: 性能影响的原因已经确定并且有两个方面:我在所有的UIViews上使用抗锯齿和阴影。当我将它们都关闭时,性能问题就解决了!但是,我显然不想只是将它们切换掉:)
我正在创建我的阴影:
self.imageView.layer.opaque = YES;
self.imageView.layer.masksToBounds = NO;
self.imageView.layer.shadowOffset = CGSizeMake(-4, 0);
self.imageView.layer.shadowRadius = 2.5;
self.imageView.layer.shadowOpacity = 0.15;
self.imageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(
self.bounds.origin.x,
self.bounds.origin.y,
self.bounds.size.width + 8,
self.bounds.size.height + 2)].CGPath;
提高性能的任何提示?
就抗锯齿而言,几乎是必需品。问题是那些“偏移页面”略微旋转,我的页面有1像素边框。稍微旋转1像素边框没有抗锯齿看起来很糟糕。我只是通过将“使用边缘抗锯齿渲染”设置为YES来在.plist中启用抗锯齿。
有关如何提高阴影/抗锯齿效果的任何建议都将受到赞赏。
答案 0 :(得分:2)
有多少UIViews“很多”?我们在谈论什么样的观点?
如果不需要复杂的绘图,100 UIViews通常不是问题。
但是,渲染PDF的10 UIWebView
个实例却是另一回事......
确保您的视图仅在必要时布局和绘制(=仅当它们实际可见时才显示)。例如,您可以通过在视图的layoutSubviews
中创建断点来检查这一点。
此外,尽可能使用不透明的UIView
元素。这使绘图更有效,因为不必绘制不透明元素下面的视图。
如果碰巧有自定义CALayer
实例(例如CAShapeLayer
带有阴影等),需要大量处理但很少更改,您可能需要考虑对这些实例进行光栅化:{{1 }}
这通过缓存渲染的合成图像来加速绘制。