Estou tentando desenhar uma sombra sob a borda inferior de um UIView
no Cocoa Touch. Entendo que devo usar CGContextSetShadow()
para desenhar a sombra, mas o guia de programação do Quartz 2D é um pouco vago:
- Salve o estado dos gráficos.
- Chame a função
CGContextSetShadow
, passando os valores apropriados. - Execute todo o desenho ao qual deseja aplicar sombras.
- Restaurar o estado dos gráficos
Eu tentei o seguinte em uma UIView
subclasse:
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
CGContextRestoreGState(currentContext);
[super drawRect: rect];
}
..mas isso não funciona para mim e estou um pouco empolgado com (a) para onde ir em seguida e (b) se houver algo que eu precise fazer UIView
para que isso funcione?
fonte
#import <QuartzCore/QuartzCore.h>"
ao arquivo .h.masksToBounds
paraNO
negará ocornerRadius
, não?self.layer.backgroundColor = [[UIColor whiteColor] CGColor];
mas sem sorte. Qual visão precisa ser transparente?Isso desacelerará o aplicativo. Adicionar a seguinte linha pode melhorar o desempenho, desde que sua visualização seja visivelmente retangular:
fonte
A mesma solução, mas apenas para lembrá-lo: você pode definir a sombra diretamente no storyboard.
Ex:
fonte
UIView
ouCGLayer
que é umUIColor
wrapper para aCGColor
propriedade;)Você pode tentar isso .... você pode jogar com os valores. O
shadowRadius
dita a quantidade de desfoque.shadowOffset
dita para onde vai a sombra.fonte
Solução simples e limpa usando o Interface Builder
Adicione um arquivo chamado UIView.swift ao seu projeto (ou cole-o em qualquer arquivo):
Em seguida, isso estará disponível no Interface Builder para todas as visualizações no Painel de utilitários> Inspetor de atributos:
Você pode facilmente definir a sombra agora.
Notas:
- A sombra não aparecerá no IB, apenas no tempo de execução.
- Como Mazen Kasser disse
fonte
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
para fazê-lo funcionar, aFoundation
importação básica criada pelo XCode não é suficiente, mas compila bem. Eu deveria ter copiado o código fonte inteiro. Obrigado Axel por esta ótima solução.Eu uso isso como parte dos meus utils. Com isso, não podemos apenas definir sombra, mas também podemos obter um canto arredondado para qualquer um
UIView
. Além disso, você pode definir a sombra da cor que preferir. Normalmente, o preto é o preferido, mas às vezes, quando o fundo não é branco, você pode querer outra coisa. Aqui está o que eu uso -Para usar isso, precisamos chamar isso -
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
fonte
Swift 3
fonte
installShadow()
não é invocada a partir deviewDidLoad()
ouviewWillAppear()
draw
método sobrecarregado de visão. A sombra está vindo corretamente, mas a esquina não.UIStackView
apenas uma layout e não tem exibição. Você pode ter que inserir um regularUIView
como um contêiner para tudo.Se você deseja usar o StoryBoard e não deseja continuar digitando os atributos de tempo de execução, é possível criar facilmente uma extensão para as visualizações e torná-las utilizáveis no storyboard.
Etapa 1. criar extensão
etapa 2. agora você pode usar esses atributos no storyboard
fonte
Para aqueles que falharam em fazer isso funcionar (como eu!) Depois de tentar todas as respostas aqui, verifique se o Clip Subviews não está ativado no inspetor de Atributos ...
fonte
Swift 3
fonte
Você pode usar minha função de utilitário criada para o raio da sombra e do canto, como abaixo:
Espero que ajude você !!!
fonte
Tudo Responda bem, mas quero acrescentar mais um ponto
Se você encontrar um problema quando tiver células da tabela, ao remover uma célula nova, há uma incompatibilidade na sombra, portanto, nesse caso, você precisará colocar seu código de sombra no método layoutSubviews para que ele se comporte bem em todas as condições.
ou no ViewControllers para exibição específica, coloque o código de sombra dentro do método a seguir para que funcione bem
Modifiquei minha implementação de sombra para novos desenvolvedores para uma forma mais generalizada, ex:
fonte
Para outros Xamarians, a versão Xamarin.iOS / C # da resposta seria semelhante à seguinte:
A principal diferença é que você adquire uma instância
CGContext
na qual chama diretamente os métodos apropriados.fonte
Você pode usar isso
Extension
para adicionar sombravocê pode chamar assim
fonte
Esboçar sombra usando o IBDesignable e o IBInspectable no Swift 4
fonte