如何在创建UIImageView时生成图像

4

我有一个自定义的UIImageView,当它被构建时,我想创建一个内存中或缓存到iDevice的图像,它是一个特定颜色的填充矩形,然后将其设置为UIImageView的Image属性。

我知道如何通过重写Draw方法在UIImage上绘制它,并且它只会在当前CGContext上绘制。但是,由于我想在构造UIImageView时执行此操作,因此我实际上没有可以绘制或其他任何东西的上下文,因为它尚未可见。

简单地说,我想知道是否有一种方式可以在应用程序启动并显示到屏幕之前,在自定义UIImageView构造时以编程方式执行此操作。

我可以接受C#或Objective-C的答案。

1个回答

6

好的,我可以帮助您进行UIKit/Objective-C方法的翻译。至于.NET方面,我无从得知。UIKit有一些有用的函数,可以通过编程方式生成UIImages。您需要做的是像以下这样:

- (UIImage*)generateImage {

    UIGraphicsBeginImageContext(someCGSize);
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // Draw whatever you want here with ctx, just like an overridden drawRect.

    UIImage* generatedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return generatedImage;
}

请确保从主线程调用此方法。这是我能想到的唯一注意事项。

[编辑] C#/MonoTouch 版本如下:

UIImage GenerateImage ()
{
    UIGraphics.BeginImageContext (new RectangleF (0, 0, 100, 100));
    var ctx = UIGraphics.GetCurrentContext ();

    // Draw into the ctx anything you want.
    var image = UIGraphics.GetImageFromCurrentImageContext ();
    UIGraphics.EndImageContext ();
    return image;
}

在应用程序启动时,似乎在对象构造期间不起作用。只有在从绘制方法调用时才有效,否则我会得到一个nil CGContextRef。当我处理UIGraphics和CGContext时,我很好。问题是,如果屏幕上没有显示任何内容,这些似乎不可用,并且似乎所涉及的UIView也必须可见于屏幕上。我希望能够创建一个UIImage而不需要当前上下文,以便可以在对象构造期间完成并在显示之前完成。 - Rodney S. Foley
我认为我可能在问的是,我是否可以创建一个用于“离屏”绘图的UIGraphic CGContext? - Rodney S. Foley
@Rodney:很奇怪。我在应用程序的生命周期中多次使用了这种方法来生成UIImage。现在我又有了一台能干的机器,我从-application:DidFinishLaunchingWithOptions:测试了一下,得到了一个有效的图像。我不熟悉monotouch,但是当你说“Draw”方法时,你可能是指UIView -drawRect:方法的重写。你能验证一下吗? - Matt Wilding
@Matt 是的,我指的就是 drawRect 方法。我已经尝试从几个地方获取 CGContext,包括构造函数和任何不在 drawRect 范围内或被 drawRect 调用的方法中调用时,都会得到一个空的 CGContext。这让我觉得 iOS SDK 中没有“多”缓冲和“离屏”绘制的概念。但是,如果您在对象构造函数或不是从 drawRect 调用的方法中获得了非空上下文,则我可能做错了什么,我将再尝试一次,并仔细检查我的语法和调用,以确保我没有做什么傻事。 - Rodney S. Foley
@Matt 确实,我使用你提供的精确方法示例进行了简单的测试,绘制了一个简单的图像,并且仅从构造函数中调用它,效果非常好。我以前一定做错了什么。谢谢 Matt! - Rodney S. Foley
哦,太好了,因为我已经没有建议了 =) - Matt Wilding

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