Estou tentando adicionar uma sombra projetada para visualizações que são colocadas em camadas umas sobre as outras, as visualizações colapsam permitindo que o conteúdo em outras visualizações seja visto, neste sentido, eu quero manter view.clipsToBounds
ON para que, quando as visualizações colapsarem, seu conteúdo seja cortado.
Isso parece ter dificultado a adição de uma sombra projetada às camadas, pois quando eu ligo clipsToBounds
as sombras também são cortadas.
Tenho tentado manipular view.frame
e view.bounds
adicionar uma sombra projetada ao quadro, mas permitir que os limites sejam grandes o suficiente para englobá-lo, no entanto, não tive sorte com isso.
Aqui está o código que estou usando para adicionar uma sombra (isso só funciona com clipsToBounds
OFF, conforme mostrado)
view.clipsToBounds = NO;
view.layer.shadowColor = [[UIColor blackColor] CGColor];
view.layer.shadowOffset = CGSizeMake(0,5);
view.layer.shadowOpacity = 0.5;
Aqui está uma captura de tela da sombra sendo aplicada à camada superior cinza mais claro. Espero que isso dê uma ideia de como meu conteúdo se sobreporá se clipsToBounds
estiver DESLIGADO.
Como posso adicionar uma sombra UIView
e manter meu conteúdo cortado?
Edit: Só queria acrescentar que também brinquei com o uso de imagens de fundo com sombras, o que funciona bem, no entanto, ainda gostaria de saber a melhor solução codificada para isso.
fonte
masksToBounds = NO;
ao meu original - com ambas as tentativas eu mantiveclipsToBounds = YES;
ON - ambos falharam em cortar o conteúdo. aqui está uma captura de telaUIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds cornerRadius:5.0];
. Não testado, mas deve produzir o resultado desejado.layoutSubviews()
é chamado. E se não compensarmos nesse local ajustando oshadowPath
para refletir o tamanho atual, teríamos uma visão redimensionada, mas a sombra ainda teria o tamanho antigo (inicial) e não mostraria ou espiaria onde não deveria .A resposta de Wasabii no Swift 2.3:
E em Swift 3/4/5:
Coloque este código em layoutSubviews () se você estiver usando AutoLayout.
No SwiftUI, isso é muito mais fácil:
fonte
layoutSubviews
CGSize(width: 0, height: 0.5)
view.bounds
não foi criado de forma tão óbvia queshadowPath
não pode fazer referência ao retângulo da visualização, mas sim a algunsCGRectZero
. Enfim, colocar issolayoutSubviews
resolveu meu problema finalmente!O truque é definir a
masksToBounds
propriedade da camada de sua visualização corretamente:e deve funcionar.
( Fonte )
fonte
Você pode criar uma extensão para UIView para acessar esses valores no editor de design
fonte
Você pode definir a sombra para a sua visão do storyboard também
fonte
Em viewWillLayoutSubviews:
Usando a extensão do UIView:
Uso:
fonte
targetView: UIView
e remova a franja.self
? Parece muito mais conveniente para mim.if let
sintaxe em vez de!
Portanto, sim, você deve preferir a propriedade shadowPath para desempenho, mas também: Do arquivo de cabeçalho de CALayer.shadowPath
Especificar o caminho explicitamente usando essa propriedade geralmente * melhorará o desempenho de renderização, assim como compartilhará o mesmo caminho * de referência em várias camadas
Um truque menos conhecido é compartilhar a mesma referência em várias camadas. Claro que eles têm que usar a mesma forma, mas isso é comum com células de visualização de tabela / coleção.
Não sei por que fica mais rápido se você compartilhar instâncias, acho que ele armazena em cache a renderização da sombra e pode reutilizá-la para outras instâncias no modo de exibição. Eu me pergunto se isso é ainda mais rápido com
fonte