¿Cómo agregar una máscara circular a una UIImageview y cambiar el marco y los centros mientras lo hace?

Me gustaría agregar una máscara circular a UIImageVIew. Aquí está la function que estoy usando para agregar la máscara ..

- (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]; } 

Puedo agregar la máscara pero el problema ocurre porque estoy cambiando el marco de la image y lo centro con él. La image se amplía y se hace pequeña en function de las acciones del usuario. Por lo tanto, tendría que agregar la máscara dos veces cuando sea pequeña y cuando esté ampliada. Entonces, como estoy animando el cambio de marco, mientras que la animation se distorsiona o se desplaza. ¿Cómo puedo superar esto?

Supongo que se explica mejor con un proyecto de ejemplo. Aquí he creado un proyecto Demo https://github.com/akshaynhegde/MaskImage en GitHub, solo ejecútelo para ver mi problema y díganme cómo resolver el problema.

Espero que esto te ayude

  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; 

Ok, así que ya que el centro en mi caso cambia, usar la máscara no sirve para ayudar. Entonces, la manera fácil y limpia es tener una UiImageView personalizada y recortar la ruta de acceso.

Entonces, para eso, subclass UIView y dibuja la image dentro de ella y UIView la ruta. Aquí se anula la function 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]; } 

Para su información, no puede subclass UIImageView en sí mismo y anular drawRect , porque no llamará a drawRect ,

La class UIImageView está optimizada para dibujar sus imágenes en la pantalla. UIImageView no llamará a drawRect: una subclass. Si su subclass necesita un código de dibujo personalizado, se recomienda utilizar UIView como class base.