2013-03-09 12 views
10

Vorrei aggiungere una maschera circolare a UIImageVIew. Ecco la funzione che sto usando per aggiungere la maschera ..Come aggiungere una maschera circolare a una UIImageview e cambiare cornice e centro mentre si fa?

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

sono in grado di aggiungere la maschera, ma il problema si verifica in quanto sto cambiando la cornice dell'immagine e al centro con esso. L'immagine viene ingrandita e resa piccola in base alle azioni dell'utente. Quindi dovrei aggiungere la maschera due volte quando è piccola e ingrandita. Quindi, dal momento che sto animando il cambio di cornice, mentre l'animazione dell'immagine risulta distorta o spostata. Come posso superare questo?

Immagino sia spiegato meglio con un progetto di esempio. Qui ho creato un progetto demo https://github.com/akshaynhegde/MaskImage su GitHub, basta eseguirlo per vedere il mio problema e fammi sapere come risolvere il problema.

+0

Questo è stato chiesto prima: http://stackoverflow.com/questions/12564336/animation-of-masked-uiview-calayer –

risposta

4

Ok, quindi visto che il centro nel mio caso cambia, usare la maschera non è di aiuto. Quindi il modo semplice e pulito è avere un UiImageView personalizzato e ritagliare il percorso di disegno.

Quindi, per questo, sottoclasse UIView e disegna l'immagine al suo interno e ritaglia il percorso. Qui è il sovresposta la funzione di 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, non si può sottoclasse UIImageView stesso e ignorare drawRect, coz non chiamerà il drawRect,

La classe UIImageView è ottimizzato per disegnare la sua immagini al display. UIImageView non chiamerà drawRect: una sottoclasse. Se la sottoclasse necessita del codice di disegno personalizzato , si consiglia di utilizzare UIView come classe base .

+0

La soluzione UIImageView personalizzato era quello Stavo usando in precedenza, quindi questa soluzione ha funzionato era appropriato per me. Sembra anche più vicino a ciò che fa iOS 7 – CVertex

+1

Puoi anche cambiare il centro del livello maschera. – Mrug

+0

Nota che il tuo commento non è del tutto corretto - questa sottoclasse di UIView deve avere una * UIImmagine * come una proprietà, non un * UIImageView * – RobP

21

Spero che questo vi aiuterà

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; 
+0

Questo non risolve la domanda iniziale su come animare le modifiche dei frame a 'UIImageView' quando usando una maschera ... – Sam

+0

Ho trovato questo codice molto utile perché avevo bisogno di una maschera circolare decentrata per una vista che stavo creando. Per prima cosa ho usato layer.cornerRadius per rendere circolare la vista in Interface Builder. Quindi ho usato questo codice con un valore Y negativo nel percorso di Bezier per creare una maschera per esso. La forma risultante assomiglia molto ad un football americano, che è ciò di cui avevo bisogno. –

Problemi correlati