【问题标题】:ios: Screenshot doesn't display mask Layerios:屏幕截图不显示遮罩层
【发布时间】:2012-02-24 20:46:04
【问题描述】:

我有一个具有特定背景颜色的视图。我用下面的代码屏蔽了这个视图:

UIView *colorableView = [[UIView* alloc] init];
colorableView.backgroundColor = someColor;

CALayer *maskLayer = [CALayer layer];
maskLayer.contents = (id)[UIImage imageNamed:maskImageName].CGImage;

colorableView.layer.mask = maskLayer;

好的,那里一切正常。视图被蒙版,因此某些部分是透明的。现在我对这个视图进行截图:

CGRect frame = colorableView.frame;

UIGraphicsBeginImageContext(frame.size);

CGContextRef c = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(someUninterestingCodeToGetACorrectPosition);

[self.view.layer renderInContext:c];
UIImage *screenShotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return screenShotImage;

截屏是可行的(实际上我也在视图上方显示了一些其他内容,并且这些内容也会显示在屏幕截图中),但不知何故,掩码无法识别。这意味着我得到的是一个全彩色视图(矩形)的屏幕截图,没有掩码隐藏它的某些部分。

我猜 ´UIGraphicsGetImageFromCurrentImageContext()` 不适用于遮罩层,那我该怎么办呢?我需要一个 UIImage 来在邮件中显示屏幕截图。

提前非常感谢

【问题讨论】:

    标签: objective-c ios screenshot layer mask


    【解决方案1】:

    解决此问题的一种方法是使用 Quartz 函数来剪辑视图(CGContextClip,我不记得确切,您必须深入研究文档)。 希望这会有所帮助

    【讨论】:

    • 好的,我现在在 drawRect 方法中使用 'CGContextClipToMask(context, rect, maskImage)',它适用于屏幕截图。不过,我只对屏幕截图执行此操作,因为在覆盖 drawRect 时无法为颜色设置动画(有时我会这样做)。一件事,你知道如何获得更高分辨率的蒙版,因为我认为矩形的大小限制了蒙版的分辨率。因为原始的矩形很小,但有时图标会变大,当我截屏时,蒙版分辨率比我原始蒙版方法的蒙版分辨率低得多。
    • 可能是因为您使用的是视网膜显示器?如果是这种情况,您将获得 scale 属性 [[UIScreen mainScreen] scale] (不完全确定语法),然后将您的矩形大小乘以该值。
    • 我在 Ipad2 上工作,因此没有视网膜显示,并且比例属性返回 1。如果我在 Interface Builder 中使原始视图非常大,则蒙版的分辨率很好。但是原始视图与图标一样大,并且有时会放大。然后我做了一个截图,因为原来的矩形很小,分辨率很低。我想我为此提出了另一个问题。
    • 是的,使用新代码可能会更好。所以这可以帮助我们完全理解你在解释什么:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多