14

drawRect在 iOS 上,我们可以在使用中画一条线

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath (context);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 100, 100);
CGContextStrokePath(context);

但是如果我们删除上面的代码,我们也可以绘制一个矩形,然后使用:

UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];
[path stroke];

两个相关问题:

1) 为什么UIBezierPath不需要获取或使用当前上下文?

2)如果我有两个上下文:一个用于屏幕,一个是位图上下文,那么如何判断要绘制到哪个上下文UIBezierPath呢?我想它可能是UIGraphicsSetCurrentContext,但它不存在。

4

3 回答 3

22

UIBezierPath确实使用上下文。它使用当前的 UIKit 图形上下文。这与您已经得到的完全一样UIGraphicsGetCurrentContext()

如果你想UIBezierPath使用不同的上下文,你可以使用UIGraphicsPushContext(),但你必须记住UIGraphicsPopContext()在完成后使用。

于 2012-05-19T19:30:41.067 回答
6

据我所知,提到 CGContextFillRect 比使用 UIBezierPath 快约 8.5 倍(如果性能是一个因素并且假设您不需要使用 UIBezierPath 进行更复杂的绘图),我认为这可能很有用。

我在 Apple 的 HazardMap 示例(http://developer.apple.com/library/ios/#samplecode/HazardMap/Introduction/Intro.html)中添加了一些时间,对于 CGContextFillRect,每个矩形的毫秒时间约为 0.00064 毫秒/矩形方法与 UIBezierPath 方法的 ~0.00543 ms/rect 相比,可能 b/c 后者需要更多的消息传递开销。

即我正在比较使用

CGContextFillRect(ctx, boundaryCGRect);

与使用

UIBezierPath* path = [UIBezierPath bezierPathWithRect:boundaryCGRect];
[path fill];

在 HazardMapView 的内部循环中(加上上述更改以推送/弹出传递给 HazardMapView drawMapRect:zoomScale:inContext:) 的上下文。

预计到达时间

于 2012-10-24T15:23:38.483 回答
5

在 iOS 上,我们可以在drawRect使用中画一条线

我已经强调了这个声明的重要部分。在 内部drawRect:,UIKit 已经为您设置了一个上下文,任何基于对象的绘图指令都直接进入该上下文。UIBezierPath确实在使用该上下文,它只是不需要显式传递。

在 Cocoa Touch 中,必须始终有一个绘图上下文(在这种情况下,上下文最终会被绘制到屏幕上)。如果你不在里面drawRect:,你必须自己创建一个上下文。

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath (context);
CGContextMoveToPoint(context, 0, 0);

请注意,第一个函数调用是GetCurrentContext()。当您使用 CoreGraphics 的函数式绘图界面时,您需要将上下文传递给每个函数,但您不是在这里创建一个,您只是检索已经存在的一个。

图形上下文位于堆栈中。如果您想绘制到您创建的上下文中,您可以使用(正如 Kevin 已经提到的)将其推入堆栈UIGraphicsPushContext(),然后弹回前一个。

于 2012-05-19T19:35:43.640 回答