J'essaie de dessiner une ombre sous le bord inférieur d'un UIView
Cocoa Touch. Je comprends que je devrais utiliser CGContextSetShadow()
pour dessiner l'ombre, mais le guide de programmation Quartz 2D est un peu vague:
- Enregistrez l'état graphique.
- Appelez la fonction
CGContextSetShadow
en passant les valeurs appropriées. - Effectuez tous les dessins auxquels vous souhaitez appliquer des ombres.
- Restaurer l'état graphique
J'ai essayé ce qui suit dans une UIView
sous - classe:
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
CGContextRestoreGState(currentContext);
[super drawRect: rect];
}
..mais cela ne fonctionne pas pour moi et je suis un peu coincé sur (a) où aller ensuite et (b) s'il y a quelque chose que je dois faire UIView
pour que ça marche?
la source
#import <QuartzCore/QuartzCore.h>"
au fichier .h.masksToBounds
deNO
annulerait lacornerRadius
, non?self.layer.backgroundColor = [[UIColor whiteColor] CGColor];
mais pas de chance. Quelle vue doit être transparente?Cela ralentira l'application. L'ajout de la ligne suivante peut améliorer les performances tant que votre vue est visiblement rectangulaire:
la source
Même solution, mais juste pour vous rappeler: vous pouvez définir l'ombre directement dans le storyboard.
Ex:
la source
UIView
ouCGLayer
qui est unUIColor
wrapper pour laCGColor
propriété;)Vous pouvez essayer ceci .... vous pouvez jouer avec les valeurs. Le
shadowRadius
dicte la quantité de flou.shadowOffset
dicte où va l'ombre.la source
Solution simple et propre utilisant Interface Builder
Ajoutez un fichier nommé UIView.swift dans votre projet (ou collez-le simplement dans n'importe quel fichier):
Ensuite, cela sera disponible dans Interface Builder pour chaque vue dans le panneau Utilitaires> Inspecteur d'attributs:
Vous pouvez facilement définir l'ombre maintenant.
Remarques:
- L'ombre n'apparaîtra pas dans IB, uniquement lors de l'exécution.
- Comme l'a dit Mazen Kasser
la source
Failed to set (shadowColor) user defined inspected property on (UICollectionViewCell): [<UICollectionViewCell> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key shadowColor.
UIKit
pour le faire fonctionner, l'Foundation
importation de base créée par XCode n'est pas suffisante, mais se compile très bien. J'aurais dû copier tout le code source. Merci Axel pour cette belle solution.Je l'utilise dans le cadre de mes utils. Avec cela, nous pouvons non seulement définir l'ombre, mais également obtenir un coin arrondi pour tout
UIView
. Vous pouvez également définir la couleur que vous préférez. Normalement, le noir est préféré, mais parfois, lorsque l'arrière-plan n'est pas blanc, vous voudrez peut-être autre chose. Voici ce que j'utilise -Pour l'utiliser, nous devons appeler cela -
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
la source
Swift 3
la source
installShadow()
n'est pas invoquée depuisviewDidLoad()
ouviewWillAppear()
draw
méthode de vue surchargée . L'ombre arrive correctement, mais pas les coins arrondis.UIStackView
qui ne fait que la mise en page et n'a pas de vue. Vous devrez peut-être insérer un régulierUIView
comme conteneur pour tout.Si vous souhaitez utiliser StoryBoard et ne souhaitez pas continuer à taper des attributs d'exécution, vous pouvez facilement créer une extension pour les vues et les rendre utilisables dans le storyboard.
Étape 1. créer une extension
étape 2. vous pouvez maintenant utiliser ces attributs dans le storyboard
la source
Pour ceux qui n'ont pas réussi à faire fonctionner cela (comme moi!) Après avoir essayé toutes les réponses ici, assurez-vous simplement que Clip Subviews n'est pas activé dans l'inspecteur des attributs ...
la source
Swift 3
la source
Vous pouvez utiliser ma fonction utilitaire créée pour l'ombre et le rayon d'angle comme ci-dessous:
J'espère que cela vous aidera !!!
la source
Tous Répondez bien mais je veux ajouter un point
Si vous rencontrez un problème lorsque vous avez des cellules de tableau, dequez une nouvelle cellule il y a un décalage dans l'ombre donc dans ce cas, vous devez placer votre code d'ombre dans une méthode layoutSubviews afin qu'il se comporte bien dans toutes les conditions.
ou dans ViewControllers pour une vue spécifique, placez du code fantôme à l'intérieur de la méthode suivante afin qu'il fonctionne bien
J'ai modifié mon implémentation shadow pour les nouveaux développeurs pour une forme plus généralisée ex:
la source
Pour les autres Xamariens, la version Xamarin.iOS / C # de la réponse ressemblerait à ceci:
La principale différence est que vous acquérez une instance
CGContext
sur laquelle vous appelez directement les méthodes appropriées.la source
Vous pouvez l'utiliser
Extension
pour ajouter une ombrevous pouvez l'appeler comme
la source
Esquisser l'ombre à l'aide d'IBDesignable et IBInspectable dans Swift 4
la source