Utilisation Tracé de Bézier comme un Masque d'Écrêtage

Je me demande si il est possible de couper une vue d'un Tracé de Bézier. Ce que je veux dire, c'est que je veux être en mesure de voir le point de vue que dans la région, dans le fermé Tracé de Bézier. La raison pour cela est que j'ai le contour d'une forme irrégulière, et je veux remplir la forme progressivement avec un solide de couleur de haut en bas. Si je pouvais faire en sorte que d'un certain point de vue n'est visible dans le chemin, alors je pourrais tout simplement de créer une UIView de la couleur que je veux et ensuite modifier la coordonnée y de son cadre, comme je s'il vous plaît, effectivement le remplissage de la forme. Si quelqu'un a des idées pour savoir comment mettre en œuvre ce qui serait grandement apprécié. Pour l'enregistrement, le remplissage de la forme correspondra à la valeur y de la utilisateurs du doigt, de sorte qu'il ne peut pas être une animation continue. Merci.

Mise à jour (un très long moment plus tard):

J'ai essayé votre réponse, Rob, et il fonctionne très bien sauf pour une chose. Mon intention était de déplacer la vue masquée alors que le masque reste à la même place sur l'écran. C'est ainsi que je peux donner l'impression d'un masque à être "rempli" par la vue. Le problème, c'est qu'avec le code que j'ai écrit d'après votre réponse, lorsque je déplace la vue du masque se déplace avec elle. Je comprends que c'est à prévoir, parce que je n'ai fait ajouter que le masque de la vue, de sorte qu'il tient pour raison pour laquelle il se déplacera si la chose qu'elle est liée se déplace. J'ai essayé d'ajouter le masque de la sous-couche de la superview de sorte qu'il reste en place, mais qui ont des résultats bizarres. Voici mon code:

self.test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
self.test.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.test];

UIBezierPath *myClippingPath = [UIBezierPath bezierPath];
[myClippingPath moveToPoint:CGPointMake(100, 100)];
[myClippingPath addCurveToPoint:CGPointMake(200, 200) controlPoint1:CGPointMake(self.screenWidth, 0) controlPoint2:CGPointMake(self.screenWidth, 50)];
[myClippingPath closePath];


CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = myClippingPath.CGPath;

self.test.layer.mask = mask;

CGRect firstFrame = self.test.frame;
firstFrame.origin.x += 100;
[UIView animateWithDuration:3 animations:^{
    self.test.frame = firstFrame;
}];

Merci pour l'aide déjà.

  • essayez de masquer la superview de self.test à la place. Le superlayer du masque va affecter les sous-couches et ne se déplacent avec la superlayer.
  • Au lieu de déplacer un point de vue. Je vous conseille de vous calculer une rect à l'aide de la Y coord de doigt de l'Utilisateur. Appelez ensuite setNeedsDisplay sur le View. À l'intérieur de la Vue du drawRect remplir le calcul de rectangle. Et pendant tout ce processus, il suffit de laisser le ci-dessus mentionné CAShapeLayer masque d'y être 🙂 🙂 (mais je vous suggère l'utilisation de la coupure des voies, pour une meilleure expérience d'apprentissage :)). cheers