10

UIImageViewに円形マスクを追加したいと思います。マスクを追加するために使用している関数は次のとおりです。

- (void) addMaskToBounds:(CGRect) maskBounds
{
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];

    CGPathRef maskPath = CGPathCreateWithEllipseInRect(maskBounds, NULL);
    maskLayer.bounds = maskBounds;
    [maskLayer setPath:maskPath];
    [maskLayer setFillColor:[[UIColor blackColor] CGColor]];
    maskLayer.position = CGPointMake(maskBounds.size.width/2, maskBounds.size.height/2);

    [self.imageView.layer setMask:maskLayer];
}

マスクを追加することはできますが、それに伴って画像フレームと中心を変更しているため、問題が発生します。ユーザーの操作に応じて画像が拡大・縮小されます。したがって、マスクを小さいときと拡大するときに2回追加する必要があります。そのため、フレームの変化をアニメートしているため、アニメート中に画像が歪んだり、ずれたりします。どうすればこれを克服できますか?

サンプルプロジェクトで最もよく説明されていると思います。ここで、GitHub でデモ プロジェクトhttps://github.com/akshaynhegde/MaskImageを作成しました。それを実行して問題を確認し、問題の解決方法を教えてください。

4

2 に答える 2

22

これが役立つことを願っています

    CAShapeLayer *circle = [CAShapeLayer layer];
    // Make a circular shape
    UIBezierPath *circularPath=[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, _imgView.frame.size.width, _imgView.frame.size.height) cornerRadius:MAX(_imgView.frame.size.width, _imgView.frame.size.height)];

    circle.path = circularPath.CGPath;

    // Configure the apperence of the circle
    circle.fillColor = [UIColor blackColor].CGColor;
    circle.strokeColor = [UIColor blackColor].CGColor;
    circle.lineWidth = 0;

    imgViewToClipCircular.layer.mask=circle;
于 2014-06-16T12:04:28.057 に答える
4

私の場合は中心が変わるので、マスクを使用しても効果はありません。したがって、簡単でクリーンな方法は、カスタム UiImageView を用意して描画パスをクリップすることです。

そのためには、その中に画像をサブクラス化UIViewして描画し、パスをクリップします。これがオーバーライドされたdrawRect関数です。

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(context, self.bounds);
    CGContextClip(context);
    //The subclass of UIView has a UIImageview as property
    [_image drawInRect:rect];    
}

drawRect参考までに、UIImageView 自体をサブクラス化してオーバーライドすることはできませんdrawRect

UIImageView クラスは、その画像をディスプレイに描画するように最適化されています。UIImageView は drawRect: サブクラスを呼び出しません。サブクラスにカスタム描画コードが必要な場合は、UIView を基本クラスとして使用することをお勧めします。

于 2013-03-15T04:15:32.110 に答える