Je veux une personnalisation UIView
...: je voulais juste une vue blanche vierge avec des coins arrondis et une ombre légère (sans effet d'éclairage). Je peux faire chacun de ceux-ci un par un mais les habituels clipToBounds
/ maskToBounds
conflits se produisent.
iphone
ios
cocoa-touch
uiview
rounded-corners
Aditya Vaidyam
la source
la source
Réponses:
L'extrait de code suivant ajoute une bordure, un rayon de bordure et une ombre portée à
v
, aUIView
:Vous pouvez ajuster les paramètres en fonction de vos besoins.
Ajoutez également le framework QuartzCore à votre projet et:
Voir mon autre réponse concernant
masksToBounds
.Remarque
Cela peut ne pas fonctionner dans tous les cas. Si vous constatez que cette méthode interfère avec d'autres opérations de dessin que vous effectuez, consultez cette réponse .
la source
Rapide
Explorer les options
Problème 1: l'ombre est coupée
Et s'il y a des sous-couches ou des sous-vues (comme une image) dont nous voulons couper le contenu aux limites de notre vue?
Nous pouvons accomplir cela avec
(Alternativement,
blueView.clipsToBounds = true
donne le même résultat .)Mais, oh non! L'ombre a également été coupée car elle est en dehors des limites! Que faire? Que faire?
Solution
Utilisez des vues distinctes pour l'ombre et la bordure. La vue de base est transparente et présente l'ombre. La vue de bordure découpe tout autre sous-contenu dont elle dispose sur ses bordures.
Cela donne le résultat suivant:
Problème 2: performances médiocres
Ajouter des coins arrondis et des ombres peut être un succès. Vous pouvez améliorer les performances en utilisant un chemin prédéfini pour l'ombre et en spécifiant également qu'il doit être pixellisé. Le code suivant peut être ajouté à l'exemple ci-dessus.
Voir cet article pour plus de détails. Voir ici et ici aussi.
Cette réponse a été testée avec Swift 4 et Xcode 9.
la source
baseView.backgroundColor = UIColor.clear
supprime l'ombre. Ce n'est que si vous définissez une couleur d'arrière-plan que vous la verrez.Une façon de procéder consiste à placer la vue avec des coins arrondis dans une vue avec l'ombre portée.
Ensuite, vous pouvez ajouter le shadowView où vous le souhaitez.
la source
Consultez l' exemple de projet sur GitHub pour vous assurer que vous utilisez correctement le composant.
Solution Swift 5 simple sans sous-vues ni sous-classes supplémentaires:
Notez que vous devez configurer votre vue avec un rayon d'angle et d'autres propriétés avant d'appeler
addShadow
.Après cela, il suffit d'appeler
viewDidLoad
comme ceci:Résultat final:
Super facile et simple!
la source
layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath
. Je ne peux pas expliquer pourquoi cependant, quelqu'un a-t-il une explication à cela?Cela a fonctionné pour moi. L'astuce consistait à déplacer la couleur d'arrière-plan de la vue principale vers le calque.
la source
UIView extension
ici - stackoverflow.com/a/43295741/1313939 merci pour l'inspiration!J'ai résolu le problème en utilisant l'astuce suivante lors de l'attribution du chemin d'ombre pour la vue du conteneur:
Notez que le chemin donné à l'ombre est un rectangle arrondi avec le même rayon de coin que l'arrière-plan que contient la cellule:
la source
Si vous rencontrez des difficultés à cause de l'arrondi
corners
vssubviews
vsmasksToBounds
, essayez d'utiliser ma fonction:appelez-le sur votre vue. si votre vue a des coins arrondis, peu importe sa taille, sa forme - une belle ombre sera dessinée.
Conservez simplement la valeur de retour de la fonction afin de pouvoir vous y référer lorsque vous souhaitez supprimer la table (ou par exemple l'utiliser
insertSubview:aboveView:
)la source
shadow.userInteractionEnabled = NO; // Modify this if needed
ligne? C'est donc le cas là où c'est nécessaire.userInteractionEnabled
est une propriété basique et populaire que vous devriez déjà connaître :-)En utilisant Swift 4 et Xcode 9 , ceci est un exemple de travail d'arrondi
ImageView
avec une ombre portée et une bordure.Si vous voulez que l'image soit circulaire: (et montrée sans bordure)
la source
J'ai créé un assistant sur UIView
vous pouvez l'appeler comme ça
Voici l'implémentation
la source
Après une journée entière de recherche sur la vue du coin arrondi avec l'ombre, je suis heureux de poster mon cours uiview personnalisé ici, j'espère terminer cette question:
RoundCornerShadowView.h
RoundCornerShadowView.m
donc, PAS besoin d'ajouter de sous-vue dans la vue ou ci-dessous dans la vue cible, ajoutez simplement une couche dans la vue actuelle et faites 3 étapes pour la terminer!
regardez attentivement les commentaires dans le code, il est utile de comprendre le composant!
la source
Quelque chose de swifty testé dans swift 4
Produit
Si vous l'activez dans l'inspecteur comme ceci:
Il ajoutera l'attribut d'exécution défini par l'utilisateur, résultant en:
(J'ai ajouté précédemment le
cornerRadius = 8
):)
la source
Vous devez utiliser use
shadowView
etroundView
shadowView
roundView
shadowView
un peu à l'intérieur, et son ombre doit briller. Ajustez leinsets
pour qu'ilshadowView
soit complètement invisible derrièreroundView
roundView
Le code
Ou vous pouvez simplement faire ci-dessous sans préciser
clipToBounds/maskToBounds
la source
Swift 3 & IBInspectable solution:
Inspiré par la solution d'Ade
Créez d'abord une extension UIView:
Ensuite, sélectionnez simplement votre UIView dans le générateur d'interface en définissant l' ombre et le rayon d'angle , comme ci-dessous:
Le résultat!
la source
Voici la solution au problème de conflit masksToBounds, cela fonctionne pour moi.
Après avoir défini corderRadius / borderColor / shadow et ainsi de suite, définissez masksToBounds sur NO:
la source
Ombre + bordure + rayon d'angle
la source
Voici ma version dans Swift 3 pour une UIView
la source
Swift 4: créer une sous-classe d'UIView
En utilisant..
la source
Eh bien, si vous ne voulez pas changer vos nibs et afficher la hiérarchie comme l'a suggéré David C., cette méthode le fera pour vous. Pour ajouter des coins arrondis et des ombres à votre UIImageView, utilisez simplement cette méthode, par exemple:
(!) Pour des raisons de performances, je ne pense pas que ce soit une bonne idée d'utiliser ce code dans quelque chose comme UITableView, car ce code change la hiérarchie des vues. Je proposerai donc de changer votre plume et d'ajouter une vue de conteneur pour l'effet d'ombre et d'utiliser le code Davic C..
la source
Ancien fil toujours actuel ...
J'ai édité la méthode de Daniel Gindi pour pouvoir l'utiliser également avec des boutons etc. Si quelqu'un a besoin de coins arrondis ou souhaite combiner des coins arrondis et une bordure, il doit être défini sur le calque de la vue qui est transmis à cette méthode. J'ai également réglé la pixellisation pour l'accélérer un peu.
la source
Ce qui a fonctionné le mieux pour moi (ce code réside dans l'extension UIView, donc self dénote une certaine UIView à laquelle nous devons ajouter une ombre et un coin rond)
La principale différence entre cet exemple et d'autres exemples de code est que cela ajoute la vue d'ombre en tant que vue sœur (par opposition à l'ajout de la vue actuelle en tant que sous-vue de la vue d'ombre), éliminant ainsi la nécessité de modifier la hiérarchie de vue existante de quelque manière que ce soit.
la source
La réponse de daniel.gindi ci-dessus a fait l'affaire pour moi! (+1 daniel) Cependant, j'ai dû faire des ajustements mineurs - changer la taille de shadowFrame pour qu'elle soit identique à la taille du cadre de la vue et permettre l'interaction avec l'utilisateur. Voici le code mis à jour:
Je voudrais ajouter que dans mon cas, j'essayais d'ajouter ceci à un contrôleur de vue tiers, c'est-à-dire que je n'avais pas de contrôle direct sur le code. Alors, voici comment j'ai utilisé la fonction ci-dessus:
la source
J'apporte quelques modifications au code de daniel.gindi
C'est tout ce dont vous avez besoin pour le faire fonctionner.
la source
Vous devez en utiliser deux
UIViews
pour y parvenir. L'unUIView
fonctionnera comme l'ombre et l'autre fonctionnera pour une bordure arrondie.Voici un extrait de code a
Class Method
avec l'aide de aprotocol
:Dans le code ci
btnCompose_click:
- dessus deviendra une@required
méthode déléguée qui se déclenchera sur le clic du bouton.Et ici, j'ai ajouté un bouton à mon
UIViewController
comme ceci:Le résultat ressemblera à ceci:
la source
J'ai essayé tant de solutions de ce post et je me suis retrouvé avec la solution ci-dessous. Il s'agit d' une solution à l' épreuve complète, sauf si vous devez déposer une ombre sur une vue en couleur claire .
la source
Voici la solution qui fonctionnera à coup sûr!
J'ai créé l'extension UIView avec les bords requis pour appliquer l'ombre comme ci-dessous
Enfin, vous pouvez appeler la fonction shadow comme ci-dessous pour n'importe laquelle de votre sous-classe UIView, vous pouvez également spécifier le bord sur lequel appliquer l'ombre, essayez différentes variantes selon vos besoins en modifiant les paramètres de l'appel de méthode ci-dessous.
Image de résultat
la source
La réponse fournie par Evan Mulawski fonctionnera parfaitement. Le hic est que vous devez définir la couleur d'arrière-plan de la vue sur clearColor et la propriété masksToBounds sur NO.
Vous pouvez définir la couleur de votre choix pour la vue, la définir comme
J'espère que cela t'aides..
la source
Voici comment vous le faites, avec des coins arrondis et des ombres arrondies sans vous soucier des chemins.
La vue avec contenu, dans mon cas une UIImageView, a un rayon d'angle et doit donc masquer les limites.
Nous créons une autre vue de taille égale pour les ombres, définissons son maskToBounds sur NO, puis ajoutons la vue de contenu à la vue du conteneur (par exemple shadowContainer).
la source
J'écris cette méthode de catégorie UIView pour résoudre ce problème, utilise des vues distinctes pour l'ombre et le rayon d'angle.
la source
Swift 4 Solution pour rendre UICollectionViewCell ronde et ajouter des ombres , sans extensions ni complications :)
Remarque: pour les vues simples, par exemple les boutons. Voir la réponse de @ suragch dans cet article. https://stackoverflow.com/a/34984063/7698092 . Testé avec succès pour les boutons
Au cas où quelqu'un aurait encore du mal à contourner les coins et à ajouter des ombres en même temps. Bien que cette solution fonctionne avec UICollectionViewCell, elle peut être généralisée à n'importe quelle vue.
Cette technique a fonctionné pour moi sans faire d'extensions et toutes les choses compliquées. Je travaille avec storyBoard.
Technique
Vous devez ajouter une UIView (disons "containerView") à l'intérieur de votre UICollectionViewCell dans storyBoard et ajouter toutes les vues requises (boutons, images, etc.) à l'intérieur de cette containerView. Voir la capture d'écran.
Connectez la sortie pour containerView. Ajoutez les lignes de code suivantes dans la fonction déléguée CellforItemAtIndexPath.
Production
Voir la capture d'écran du simulateur
la source
la source