Comment puis-je dessiner une ombre sous une UIView?
Je suis en train de dessiner une ombre sous le bord inférieur d'un UIView
en Cocoa Touch. Je comprends que je devrais utiliser CGContextSetShadow()
de tirer de l'ombre, mais le Quartz 2D guide de programmation est un peu vague:
- Enregistrer l'état graphique.
- Appeler la fonction
CGContextSetShadow
, passant les valeurs appropriées. - Effectuer le dessin auquel vous souhaitez appliquer des ombres.
- Restaurer l'état graphique
J'ai essayé le code suivant 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 une (des) où aller et (b) s'il y a quelque chose que je dois faire pour mon UIView
pour faire ce travail?
Vous devez vous connecter pour publier un commentaire.
Dans votre code, vous enregistrez le
GState
du contexte actuel, le configurer pour dessiner une ombre .. et de le restaurer à ce qu'il était avant que vous avez configuré pour dessiner une ombre. Puis, enfin, l'appel de la super-classe de mise en œuvre dedrawRect
: .Un dessin qui devrait être affectée par le paramètre ombre qui doit arriver après
mais avant
Donc, si vous voulez la superclasse,
drawRect:
être "enveloppé" dans l'ombre, alors que diriez-vous si vous réorganisez votre code comme celui-ci?Un de loin plus facile d'approche est de définir certains attributs de la couche de la vue sur l'initialisation:
Vous avez besoin d'importer QuartzCore.
#import <QuartzCore/QuartzCore.h>"
à l' .h fichier.masksToBounds
àNO
réduit à néant lacornerRadius
, non?self.layer.backgroundColor = [[UIColor whiteColor] CGColor];
mais pas de chance. La vue qui doit être transparent?QuartzCore
plus précisément, je viens de recevoir (ce que je pense est le résultat final souhaité) sans l'inclure, sauf si c'est un changement dans iOS 7, bien sûr.self.layer
utilisée pour exiger la QuartzCore inclure.CGSize(width: 0, height: 3)
.Cela va ralentir l'application.
L'ajout de la ligne suivante permet d'améliorer les performances, tant que votre vue est visiblement rectangulaire:
Même solution, mais juste pour vous rappeler: Vous pouvez définir l'ombre directement dans la table de montage séquentiel.
Ex:
UIView
ouCGLayer
qui est unUIColor
wrapper pour laCGColor
bien 😉masksToBounds
avecs
et par Défaut,NO
si c'est redondant, toujours gjVous pouvez l'essayer .... vous pouvez jouer avec les valeurs.
Le
shadowRadius
détermine la quantité de flou.shadowOffset
dicte où l'ombre va.Simple et propre solution à l'aide de Interface Builder
Ajouter un fichier nommé UIView.swift dans votre projet (ou il suffit de coller ce fichier) :
Puis ce sera disponible dans Interface Builder pour chaque vue dans le Panneau d'Utilitaires > les Attributs de l'Inspecteur :
Vous pouvez facilement régler l'ombre maintenant.
Notes:
- L'ombre n'apparaît pas dans les IB, seulement au moment de l'exécution.
- Comme Mazen Kasser dit
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, la baseFoundation
d'importation créé par XCode n'est pas assez, mais compile bien. Je devrais avoir copié le code source en entier. Merci Axel pour cette belle solution.- Je utiliser cela comme une partie de mon utils. Avec cela, nous pouvons non seulement de l'ombre, mais peuvent également obtenir un angle arrondi pour tout
UIView
. Vous pouvez également définir quelle est la couleur de l'ombre que vous préférez. Normalement, le noir est préféré, mais parfois, lorsque le fond est non-blanc, vous pourriez voulez quelque chose d'autre. Voici ce que j'utilise -À utiliser, nous devons d'appel ce -
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
Swift 3
installShadow()
n'est pas appelée à partir deviewDidLoad()
ouviewWillAppear()
draw
méthode de vue. L'ombre est venue correctement, mais à coins arrondis qui ne fonctionne pas.UIStackView
qui seulement de la disposition et n'a pas de vue. Vous pourriez avoir à insérer un régulierUIView
comme un conteneur pour tout.UIStackView
:(.. mais je vais le trouver et y répondre rapidement.Si vous souhaitez utiliser la table de montage séquentiel et ne reviendrai pas comme garder en tapant dans le moteur d'exécution des attributs, vous pouvez facilement créer une extension de vues et de les rendre utilisables dans le storyboard.
L'étape 1. créer une extension de
l'étape 2. vous pouvez maintenant utiliser ces attributs dans le storyboard
À ceux qui ont échoué dans l'obtention de ce travail (Comme moi!) après avoir essayé toutes les réponses ici, assurez-vous juste Clip des sous-vues n'est pas activée sur les Attributs de l'inspecteur de...
Vous pouvez utiliser ma fonction d'utilité créé pour l'ombre et le rayon de l'angle comme ci-dessous:
Espère que ça va vous aider!!!
Tous Répondre à toutes bien, mais je veux ajouter un point de plus
Si vous rencontrez un problème lorsque vous avez des cellules de tableau, Deque une nouvelle cellule, il y a une incohérence dans l'ombre, donc dans ce cas, vous devez placer votre ombre code dans un layoutSubviews méthode de sorte qu'il se comporte bien dans toutes les conditions.
ou dans ViewControllers pour l'angle spécifique de la place de l'ombre de code à l'intérieur de la méthode suivante, de sorte que c'est du travail bien
J'ai modifié mon ombre de la mise en œuvre de nouveaux développeurs pour la forme plus générale ex:
Pour les autres Xamarians, les Xamarin.iOS/C# version de la réponse serait la suivante:
La principale différence est que, vous acquérez une instance de
CGContext
sur lequel vous appeler directement les méthodes appropriées.Swift 3