Cra*_*aig 5 iphone core-animation core-graphics objective-c
我的问题是:我有一个简单的块图像,我想制作一个网格.我在我的UIView中创建了一个CGPoints数组.然后我用了
blackImage = [UIImage imageNamed:@"black.png"];
Run Code Online (Sandbox Code Playgroud)
然后
- (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))];
}
Run Code Online (Sandbox Code Playgroud)
其中TouchX和TouchY是用户触摸屏幕的CGPoints.所以我基本上在用户触摸的网格上显示不同的图像.
首先,问题是每次调用DrawRect时都会重绘整个屏幕.我希望能够保存状态(通过更改BOOL的数组?)并让用户在屏幕上拖动并更改多个图像.但是,当我在DrawRect之外时,我无法在UImage上使用"drawAtPoint"方法.(抛出错误).
无论如何,我开始研究CoreAnimation和Quartz文档,并且真的很困惑.我不确定我是否应该为每个砖块创建多个UIViews(似乎过多),或者是CALayers或CGLayers的网格......我认为这很简单,我想做什么......但我真的不明白图层,以及使用CALayer和CGLayer之间的区别.显然"所有UIViews都是层支持的"这是什么意思?
我对如何实现这一点感到很遗憾.我基本上想要在网格中交换图像,以便用户可以在屏幕上"绘制"并切换图像.
我尝试使用[self setNeedsDisplayinRect]实现此功能,并传入用户手指下的CGRect.然而,这仍然是在TouchesMoved中调用DrawRect,它给了我想要的效果,但在iPhone上却太慢了.使用CALayers是否有更有效的方法来实现相同的效果?我是Core Animation的新手,并不真正了解如何使用图层来解决这个问题.
我认为在你的情况下, UIImage 应该处理这个应用程序并提供良好的性能。问题似乎是您强制整个屏幕重绘以响应每条drawRect:消息。传入的矩形指定您需要重绘的“脏区域”。任何其他绘图都只是浪费时间。
同样,您传递给视图的矩形setNeedsDisplay:是您特别想要使其无效的矩形。计算触摸周围的矩形并使之无效。UIKit 将(可能)联合多个脏矩形并发送单个drawRect:.
我建议您进行以下优化:
drawRect:,如果它小于全屏,请编写代码以确保您只重新绘制脏矩形内的图像如果您需要显示位图,而 1 和 2 无法获得您所需的性能,则您将不得不诉诸较低级别的技术。有很多例子,包括这个问题。