2013-12-08 12 views
5

現在のコードをマスクサイズの:マスクは任意にサイズ変更可能なUIImageとUIImageViewは

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は、サイズ変更キャップのインセット(BubbleRightCapInsets)が設定されていても、self.backgroundImageViewに合うように正しくサイズ変更されません。

オリジナル画像:

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

Dude。ありがとうございました!!! – Mahouk

+0

BubbleRightCapInsetsの値は何ですか?私はこのUIEdgeInsetsを使用しています。BubbleRightCapInsets = UIEdgeInsetsMake(15.0f、20.0f、15.0f、20.0f); –

+0

@MANCHIKANTIKRISHNAKISHORE私はそれ以来、アプリケーションを再設計し、インセットを覚えていません。あなたは、矢印を説明するために、そしておそらくは「ボトム」のために、正しい値を使うべきです。 – duci9y

0

私は(の一部)と同じ問題を抱えていた - ピクセル化層の内容、すなわち、 。私にとっては、CALayerのcontentsScale値を設定することで解決しました。何らかの理由で、CALayersのデフォルトのスケールは、Retinaデバイスでも常に1.0です。また

layer.contentsScale = [UIScreen mainScreen].scale; 

すなわち

、あなたがCAShapeLayerを使用して図形を描画し、その辺を迷っている場合は、網膜デバイス上で少しギザギザに、試してみてください。

shapeLayer.rasterizationScale = [UIScreen mainScreen].scale; 
shapeLayer.shouldRasterize = YES; 
関連する問題