4

レイヤーのマスクプロパティを使用して、UIViewを画像にマスクしようとしています。「とても簡単」という例は数え切れないほどあります。しかし、かなりの調整を行った後、説明した結果を再現できないようです。レイヤーマスクを設定すると、ビューが消えるだけです。これが私が使用しているコードです:

- (void)setMaskImage:(UIImage *)maskImage
{
    _maskImage = maskImage;

    self.layer.mask.contents = (__bridge id)(_maskImage.CGImage);
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self != nil) {
        self.layer.mask = [CALayer layer];
    }

    return self;
}

- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    self.layer.mask.frame = self.layer.bounds;
}

そして、これが私がビューをマスクするために使用しようとしている画像です:http: //cl.ly/0a300G2r133V

4

3 に答える 3

6

1つの可能性は、システムが実際にsetFrame:ビューのジオメトリの設定に使用していないことです。使用できsetCenter:ますsetBounds:。もう1つの可能性は、システムがビューのジオメトリをまったく設定しておらず[super initWithFrame:frame]、マスクレイヤーを追加する前に、呼び出しで一度だけ設定されていることです。

とにかく、オーバーライドする代わりに、オーバーライドsetFrame:する必要がありますlayoutSubviews

- (void)layoutSubviews {
    [super layoutSubviews];
    self.layer.mask.frame = self.bounds;
}
于 2012-10-23T03:55:50.617 に答える
1

以下は期待どおりに機能します。

- (void)setMaskImage:(UIImage *)maskImage
{
    if (_maskView == nil) {
        _maskView = [[UIImageView alloc] initWithImage:maskImage];
        _maskView.frame = self.bounds;
        self.layer.mask = _maskView.layer;
    } else {
        _maskView.image = maskImage;
    }
}

- (UIImage *)maskImage
{
    return _maskView.image;
}

- (void)setBounds:(CGRect)bounds
{
    [super setBounds:bounds];

    _maskView.frame = self.bounds;
}

プレーンなCALayerを使用しただけでは機能しなかった理由はわかりませんが、これにより、ストレッチ可能な画像でうまく機能するというボーナスが追加されます。

于 2012-10-23T16:23:28.603 に答える
0

UIView drawRect()メソッドをオーバーライドして、画面にカスタム表示することができます。次のアプローチを使用してみてください。

//code for drawRect()

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextAddRect(context,ImageFrame);
CGContextClip(context);
CGContextClearRect(context,ImageFrame);
[super drawRect:rect];

それはあなたのimageFrame領域であなたのビューを透明にします。

于 2012-10-23T04:36:29.253 に答える