如何填充屏幕中的矩形区域,在ios中具有良好的性能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何填充屏幕中的矩形区域,在ios中具有良好的性能相关的知识,希望对你有一定的参考价值。

我正在制作简单的数字着色游戏(如沙盒,像素艺术,独角兽等),并遇到了一个问题。我尝试了各种填充屏幕中的rects的方法。

  1. 起初我创建了一个backgroundView(一个简单的UIView),它有2500个子视图(也是UIViews),每个都有size = (CGSize){50,50}。添加了点击手势识别器,检测到应填充哪个视图,并简单地更改该视图的背景颜色。但是当我将backgroundView放在scrollView中时,滚动和缩放很糟糕。
  2. 试过同样的事情,但这次每个矩形都是CALayer。所以一个backgroundView,有2500个子图层(每个是50,50大小的CALayer) - 缩放和滚动也很糟糕。
  3. 厌倦了使用UIView子类中的重写drawRect方法或drawInContext子类中的CALayer(我用CGContext填充rects)的自定义绘图,这个时间问题也是由缩放和滚动引起的。因为我需要在用户缩放时更新每个rect,它会触发很多drawRect调用,而且性能也很糟糕。

有什么想法我怎么能在屏幕上填写rects?

答案

说明

对!在滚动视图中添加2,500个小UIView可能会破坏性能。我不会使用这种方法,但如果你这样做,至少要确保所有子视图上的subview_N.opaque = YES;禁用合成。

您描述的CALayer方法与UIView方法基本相同,因为视图由CoreAnimation层支持(请参阅-[UIView layer])。

在不降低帧速率的情况下,在ios上将数千个矩形绘制到屏幕上的最佳选项是使用以下方法之一:

  1. 使用CoreGraphics直接绘制
  2. 使用OpenGL直接绘制(极为复杂)
  3. 使用UICollectionViewLayout等布局引擎

现在,你说你曾尝试重写-[UIView drawRect:],但你没有提供任何示例代码供我们结账。如果您需要更具体的反馈,请使用方法#3的实际代码更新您的问题。您创建的drawRect代码很可能出现问题。 CoreGraphics绝对可以在屏幕上绘制数千个方块而不会严重拖累帧率。

一解决方案

我最近发布了一个项目YMTreeMap,它将数千个矩形绘制成一个UIView来创建金融TreeMaps。它在Swift中,而不是Objective-C,但基本概念是相同的。为此,我创建了一个自定义的UICollectionViewLayout,让Apple经过良好测试的UICollectionView类可以处理选择性绘图,缩放和动画的细节。

YMTreeMap项目中的example UIViewController代码显示了如果您知道的是它们的位置和大小,如何将数千个彩色矩形绘制到屏幕上。这听起来像你在做什么。由于您还在滚动和缩放,因此这个解决方案对您来说可能是完美的,因为UICollectionView对这两者都有原生支持。

以上是关于如何填充屏幕中的矩形区域,在ios中具有良好的性能的主要内容,如果未能解决你的问题,请参考以下文章

为啥CGContextSetFillColorWithColor在ios中的矩形区域填充错误的颜色

iOS开发基础-UI学习

UIView详解

当鼠标悬停在该特定区域上时,如何为列表中的一个矩形填充不同的颜色?

查找具有内容的区域并获取其边界矩形

iOS 的视图层次结构继承关系及常用结构体探讨