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 ensuitesetNeedsDisplay
sur leView
. À l'intérieur de la Vue dudrawRect
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire facilement en réglant votre vue de la couche de masque à un
CAShapeLayer
.Vous aurez besoin d'ajouter les
QuartzCore
cadre de votre cible si vous ne l'avez pas déjà.Dans Swift ...
layer.mask
n'. Vous avez un autre problème. Vous avez besoin de poster votre question si vous avez besoin d'aide au débogage.Juste un exemple de Rob solution, il y a un
UIWebView
assis comme un sous-vue d'unUIView
appelésmoothView
.smoothView
utilisebezierPathWithRoundedRect
pour faire un arrondi fond gris (avis sur la droite). Cela fonctionne bien.Mais si
smoothView
a fait normal clip-sous-vues, vous obtenez ceci:Si vous faites ce que Rob dit, vous obtenez les coins arrondis en
smoothView
et tous les sous-vues ...De grandes choses.