2013-12-08 70 views
5

当前代码:面膜任意大小的UIImageView与可调整大小的UIImage掩盖

self.backgroundImageView.image = [self.message imageOfSize:self.message.size]; // Random image, random size 

    UIImage *rightBubbleBackground = [[UIImage imageNamed:@"BubbleRight"] 
    resizableImageWithCapInsets:BubbleRightCapInsets 
    resizingMode:UIImageResizingModeStretch]; 

    CALayer *mask = [CALayer layer]; 
    mask.contents = (id)[rightBubbleBackground CGImage]; 

    mask.frame = self.backgroundImageView.layer.frame; 
    self.backgroundImageView.layer.mask = mask; 
    self.backgroundImageView.layer.masksToBounds = YES; 

这并不正常工作。尽管应用了蒙版,但rightBubbleBackground不能正确调整大小以适应self.backgroundImageView,即使它已调整大小写切片(BubbleRightCapInsets)集的大小。

原始图像:

Original image

面膜图像(rightBubbleBackground):

Mask

结果:

Result

我发现this answer但它只适用于对称图像。也许我可以修改这个答案供我使用。

+0

我想'mask.frame = self.backgroundImageView.layer.frame;'应该是'mask.frame = self.backgroundImageView.layer.bounds;'。如果图层的框架不等于边界,则使用您的代码将导致掩码移位。 – PowerQian

回答

10

我错了。该答案可以修改为适用于不对称图像。我在that answer上工作了一下,解决了我自己的问题。

下面的代码让我的帽子插图为遮罩层工作:

mask.contentsCenter = 
CGRectMake(BubbleRightCapInsets.left/rightBubbleBackground.size.width, 
BubbleRightCapInsets.top/rightBubbleBackground.size.height, 
1.0/rightBubbleBackground.size.width, 
1.0/rightBubbleBackground.size.height); 

结果:

Result

+1

伙计。谢谢!!! – Mahouk

+0

BubbleRightCapInsets的值是什么..我使用这个UIEdgeInsets BubbleRightCapInsets = UIEdgeInsetsMake(15.0f,20.0f,15.0f,20.0f); –

+0

@MANCHIKANTIKRISHNAKISHORE我已经重新设计了应用程序,不再记得插入内容。尽管如此,你应该使用更大的值来解释箭头,或者也可以使用“底部”。 – duci9y

0

我(的一部分)同样的问题 - 即像素化层内容。对于我来说,它是通过在CALayer上设置contentsScale值来解决的 - 由于某些原因,CALayers的默认缩放比例始终为1.0,即使在Retina设备上也是如此。

layer.contentsScale = [UIScreen mainScreen].scale; 

另外,如果您正在绘制使用CAShapeLayer的形状,不知道它的边缘看起来有点锯齿在视网膜显示设备,尝试:

shapeLayer.rasterizationScale = [UIScreen mainScreen].scale; 
shapeLayer.shouldRasterize = YES;