iphone - 在 drawRect : 中使用 Core Graphics 绘制图像网格

标签 iphone objective-c core-animation core-graphics

我的问题是:我有一个简单的 block 图像,我想用它制作网格。我在我的 UIView 中创建了一个 CGPoints 数组。然后我用了

blackImage = [UIImage imageNamed:@"black.png"];

然后

- (void)drawRect:(CGRect)rect {
    for (int j = 0 ; j <= 11; j++)
    {
        for (int i = 0 ; i <= 7; i++) 
        {
            [blackImage drawAtPoint: (CGPointFromString([[self.points objectAtIndex:j] objectAtIndex:i]))];
        }
    }
    [whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))];

    //  [whiteImage drawAtPoint:(CGPointMake(240.0, 320.0))];   
}

其中 TouchX 和 TouchY 是用户触摸屏幕的 CGPoints。所以我基本上是在用户触摸的网格点上显示不同的图像。

首先,问题是每次调用 DrawRect 时都会重绘整个屏幕。我希望能够保存状态(通过更改 BOOL 数组?)并让用户在屏幕上拖动并更改多个图像。但是,当我在 DrawRect 之外时,我无法在 UImage 上使用“drawAtPoint”方法。 (抛出错误)。

无论如何,我开始研究 CoreAnimation 和 Quartz 文档,并感到非常困惑。我不确定我是否应该为每个砖 block 创建多个 UIView(似乎过多),或者 CALayers 或 CGLayers 的网格......我认为我想做的事情非常简单......但我真的不明白图层,以及使用 CALayer 和 CGLayer 的区别。显然“所有 UIView 都是层支持的”这是什么意思?

我有点不知道如何实现它。我基本上想交换网格中的图像,以便用户基本上可以在屏幕上“绘画”并切换图像。


编辑

我已经尝试使用 [self setNeedsDisplayinRect] 并传入用户手指下的 CGRect 来实现它。然而,这仍然在 TouchesMoved 中调用 DrawRect,这给了我想要的效果,但在 iPhone 上速度太慢了。有没有更有效的方法来使用 CALayers 实现相同的效果?我是 Core Animation 的新手,不太了解如何使用层来解决这个问题。

最佳答案

我认为在你的情况下,UIImage 应该处理这个应用程序并提供良好的性能。问题看起来是您强制整个屏幕重新绘制以响应每个 drawRect: 消息。传入的矩形指定您需要重绘的“脏区”。任何其他绘图都只是在浪费时间。

同样,您传递给 View 的 setNeedsDisplay: 的矩形是您特别想要使其失效的矩形。计算触摸周围的矩形并使其无效。 UIKit 将(可能)合并多个脏矩形并发送单个 drawRect:

我建议您执行以下优化:

  1. 检查传递给您的 drawRect: 的脏矩形(在调试器中),如果它小于全屏,则编写代码以确保您只在脏矩形内重新绘制图像
  2. 使用触摸事件确保您只使需要重绘的区域无效,然后重新访问 1。
  3. 如果这没有获得您需要的性能,请使用 Quartz 绘制黑白矩形而不是使用图像,因为它是一些 UIImage 怪异的(但我怀疑是这种情况)

如果您需要显示位图,而 1 和 2 没有获得您需要的性能,您将不得不求助于较低级别的技术。周围有很多例子,包括 this question在 SO 上。

关于iphone - 在 drawRect : 中使用 Core Graphics 绘制图像网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/762063/

相关文章:

iphone - 标签栏和导航 Controller 内的 MKMapView 隐藏了 Google 品牌

android - 监控 HTML5 iphone/android 应用程序中的网络 Activity ?

ios - 防止在设备旋转时调用 MKMapViewDelegate 方法

iphone - 如何将核心动画 block 内的一段代码排除在动画之外?

cocoa - NSWindow,使用 Core Animation 时的奇怪角落

iphone - 如何在 iPhone 上移动 MkMapView.userLocation?

ios - Branch.io 仅在应用程序已存在于设备中时才重定向到应用程序商店

c++ - Objective-C++ 中的复杂类层次结构

ios - 如何在uitableview中获取这种类型的时区列表?

iphone - 弹性动画 - 其背后的数学原理