来自Xib中自定义UIView的UIImage返回带有黑色背景的空图像

时间:2018-02-13 14:07:47

标签: ios objective-c uiview uiimage nstextattachment

基本上,我正在寻找一种从XIB附加自定义UIView的方法,以便它可以用作UILabel中的链接预览。我选择将UIView转换为UIImage,因为图像可以在NSTextAttachment中使用,后者又可以在NSAttributedString中使用。

我正试图从这个UIView获取图像。代码如下:

UIView *preView = [[[NSBundle bundleForClass:[self class]] loadNibNamed:@"LinkPreview" owner:self options:nil] firstObject];

//preView contains 3 labels and 1 imageview with hardcoded values for testing 

if(preView)
{
      preView.bounds = CGRectMake(0,0,400,200);
      NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
      attachment.image = [preView snapShot];
      .
      .
}

方法snapShot在UIView类别中定义:

#import "UIView+Snapshot.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (Snapshot)

-(UIImage *)snapShot
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0f);
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    UIImage * snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshotImage;
}

@end

此代码返回带有黑色背景的空图像。

更新1 :preView很好

enter image description here

请帮忙。

1 个答案:

答案 0 :(得分:0)

您的视图尚未添加到视图层次结构中。意味着它尚未渲染。因此,您将获得黑色图像。

仅出于测试目的,将其添加为当前视图的子视图,然后再创建快照。它肯定会奏效。

更新:

如果您需要快照而不将其添加到层次结构中,请尝试以下

-(UIImage *)snapShot
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0f);
    [self.layer renderInContext: UIGraphicsGetCurrentContext()];
    UIImage * snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshotImage;
}

参考:Screenshot of a view without displaying it