C# 如何在构建UIImageView时创建图像

C# 如何在构建UIImageView时创建图像,c#,objective-c,ios,uiimageview,xamarin.ios,C#,Objective C,Ios,Uiimageview,Xamarin.ios,我有一个自定义UIImageView,当它构建时,我希望在内存中创建一个或缓存到iDevice图像,该图像是一个特定颜色的填充矩形,然后将其设置为UIImageView的Image属性 我知道如何通过重写draw方法在UIImage上绘制它,它只会在当前CGContext上绘制。然而,由于我想在构建UIImageView时这样做,我实际上没有可以绘制的上下文或任何东西,因为它还不可见 简单地说,我想知道,当应用程序在屏幕上显示任何内容之前启动时,是否有一种方法可以在构建自定义UIImageVie

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

我知道如何通过重写draw方法在UIImage上绘制它,它只会在当前CGContext上绘制。然而,由于我想在构建UIImageView时这样做,我实际上没有可以绘制的上下文或任何东西,因为它还不可见

简单地说,我想知道,当应用程序在屏幕上显示任何内容之前启动时,是否有一种方法可以在构建自定义UIImageView时以编程方式实现这一点


我对C#或Objective-C的答案没有意见。

好吧,我可以帮助您使用UIKit/Objective-C方法。至于.NET,我没有最模糊的。UIKit有几个有用的函数,用于以编程方式生成UIImage。您需要执行以下操作:

- (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;
}

当应用程序启动时,在对象构造期间,这似乎不起作用。这似乎只在从Draw方法调用时起作用,否则我会得到一个nil CGContextRef。我擅长处理UIGraphics和CGContext。问题是,如果屏幕上没有显示任何内容,那么这些视图似乎不可用,而且所讨论的UIView似乎也必须在屏幕上可见。我希望能够在没有当前上下文的情况下创建UIImage,这样就可以在对象构造期间和显示之前完成。我想我可能要问的是,我可以为“屏幕外”绘图创建UIGraphic CGContext吗?@Rodney:这很奇怪。我在应用程序生命周期的许多阶段都忠实地使用了这种方法来生成UIImage。现在我又回到了一台有能力的机器上,我从应用程序:didfishlaunchingwithoptions:测试了这个,得到了一个有效的映像。我不熟悉monotouch,但当你说“Draw”方法时,你可能是指覆盖UIView-drawRect:方法。你能证实吗?@Matt是的,drawRect就是我所说的方法。我曾尝试从多个地方获取CGContext,包括构造函数,只要调用不在drawRect范围内或drawRect调用的方法,我就会得到一个nil CGContext。这让我觉得iOS SDK中没有“多重”缓冲和“脱离屏幕”的概念。但是,如果您在对象构造函数中获得了一个非零上下文,或者一个未从drawRect调用的方法,那么我可能做错了什么,我将再试一次,并仔细检查我的语法和调用,以确保我没有做愚蠢的事。@Matt确实,我使用您提供的确切方法示例做了一个简单的测试,并绘制了一个简单的图像,我只从构造器调用它,它工作得很好。我以前一定是做错了什么。谢谢你,马特!