Effet ombre interne sur UIView couche?
J'ai le texte suivant CALayer:
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = CGRectMake(8, 57, 296, 30);
gradient.cornerRadius = 3.0f;
gradient.colors = [NSArray arrayWithObjects:(id)[RGB(130, 0, 140) CGColor], (id)[RGB(108, 0, 120) CGColor], nil];
[self.layer insertSublayer:gradient atIndex:0];
Je voudrais ajouter un ombre interne effet, mais je ne suis pas tout à fait sûr de savoir comment le faire. Je suppose que je serait nécessaire de tirer dans drawRect, cependant, ce serait ajouter la couche au-dessus des autres UIView objets, puisqu'il est censé être derrière la barre des boutons, donc je suis à une perte pour quoi faire?
Je pourrais ajouter une autre couche, mais encore une fois, vous ne savez pas comment faire pour obtenir l'effet ombre interne (comme ceci:
Aide appréciée...
OriginalL'auteur runmad | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
Pour quelqu'un d'autre en se demandant comment dessiner une ombre interne à l'aide de Graphiques de Base comme par Costique suggestion, alors c'est comment: (sur iOS ajuster au besoin)
Dans votre drawRect: méthode...
Donc, il y a essentiellement les étapes suivantes:
Ainsi, vous pouvez créer toute sorte de visible CGPath que vous voulez, l'exemple utilisé ici est juste que, un exemple, choisi pour des raisons de concision. Si vous souhaitez créer un arrondi rect, alors vous pouvez simplement faire quelque chose comme: CGPath visiblePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:rayon].CGPath Espère que ça aide.
pour la belle réponse. Je fixe l'arrondi rect chemin d'accès du code (le vôtre a cassé lors de la modification du rayon) et simplifié l'extérieur rect chemin d'accès du code. Espérons que vous n'avez pas l'esprit.
Beau travail, et l'excellente explication trop. +10
Comment apprendre à bien le programme d'installation de l'ombre interne de 4 directions, pas seulement les 2?
OriginalL'auteur Daniel Thorpe
Je sais je suis en retard pour cette partie, mais cela m'aurait aidée à trouver au début de mes voyages...
À donner du crédit lorsque le crédit est dû, c'est essentiellement une modification de Daniel Thorpe élaboration sur Costique de la solution de soustraire une petite région à partir d'un ensemble de la région. Cette version est pour ceux qui utilisent la composition de la couche au lieu de l'annulation de la
-drawRect:
La
CAShapeLayer
classe peut être utilisée pour obtenir le même effet:À ce point, si votre calque parent n'est pas pour masquer ses limites, vous verrez la zone supplémentaire de la couche de masque sur les bords de la couche. Ce sera de 42 pixels de noir si vous venez de copier l'exemple directement. Pour se débarrasser de lui, vous pouvez tout simplement utiliser un autre
CAShapeLayer
avec le même chemin et de le définir comme le masque de l'ombre de la couche:Je n'ai pas comparé ça moi, mais je soupçonne que l'utilisation de cette approche en collaboration avec le tramage est plus performant que primordial
-drawRect:
.Il peut être arbitraire CGPath vous le souhaitez.
[[UIBezierPath pathWithRect:[shadowLayer bounds]] CGPath]
étant le plus simple choix.Cheers pour que Matt 🙂
Je suis un noir (extérieur) rectangle pour la shadowLayer.chemin correctement attire l'intérieur de l'ombre. Comment puis-je me débarrasser de lui (le noir rectangle extérieur)? On dirait que vous ne pouvez régler la fillColor à l'intérieur d'un contexte & vous n'utilisez pas une.
Cela fonctionne très bien! J'ai envoyé à github, avec quelques ajouts. Laissez-vous tenter:) github.com/inamiy/YIInnerShadowView
OriginalL'auteur Matt Wilding
Il est possible de dessiner une ombre interne avec des Graphiques de Base en faisant un grand rectangle tracé à l'extérieur des limites, en soustrayant les limites de la taille d'un rectangle de chemin d'accès et le remplissage de la trajectoire résultante avec un "normal" de l'ombre.
Cependant, puisque vous avez besoin de le combiner avec un calque de dégradé, je pense qu'une solution plus simple est de créer un 9-partie image au format PNG transparent de l'intérieur de l'ombre et de l'étirer à la bonne taille. Les 9-la part d'ombre de l'image devrait ressembler à ceci (sa taille est de 21x21 pixels):
Puis définissez innerShadowLayer du cadre et il devrait s'étirer l'ombre correctement.
Yep, c'est un problème avec tous les dégradés et les ombres, je n'arrive pas à reproduire ces effets Photoshop 1:1 sur iOS, dur comme je l'ai essayer.
OriginalL'auteur Costique
Une version simplifiée en utilisant simplement un CALayer, dans Swift:
Noter que le innerShadow couche ne doit pas avoir un arrière-plan opaque de couleur comme ce sera rendue en face de l'ombre.
C'est la couche de parent, qui peut être l'une couche. Vous pouvez utiliser une couche personnalisée ou de l'affichage de la couche (UIView a une propriété de calque).
cela a fonctionné pour moi merci
devrait être
let innerShadow = CALayer(); innerShadow.frame = bounds
. Sans limites, il ne serait pas attirer la bonne ombre. Merci quand mêmeVrai, si vous voulez probablement pour le mettre dans
layoutSubviews()
à synchroniserOriginalL'auteur Patrick Pijnappel
Peu d'un rond-point, mais il évite d'avoir à utiliser des images (lire: facile de changer les couleurs, l'ombre de rayon, etc.) et c'est seulement quelques lignes de code.
Ajouter une UIImageView que le premier sous-vue de la UIView vous voulez le dropshadow sur. J'utilise de l'IB, mais vous pouvez faire la même programmation.
En supposant que la référence à la UIImageView est "innerShadow'
`
Mise en garde: Vous devez avoir une frontière, ou bien l'ombre n'apparaît pas. [UIColor clearColor] ne fonctionne pas. Dans l'exemple, j'utilise une couleur différente, mais vous pouvez jouer avec ça pour l'obtenir de la même couleur que le début de l'ombre. 🙂
Voir bbrame de commentaire ci-dessous sur la
UIColorFromRGB
macro.C'est le moyen le plus facile maintenant, mais sachez que le CALayer ombre méthodes ne sont disponibles que dans iOS 3.2 et versions ultérieures. Je soutiens 3.1, donc je entourent la définition de ces attributs dans un si ([couche respondsToSelector:@selector(setShadowColor:)]) {
Cela ne semble pas fonctionner pour moi. Au moins sur xcode 4.2 et simulateur ios 4.3. Pour faire de l'ombre apparaissent j'ai du ajouter une couleur d'arrière-plan... à quel point l'dropshadow apparaît uniquement à l'extérieur.
garder à l'esprit la mise en garde je l'ai mentionné ci-dessus. Je pense qu'une couleur de fond ou une frontière peut avoir le même effet de "donner quelque chose à ajouter une ombre'. Comme pour l'apparence à l'extérieur, si le UIImageView n'est pas une sous-vue de celui que vous voulez l'ombre interne sur que peut - être elle- je dois regarder à votre code pour voir.
Juste pour rectifier ma déclaration précédente... le code fonctionne réellement... il me manquait quelque chose, mais malheureusement je ne me souviens pas maintenant. 🙂 Alors... merci pour le partage de cet extrait de code.
OriginalL'auteur jinglesthula
Mieux vaut tard que jamais...
Voici une autre approche, sans doute pas mieux que ceux qui ont déjà posté, mais c'est beau & simple -
thx, la bonne solution)
merci, cela a fonctionné pour moi.
est-il possible de l'ombre spécifiques uniquement du côté de l' ? Comme seulement en haut ou de haut en bas ou haut/droite etc..
OriginalL'auteur SomaMan
Au lieu de dessiner ombre interne par drawRect ou ajouter UIView à la Vue. Vous pouvez Ajouter directement des CALayer à la frontière, par exemple: si je veux intérieure effet d'ombre sur le UIView V en bas.
Cette ajouter un fond intérieur de l'ombre pour cible UIView
OriginalL'auteur Jerry Zhang
Ici est une version de swift, changement
startPoint
etendPoint
de le faire sur chaque côté.OriginalL'auteur William Hu
C'est votre solution, que j'ai exporté à partir de PaintCode :
OriginalL'auteur Dmitriy Kirakosyan
Je suis très en retard à la fête, mais je tiens à donner en retour à la communauté..
C'est une méthode que j'ai écrit pour supprimer UITextField Image de fond que j'ai été la fourniture d'une Bibliothèque Statique et SANS Ressources...
J'ai utilisé ce pour un écran de Saisie du code PIN de quatre UITextField instances qui pourrait afficher Un caractère brut ou (BOOL)[auto isUsingBullets] ou (BOOL)[auto usingAsterisks] dans le ViewController.
App pour iPhone/iPhone retina/iPad/iPad Retina, donc je n'ai pas à fournir à quatre images...
J'espère que cela aide quelqu'un comme ce forum m'a aidé.
OriginalL'auteur Foxnolds
Vérifier l'excellent article de Intérieure Ombres dans le Quartz par Chris Emery qui explique comment l'intérieur ombres sont attirés par PaintCode et donne un environnement propre et soigné, extrait de code:
OriginalL'auteur voiger
Voici ma solution en Swift 4.2. Voulez-vous essayer?
let ctx = UIGraphicsGetCurrentContext
Vous pouvez obtenir contexte actuel par la méthode
UIGraphicsGetCurrentContext
chercher quand quelques points de vue de pousser leur contexte dans la pile.J'ai eu quelques difficultés lorsque j'ai fait tourner l'appareil. J'ai ajouté de " remplacement de la commodité init(couche: Tout) { self.init() }'. Maintenant, aucune erreur ne s'affiche!
Ajouté init(couche: Any) pour fixer le crash.
OriginalL'auteur Arco
Il y a un peu de code ici qui peut le faire pour vous. Si vous changez la couche de votre point de vue (en remplaçant
+ (Class)layerClass
), à JTAInnerShadowLayer ensuite, vous pouvez définir l'ombre interne sur le retrait de la couche dans votre méthode init et il fera le travail pour vous. Si vous aussi vous souhaitez dessiner le contenu original, assurez-vous que vous appelezsetDrawOriginalImage:yes
sur le retrait de la couche. Il y a un post de blog sur comment cela fonctionne ici.Viens de tester à la fois les liens et ils semblent fonctionner correctement (y compris dans l'onglet privé). Qui lien vous cause des problèmes?
Pouvez-vous s'il vous plaît regardez sur cette mise en œuvre de l'ombre interne code. C'est seulement en travaillant dans ViewDidAppear méthode. Et Montre un scintillement. drive.google.com/open?id=1VtCt7UFYteq4UteT0RoFRjMfFnbibD0E
OriginalL'auteur James Snook
À L'Aide Du Calque De Dégradé:
OriginalL'auteur Johnny Rockex
ce code a fonctionné pour moi
OriginalL'auteur Antony Raphel