J'ai une vue simple (côté gauche de l'image) et j'ai besoin de créer une sorte de superposition (côté droit de l'image) à cette vue. Cette superposition doit avoir une certaine opacité, de sorte que la vue ci-dessous est encore partiellement visible. Plus important encore, cette superposition doit avoir un trou circulaire au milieu afin qu'elle ne recouvre pas le centre de la vue (voir l'image ci-dessous).
Je peux facilement créer un cercle comme celui-ci:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
Et une superposition rectangulaire "complète" comme celle-ci:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Mais je ne sais pas comment combiner ces deux couches pour qu'elles créent l'effet que je veux. N'importe qui? J'ai vraiment tout essayé ... Merci beaucoup pour votre aide!
ios
objective-c
calayer
quartz-core
animal_chin
la source
la source
moveToPoint
puis ajoutez le rect arrondi. Consultez la documentation pour les méthodes proposées parUIBezierPath
.Réponses:
J'ai pu résoudre ce problème avec la suggestion de Jon Steinmetz. Si quelqu'un s'en soucie, voici la solution finale:
Swift 3.x:
Swift 4.2 et 5:
la source
Pour créer cet effet, j'ai trouvé qu'il était plus facile de créer une vue entière superposant l'écran, puis de soustraire des parties de l'écran à l'aide de calques et d'UIBezierPaths. Pour une implémentation Swift:
J'ai testé le code ci-dessus, et voici le résultat:
J'ai ajouté une bibliothèque à CocoaPods qui résume une grande partie du code ci-dessus et vous permet de créer facilement des superpositions avec des trous rectangulaires / circulaires, permettant à l'utilisateur d'interagir avec les vues derrière la superposition. Je l'ai utilisé pour créer ce tutoriel pour l'une de nos applications:
La bibliothèque s'appelle TAOverlayView et est open source sous Apache 2.0. J'espère que tu trouves cela utile!
la source
Solution acceptée Compatible Swift 3.0
la source
J'ai adopté une approche similaire à animal_chin, mais je suis plus visuel, donc j'ai mis la plupart d'entre eux dans Interface Builder en utilisant des prises et une mise en page automatique.
Voici ma solution dans Swift
la source
Compatible Code Swift 2.0
À partir de la réponse @animal_inch, je code une petite classe utilitaire, j'espère qu'elle appréciera:
Ensuite, n'importe où dans votre code:
la source