如何在-drawRect:方法中绘制UIImage或直接绘制?

47

我有一个 UIImage,我想要在一个 UIView 上绘制它。但是,我不想创建一个 UIImageView 并将其添加为子视图,而是想覆盖 -drawRect: 方法并直接绘制我的 UIView。

例如,我的代码如下:

- (void)drawRect:(CGRect)rect {
    CGContextRef myContext = UIGraphicsGetCurrentContext();

    UIImage *img = [UIImage imageNamed:@"foo.png"];

    // how to draw the directly into the view now?
}
2个回答

86

调用 [img drawInRect:rect]; 方法。


4
也可以使用 [img drawAtPoint:point],但我更喜欢使用 drawInRect: - Sam Soffes
如果可能的话,请避免使用这种技术;drawInRect和drawAtPoint的性能相当糟糕。 - TomSwift
1
谢谢。我发现这些特别有用(与类似的NSString UIKit绘图插件结合使用),适用于包含背景图像和文本的视图,然后添加到滚动视图中。在drawRect:中同时绘制背景图像和文本可以避免Quartz混合层(如果您使用UIImageView和UILabel子视图方法,则会这样做),这对滚动性能有重大影响。 - cidered

30

顺便说一下,在drawRect方法中不应该加载图像文件。因为该方法在需要更新视图时调用。因此,它(当然,包括加载过程)可能在运行期间被多次调用。 (此外,OS2.x的imageNamed方法存在一个错误--没有缓存图像并泄漏了它。)

因此,最好在初始化方法中加载文件,而不是在drawRect中。


感谢您提供那么有用的信息。不过,您指的“initialization”方法是哪一个呢? - geforce
他可能是指+(void)initialize,或者通常的init方法,这取决于你正在做什么。 - Mason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接