如何在构建 UIImageView 时创建图像

Posted

技术标签:

【中文标题】如何在构建 UIImageView 时创建图像【英文标题】:How to create an Image at construction of a UIImageView 【发布时间】:2011-04-10 18:24:18 【问题描述】:

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

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

简而言之,我想知道是否有一种方法可以在应用程序启动时在任何内容显示到屏幕之前以编程方式构建自定义 UIImageView。

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

【问题讨论】:

【参考方案1】:

好吧,我可以通过 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;

【讨论】:

在应用程序启动时对象构造期间似乎不起作用。这似乎只在从 Draw 方法调用时才有效,否则我得到一个 nil CGContextRef。当我处理 UIGraphics 和 CGContext 时,我很擅长。问题是,如果屏幕上没有显示任何内容,这些似乎不可用,而且似乎有问题的 UIView 也必须在屏幕上可见。我希望能够创建一个没有当前上下文的 UIImage,这样它就可以在对象构造期间和显示之前完成。 我想我可能要问的是我可以为“离屏”绘图创建一个 UIGraphic CGContext 吗? @Rodney:这很奇怪。我已经在应用程序生命周期的很多时候忠实地使用此方法生成 UIImage。现在我再次使用了一台功能强大的机器,我从 -application:DidFinishLaunchingWithOptions: 进行了测试,我得到了一个有效的图像。我对单点触控不熟悉,但是当您说“Draw”方法时,您的意思似乎很可能是对 UIView -drawRect: 方法的覆盖。你能验证一下吗? @Matt 是的,drawRect 就是我的意思。我试图从包括构造函数在内的多个地方获取 CGContext,并且只要调用不在 drawRect 范围内或 drawRect 调用的方法范围内,我就会得到一个 nil CGContext。这让我觉得 ios SDK 中没有“多重”缓冲和“离屏”绘制的概念。但是,如果您在对象构造函数中获得了非 nil 上下文,并且没有从 drawRect 调用方法,那么我可能做错了,我会再试一次并仔细检查我的语法和调用以确保我没有做一些愚蠢的事情。 @Matt 果然我使用您提供的确切方法示例做了一个简单的测试并绘制了一个简单的图像,我只从构造函数中调用它,它工作得很好。我以前一定是做错了什么。谢谢马特!

以上是关于如何在构建 UIImageView 时创建图像的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 UIImageView 使用 Autolayout 调整大小

即使在运行时设置 UIImage,如何在 UIImageView 上做弯角?

iOS UIImageView 内存没有在 ARC 上被释放

ui scrollview 中没有手势识别器 uiimageview

如何为 UIImageView 中的图像变化设置动画?

如何使用可拉伸图像创建 UIImageView