UIView avec des coins arrondis et de l'ombre portée?
Je veux une coutume UIView
... : je voulais juste un vide blanc vue avec des coins arrondis et un peu de l'ombre portée (sans éclairage). Je peux le faire chacun de ces points un par un, mais l'habitude clipToBounds
/maskToBounds
les conflits se produisent.
- Puisque vous dites dans un commentaire ci-dessous que vous avez obtenu ce travail à l'aide de CoreGraphics, auriez-vous l'esprit de partage de la réponse avec la communauté, de sorte que vous pouvez aider d'autres personnes dans la même situation, comme ils ont essayé de vous aider?
- Je suis désolé, c'était il y a très longtemps, et je n'ai pas la source de plus. Ce que j'ai fait a été de remplacer -drawRect: et utiliser UIBezierPath pour dessiner un rectangle, et d'appliquer une ombre à la couche la sauvegarde de la vue... si je me souviens bien. 🙂
- La accepté de répondre ne fonctionne pas!
- Swift 3 & IBInspectable solution. 😉 stackoverflow.com/a/43958505/3052059
- Double Possible de Donner UIView coins arrondis
- Vous devriez vérifier les dates des deux postes avant de commenter.
- C'est une façon Comment le faire. stackoverflow.com/a/45570428/3532177
Vous devez vous connecter pour publier un commentaire.
L'extrait de code suivant ajoute une frontière de, frontière de rayon, et de l'ombre portée à
v
, unUIView
:Vous pouvez ajuster les paramètres pour répondre à vos besoins.
Également, ajouter le QuartzCore cadre de votre projet et:
Voir mon autre réponse concernant
masksToBounds
.Note
Cela peut ne pas fonctionner dans tous les cas. Si vous trouvez que cette méthode interfère avec d'autres opérations de dessin que vous effectuez, veuillez consulter cette réponse.
Swift
Explorer les options
Problème 1: Ombre devient coupée
Ce que si il y a des sous-couches ou des sous-vues (comme une image), dont le contenu que nous voulons clip les limites de notre point de vue?
Nous pouvons accomplir cela avec
(Sinon,
blueView.clipsToBounds = true
donne la même résultat.)Mais, oh non! L'ombre a également été coupée parce que c'est en dehors des limites! Que faire? Que faire?
Solution
Utiliser des vues séparées pour l'ombre et de la frontière. L'affichage de base est transparente et a l'ombre. La frontière clips de la vue de toute autre subcontent qu'il a à ses frontières.
Cela donne le résultat suivant:
Problème 2: la Mauvaise performance
Ajouter des coins arrondis et des ombres peut être un gain de performance. Vous pouvez améliorer les performances en utilisant un chemin prédéfini pour l'ombre et de préciser qu'il tramage. Le code suivant peut être ajouté à l'exemple ci-dessus.
Voir ce post pour plus de détails. Voir ici et ici aussi.
Cette réponse a été testé avec Swift Xcode 4 et 9.
baseView.backgroundColor = UIColor.clear
supprime l'ombre. Uniquement si vous définissez une couleur d'arrière-plan va vous voir.layoutIfNeeded()
peut être nécessaire avant de dessiner l'ombre chemin.Une façon de le faire est de mettre plein la vue avec des coins arrondis en vue avec l'ombre portée.
Vous pouvez ensuite ajouter les shadowView où vous le souhaitez.
Simple Swift 4 solution basée sur Ade la réponse de sans les sous-vues, le sous-classement ou extra tripoter:
Noter que vous devez mettre en place votre point de vue avec le rayon de l'angle et d'autres propriétés avant appel
addShadow
.L'appel directement à partir de
viewDidLoad
comme ceci:Résultat Final:
Super facile et simple!
EDIT:
Je vois beaucoup de gens avoir quelques problèmes avec cet exemple, j'ai donc créé un simple projet Xcode pour illustrer comment il doit être utilisé.
layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath
. Ne peux pas expliquer pourquoi mais, quelqu'un a une explication pour ça?Cela a fonctionné pour moi. Astuce était de déplacer la couleur d'arrière-plan à partir de la vue principale de la couche.
UIView extension
ici - stackoverflow.com/a/43295741/1313939 merci pour l'inspiration!layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:layer.bounds cornerRadius:layer.cornerRadius] CGPath];
. Aucune idée pourquoi?J'ai résolu le problème en utilisant l'astuce suivante lors de l'attribution de l'ombre chemin d'accès pour le conteneur de vue :
Notez que le chemin d'accès donné à l'ombre est un rectangle arrondi avec le même rayon que le fond de la cellule contient:
Si vous êtes en difficulté en raison de l'arrondi
corners
vssubviews
vsmasksToBounds
, puis essayez d'utiliser ma fonction:appeler votre point de vue. si votre point de vue a des coins arrondis, peu importe sa taille, sa forme - une jolie ombre sera établi.
Il suffit de garder la valeur de retour de la fonction, donc vous pouvez vous y reporter lorsque vous souhaitez supprimer de la table (ou, par exemple, utiliser
insertSubview:aboveView:
)shadow.userInteractionEnabled = NO; // Modify this if needed
ligne? Si c'est le cas en cas de besoin.userInteractionEnabled
est une base populaire et de la propriété, vous devriez être déjà familier avec 🙂L'utilisation de Swift 4 et Xcode 9, c'est un exemple de travail de l'arrondissement un
ImageView
avec une ombre portée, et une frontière.Si vous voulez que l'image soit circulaire: (et le montre sans frontière)
J'ai créé un helper sur UIView
vous pouvez l'appeler comme cela
Voici la mise en œuvre
Après une journée de recherche de la tour d'angle avec de l'ombre, je suis heureux de les poster à mon habitude classe uiview ici, l'espoir de mettre fin à cette question:
RoundCornerShadowView.h
RoundCornerShadowView.m
donc, PAS besoin d'ajouter des sous-vue dans la vue ou ci-dessous dans la vue cible, il suffit d'ajouter une couche dans l'affichage en cours, et de faire en 3 étapes pour le réaliser!
jeter un oeil de près les commentaires dans le code, il est utile à la compréhension de la composante!
Vous devez utiliser
shadowView
etroundView
shadowView
roundView
shadowView
un peu à l'intérieur, et son ombre doit lueur. Ajuster lainsets
de sorte queshadowView
est complètement invisible derrièreroundView
roundView
Le code
Ou vous pouvez le faire ci-dessous, sans préciser
clipToBounds/maskToBounds
Swift 3 & IBInspectable solution:
Inspiré par Ade de la solution
Tout d'abord, créez une UIView extension:
Ensuite, il suffit de sélectionner votre UIView dans interface builder réglage ombre SUR et le rayon de l'angle, comme ci-dessous:
Le résultat!
Quelque chose swifty testé dans swift 4
Produit
Si vous l'activez dans l'Inspecteur comme ceci:
Il va ajouter l'Utilisateur Défini Exécution de l'Attribut, ce qui entraîne:
(J'ai ajouté précédemment la
cornerRadius = 8
)🙂
Ombre + Bordure + Rayon D'Angle
Voici ma version de Swift 3 pour une UIView
Swift 4 : Créer de la sous-classe UIView
À l'aide de ...
Eh bien, si vous ne voulez pas changer vos plumes et afficher la hiérarchie comme le suggère David C. cette méthode va le faire pour vous. Pour ajouter des coins arrondis et de l'ombre à vos UIImageView il suffit d'utiliser cette méthode, par exemple:
(!) Pour des raisons de performances, je ne pense pas que c'est une bonne idée pour utiliser ce code dans quelque chose comme UITableView, depuis cette modification de code afficher la hiérarchie. Donc, je suggère de changer votre plume et ajouter un conteneur view pour effet d'ombre et l'utilisation Davic C. code.
Vieux thread toujours d'actualité...
J'ai édité Daniel Gindi de la méthode pour le rendre possible de l'utiliser avec des boutons etc. ainsi.
Si quelqu'un a besoin de coins arrondis ou veut combiner les coins ronds et une frontière, il doit être réglée sur le point de vue de la couche, qui est passé à cette méthode. J'ai également défini le tramage de l'accélérer un peu.
Voici la solution pour masksToBounds conflit problème, ça fonctionne pour moi.
Après avoir défini la corderRadius/borderColor/ombre et ainsi de suite, ensemble masksToBounds que NON:
Le suivant qui a le mieux fonctionné pour moi
(ce code se trouve dans UIView extension, l'autonomie désigne un UIView à laquelle il faut ajouter une ombre et coins ronds)
La principale différence entre cela et d'autres exemples de code, c'est que cela rajoute de l'ombre vue comme un frère vue (contre l'ajout de la vue actuelle comme sous-vue de l'ombre de vue), ce qui élimine la nécessité de modifier l'opinion de la hiérarchie en aucune façon.
daniel.gindi la réponse ci-dessus a fait l'affaire pour moi! (+1 daniel) Cependant, j'ai dû faire des ajustements mineurs à changement de la shadowFrame taille de même que la vue de la taille de l'image, et de permettre une interaction de l'utilisateur. Voici le code mis à jour:
Je voudrais ajouter que dans mon cas, j'ai essayé de l'ajouter à une 3ème partie-vue-contrôleur, c'est à dire que je n'ai pas de contrôle direct sur le code. Donc, voici comment j'ai utilisé la fonction ci-dessus:
J'ai apporter quelques modifications au code de daniel.gindi
C'est tout ce que vous devez faire fonctionner.
Vous devez utiliser deux
UIViews
pour atteindre cet objectif. UnUIView
comme ombre, et de l'autre on va travailler pour des bords arrondis.Voici un extrait de code un
Class Method
avec l'aide d'unprotocol
:Dans le code ci-dessus
btnCompose_click:
deviendra un@required
délégué méthode qui permettra de feu sur le bouton cliquez sur.Et ici j'ai ajouté un bouton à mon
UIViewController
comme ceci:Le résultat ressemblera à ceci:
J'ai essayé beaucoup de solutions à partir de ce poste et s'est terminé par le dessous de la solution. C'est preuve complète solution sauf si vous avez besoin d'ombre portée sur une couleur claire vue.
La réponse fournie par Evan Mulawski fonctionnera parfaitement. Le hic, c'est que vous devez définir la couleur d'arrière-plan de la vue de clearColor et la masksToBounds propriété.
Vous pouvez définir quelle que soit la couleur que vous voulez pour la vue, la définir comme
Espère que cela aide..
C'est comment vous le faites, avec des coins arrondis et arrondis, ombres, sans se soucier des chemins.
Le point de vue du contenu, dans mon cas, une UIImageView, a un rayon d'angle et donc masque de limites.
Nous en créer un autre, de même taille en vue pour les ombres, ensemble de maskToBounds PAS, puis ajouter l'affichage du contenu au contenant (par exemple, shadowContainer).
J'écris ce UIView catégorie méthode pour résoudre ce problème, utilise des vues distinctes pour l'ombre et le rayon de l'angle.
Vous avez besoin d'ajouter
masksToBounds = true
pour les combinés entrecorderRadius
shadowRadius
.Swift 4 Solution pour UICollectionViewCell ronde et l'ajout de Ombres, sans les extensions et les complications 🙂
Remarque: Pour de simples vues de l'e.g Boutons. Voir le @suragch de Réponse dans ce post.
https://stackoverflow.com/a/34984063/7698092. Testé avec succès pour les boutons
Dans le cas où si un encore mal à ronde les coins et ajouter ombres en même temps. Bien que cette solution fonctionne avec UICollectionViewCell, il peut être généralisée à tout point de vue.
Cette technique a fonctionné pour moi sans prise de toutes les extensions et tous les trucs compliqués. Je suis en train de travailler avec la table de montage séquentiel.
Technique
Vous devez ajouter une UIView (permet de dire "containerView") à l'intérieur de votre UICollectionViewCell dans le storyBoard et ajoutez tous les points de vue (boutons, images, etc) à l'intérieur de ce containerView.
Voir la Capture d'écran.
Connecter la prise de containerView. Ajouter les lignes de code suivantes dans CellforItemAtIndexPath fonction de délégué.
Sortie
Voir la Capture d'écran du simulateur