L'application d'un CAShapeLayer masque à une UIView
Je suis en utilisant ce code à appliquer une couche d'une UIview:
mask = [[CAShapeLayer alloc] init];
mask.frame = baseView.layer.bounds;
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height);
CGRect smallerRect = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
UIBezierPath *maskPath = [UIBezierPath bezierPath];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
mask.path = maskPath.CGPath;
[mask setFillRule:kCAFillRuleEvenOdd];
mask.fillColor = [[UIColor blackColor] CGColor];
baseView.layer.mask = mask;
Depuis le rectangle je veux couper les changements, j'ai été wonderning si il y avait un moyen rapide de modifier la taille du masque au lieu de simplement le supprimer de la UIview et ré-appliquer avec différentes dimensions:
par exemple
[mask removeFromSuperlayer];
et...
mask = [[CAShapeLayer alloc] init];
mask.frame = baseView.layer.bounds;
CGRect biggerRect = CGRectMake(mask.frame.origin.x, mask.frame.origin.y, mask.frame.size.width, mask.frame.size.height);
CGRect smallerRect = CGRectMake(0.0f, 100.0f, 200.0f, 200.0f);
UIBezierPath *maskPath = [UIBezierPath bezierPath];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMaxY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(biggerRect), CGRectGetMinY(biggerRect))];
[maskPath moveToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMaxY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMaxX(smallerRect), CGRectGetMinY(smallerRect))];
[maskPath addLineToPoint:CGPointMake(CGRectGetMinX(smallerRect), CGRectGetMinY(smallerRect))];
mask.path = maskPath.CGPath;
[mask setFillRule:kCAFillRuleEvenOdd];
mask.fillColor = [[UIColor blackColor] CGColor];
baseView.layer.mask = mask;
OriginalL'auteur Alessandro | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
Si vous vous demandez si vous pouvez remodeler le masque sans avoir à tracer le chemin à chaque fois, malheureusement pas. Vous pouvez garder la forme du masque de la même et effectuer des transformations sur le masque de réglage de la transformer propriété de la
CAShapeLayer
mais si vous avez besoin du masque de prendre une forme différente, vous allez avoir à dessiner cette forme par la création d'un nouveau chemin d'accès. MAIS il n'est pas nécessaire d'enlever le masque de laUIView
et de créer un tout nouveau chaque fois que vous avez besoin de cette forme de changement. Tout simplement le réglage de la chemin propriété de la CAShapeLayer alors qu'il est encore en masquant laUIView
est suffisante pour que les modifications prennent place:Sur une note de côté, êtes-vous conscient qu'au lieu de dessiner chaque rectangle manuellement, vous pouvez créer le masque de chemin d'accès en utilisant le code suivant:
Je pensais juste à point comme il peut être de commodité pour vous dans le futur.
Eh bien, le résultat est identique, mais d'autres que: moins de lignes de code + sans doute plus lisible/évidentes + utilise la monture C de l'API au lieu de 'poids lourd'
UIBezierPath
objet de sorte qu'il est probablement un tout petit peu plus performant. Il suffit de pointer les " AddRect fonctions pour des raisons de commodité dans l'avenir. En réalité, j'ai juste besoin de quelque chose pour accompagner les mauvaises nouvelles de ma réponse que voulez vous voulez faire n'est pas directement possible haha.OriginalL'auteur Elliott James Perry