如何填充屏幕中的矩形区域,在ios中具有良好的性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何填充屏幕中的矩形区域,在ios中具有良好的性能相关的知识,希望对你有一定的参考价值。
我正在制作简单的数字着色游戏(如沙盒,像素艺术,独角兽等),并遇到了一个问题。我尝试了各种填充屏幕中的rects的方法。
- 起初我创建了一个backgroundView(一个简单的UIView),它有2500个子视图(也是UIViews),每个都有
size = (CGSize){50,50}
。添加了点击手势识别器,检测到应填充哪个视图,并简单地更改该视图的背景颜色。但是当我将backgroundView放在scrollView中时,滚动和缩放很糟糕。 - 试过同样的事情,但这次每个矩形都是
CALayer
。所以一个backgroundView,有2500个子图层(每个是50,50大小的CALayer
) - 缩放和滚动也很糟糕。 - 厌倦了使用UIView子类中的重写drawRect方法或
drawInContext
子类中的CALayer
(我用CGContext
填充rects)的自定义绘图,这个时间问题也是由缩放和滚动引起的。因为我需要在用户缩放时更新每个rect,它会触发很多drawRect调用,而且性能也很糟糕。
有什么想法我怎么能在屏幕上填写rects?
说明
对!在滚动视图中添加2,500个小UIView可能会破坏性能。我不会使用这种方法,但如果你这样做,至少要确保所有子视图上的subview_N.opaque = YES;
禁用合成。
您描述的CALayer
方法与UIView
方法基本相同,因为视图由CoreAnimation层支持(请参阅-[UIView layer]
)。
在不降低帧速率的情况下,在ios上将数千个矩形绘制到屏幕上的最佳选项是使用以下方法之一:
- 使用CoreGraphics直接绘制
- 使用OpenGL直接绘制(极为复杂)
- 使用
UICollectionViewLayout
等布局引擎
现在,你说你曾尝试重写-[UIView drawRect:]
,但你没有提供任何示例代码供我们结账。如果您需要更具体的反馈,请使用方法#3的实际代码更新您的问题。您创建的drawRect代码很可能出现问题。 CoreGraphics绝对可以在屏幕上绘制数千个方块而不会严重拖累帧率。
一解决方案
我最近发布了一个项目YMTreeMap,它将数千个矩形绘制成一个UIView
来创建金融TreeMaps。它在Swift中,而不是Objective-C,但基本概念是相同的。为此,我创建了一个自定义的UICollectionViewLayout
,让Apple经过良好测试的UICollectionView
类可以处理选择性绘图,缩放和动画的细节。
YMTreeMap项目中的example UIViewController代码显示了如果您知道的是它们的位置和大小,如何将数千个彩色矩形绘制到屏幕上。这听起来像你在做什么。由于您还在滚动和缩放,因此这个解决方案对您来说可能是完美的,因为UICollectionView
对这两者都有原生支持。
以上是关于如何填充屏幕中的矩形区域,在ios中具有良好的性能的主要内容,如果未能解决你的问题,请参考以下文章
为啥CGContextSetFillColorWithColor在ios中的矩形区域填充错误的颜色