2013-12-08 107 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;