Как добавить круговую маску в UIImageview и изменить кадр и центры при этом?

Я хотел бы добавить круговую маску к 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];
}

Могу добавить маску, но проблема возникает, так как я меняю рамку изображения и центрирую вместе с ней. Изображение увеличено и уменьшено на основе действий пользователя. Поэтому мне пришлось бы добавить маску дважды, когда она была маленькой и увеличивалась. Итак, когда я оживляю изменение рамки, а анимация изображения искажается или смещается. Как я могу это преодолеть?

Я думаю, его лучше всего объяснить с помощью примерного проекта. Здесь я создал демо-проект https://github.com/akshaynhegde/MaskImage на GitHub, просто запустил его, чтобы увидеть мою проблему, и дайте мне знать, как решить проблему.

Ответ 1

Надеюсь, это поможет

    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;

Ответ 2

Итак, так как центр в моем случае меняется, использование маски не помогает. Таким образом, простой и понятный способ - создать пользовательский интерфейс 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];    
}

FYI, вы не можете подклассифицировать сам UIImageView и переопределить drawRect, потому что он не будет вызывать drawRect,

Класс UIImageView оптимизирован для рисования его изображений на дисплее. UIImageView не будет вызывать drawRect: подкласс. Если ваш подкласс необходим пользовательский код чертежа, рекомендуется использовать UIView в качестве базы класс.