Crie programaticamente um UIView com gradiente de cores
292
Estou tentando gerar uma exibição com um fundo de cor gradiente (uma cor sólida para transparente) em tempo de execução. Existe uma maneira de fazer isso?
Se houver outras visualizações adicionadas a isso UIView(como a UILabel), convém definir a cor de plano de fundo daquelas UIViewpara [UIColor clearColor]que a visualização de gradiente seja apresentada em vez da cor de segundo plano para as sub-visualizações. O uso clearColortem um leve impacto no desempenho.
+1 para a menor quantidade de código dentre todas as soluções. Eu só acrescentou ao meu controlador de vista existente, mudou os 2 refs para viewa self.viewe funcionou como um encanto :)
Ergin
4
Também relevante é onde adicionar esse código. Eu precisava da seguinte postagem para fazer isso funcionar: stackoverflow.com/a/20059268/1480518
Garrett Disco
13
Isso me ajudou muito! Perdeu a parte CGColor em qualquer outro lugar! Obrigado
Gyfis
48
Não se esqueça de usar 'startPoint' e 'endPoint' para alterar a direção do gradiente. Os valores padrão são (0,5, 0) e (0,5,1) - da direção superior para a inferior.
Valentin Shamardin
12
Quando meu UIView está usando AutoLayout, eu também tive que chamar gradient.frame = view.boundsem viewDidAppear()e em didRotateFromInterfaceOrientation(), ou então o gradiente de não ser dimensionado corretamente.
EricRobertBrewer
70
Você pode criar uma classe personalizada GradientView:
Olá @LaloLoop, obrigado pelo comentário! Eu atualizei o código. Acho que não tenho que substituir init(frame:CGRect). Testei o código atualizado e funciona bem.
Yuchen Zhong
@Yuchen Zhong Ele falha no IB, mas funciona no aplicativo. Algum motivo pelo qual não é renderizado no IB se @IBDesignablefor usado?
Alexander Volkov
@AlexanderVolkov Provavelmente alguma outra questão? Nós o usamos dessa forma no storyboard e, no entanto, não parece ter nenhum problema. Você pode depurar seu storyboard e ver qual linha está travando.
Yuchen Zhong
1
Melhor solução !
Baran Emre
40
Tente isso, funcionou como um encanto para mim,
Objetivo C
Eu configurei Cor de fundo gradiente RGB para UIview
Para promover a reutilização, eu diria que crie uma categoria CAGradientLayere adicione os gradientes desejados como métodos de classe. Especifique-os no headerarquivo como este:
onde você deve colocar o código para usá-lo? que método de ciclo de vida? viewdidappear faz parecer um segundo tarde demais. viewdidload e viewdidappear fazem com que ele não funcione durante a rotação. viewdidlayoutsubviews funciona melhor para rotação, mas ainda parece um pouco instável.
Adam Johns
Pessoalmente, colocá-lo em:viewDidLoad
Sam Fischer
1
Quando o coloquei viewDidLoad, ele não funcionaria se o aplicativo fosse iniciado na orientação paisagem. Minha solução foi tornar o quadro da camada de fundo mais amplo que o view.frame para compensar outras orientações.
Adam Johns
2
viewDidLoad funciona, você também precisa definir o AutoResizingMask usando [backgroundLayer setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
ekscrypto
21
Como eu só precisava de um tipo de gradiente em todo o meu aplicativo, criei uma subclasse do UIView e pré-configurei a camada de gradiente na inicialização com cores fixas. Os inicializadores do UIView chamam o método configureGradientLayer , que configura o CAGradientLayer:
#import "DDGradientView.h"@implementationDDGradientView// Change the views layer class to CAGradientLayer class+(Class)layerClass
{return[CAGradientLayerclass];}-(instancetype)initWithCoder:(NSCoder*)aDecoder {self=[super initWithCoder:aDecoder];if(self){[self configureGradientLayer];}returnself;}-(instancetype)initWithFrame:(CGRect)frame {self=[super initWithFrame:frame];if(self){[self configureGradientLayer];}returnself;}// Make custom configuration of your gradient here -(void)configureGradientLayer {CAGradientLayer*gLayer =(CAGradientLayer*)self.layer;
gLayer.colors =[NSArray arrayWithObjects:(id)[[UIColor whiteColor]CGColor],(id)[[UIColor lightGrayColor]CGColor],nil];}@end
A chamada Swift3 deve ser como: myImageView.addGradientWithColor (color: UIColor.blue)
mgyky
8
Uma abordagem rápida
Esta resposta se baseia nas respostas acima e fornece implementação para lidar com o problema do gradiente não ser aplicado corretamente durante a rotação. Satisfaz esse problema alterando a camada de gradiente para um quadrado, para que a rotação em todas as direções resulte em um gradiente correto. A assinatura da função inclui um argumento variável Swift que permite a passagem de tantos CGColorRef (CGColor) quanto necessário (consulte o uso de amostra). Também é fornecido um exemplo como uma extensão Swift, para que se possa aplicar um gradiente a qualquer UIView.
O que significa que o fundo gradiente agora pode ser aplicado a qualquer UIControl, pois todos os controles são UIViews (ou uma subclasse) e todos os UIViews possuem CALayers.
O que você está procurando é CAGradientLayer. Todo mundo UIViewtem uma camada - nessa camada, você pode adicionar subcamadas, assim como adicionar subviews. Um tipo específico é o CAGradientLayer, no qual você fornece uma variedade de cores para diferenciar.
Um exemplo é este wrapper simples para uma visualização de gradiente:
Minha solução é criar UIViewsubclasse CAGradientLayeracessível como uma propriedade somente leitura. Isso permitirá que você personalize seu gradiente da maneira que desejar e não precisará lidar com as alterações de layout. Implementação de subclasse:
Eu usei essa abordagem, alterando "topview" para o nome do meu IBoutlet para minha visão. Eu apaguei a linha "SearchView".
jessi
Bom plano - talvez também note que você pode usar qualquer uma das configurações de gradient.colors. Portanto, se você comentar as cores simples gradient.colours usando cores nomeadas da interface do usuário, a imagem será a mesma, mas se você comentar a outra, o gradiente de cores dependerá do vermelho para o verde. Os usuários podem fazer qualquer um.
Respostas:
Objetivo-C:
Rápido:
Informações : use startPoint e endPoint para alterar a direção do gradiente .
Se houver outras visualizações adicionadas a isso
UIView
(como aUILabel
), convém definir a cor de plano de fundo daquelasUIView
para[UIColor clearColor]
que a visualização de gradiente seja apresentada em vez da cor de segundo plano para as sub-visualizações. O usoclearColor
tem um leve impacto no desempenho.fonte
view
aself.view
e funcionou como um encanto :)gradient.frame = view.bounds
emviewDidAppear()
e emdidRotateFromInterfaceOrientation()
, ou então o gradiente de não ser dimensionado corretamente.Você pode criar uma classe personalizada
GradientView
:Swift 5
No storyboard, defina o tipo de classe para qualquer visualização em que você queira ter um fundo gradiente:
Isso é melhor das seguintes maneiras:
CLayer
NSConstraint
normalmente noUIView
fonte
layerClass
não é mais uma função, é uma propriedade, portanto você deve substituí-la como uma propriedade: stackoverflow.com/questions/28786597/… . Além disso, você deve implementaroverride init(frame: CGRect)
, verifique esta resposta: stackoverflow.com/questions/27374330/… . Obrigado!init(frame:CGRect)
. Testei o código atualizado e funciona bem.@IBDesignable
for usado?Tente isso, funcionou como um encanto para mim,
Objetivo C
Eu configurei Cor de fundo gradiente RGB para UIview
ATUALIZADO: - Swift3 +
Código : -
Você pode adicionar o ponto inicial e final da cor gradiente.
Para uma descrição mais detalhada, consulte CAGradientLayer Doc
Espero que isso ajude alguém.
fonte
Esta é a minha abordagem recomendada.
Para promover a reutilização, eu diria que crie uma categoria
CAGradientLayer
e adicione os gradientes desejados como métodos de classe. Especifique-os noheader
arquivo como este:Em seu arquivo de implementação, especifique cada gradiente com esta sintaxe:
Em seguida, basta importar esta categoria para o seu
ViewController
ou qualquer outro requeridosubclass
e usá-lo assim:fonte
viewDidLoad
viewDidLoad
, ele não funcionaria se o aplicativo fosse iniciado na orientação paisagem. Minha solução foi tornar o quadro da camada de fundo mais amplo que o view.frame para compensar outras orientações.Como eu só precisava de um tipo de gradiente em todo o meu aplicativo, criei uma subclasse do UIView e pré-configurei a camada de gradiente na inicialização com cores fixas. Os inicializadores do UIView chamam o método configureGradientLayer , que configura o CAGradientLayer:
DDGradientView.h:
DDGradientView.m:
fonte
initGradientLayer
é semelhante a um inicializador. Eu não acho muito apropriado.Implementação rápida:
fonte
Estendi a resposta aceita um pouco, usando a funcionalidade de extensão do Swift, bem como uma enumeração.
Ah, e se você estiver usando Storyboard como eu, certifique-se chamar
gradientBackground(from:to:direction:)
emviewDidLayoutSubviews()
ou depois.Swift 3
fonte
Eu implementei isso rapidamente com uma extensão:
Swift 3
Swift 2.2
Não, eu posso definir um gradiente em todas as visualizações como esta:
fonte
Uma abordagem rápida
Esta resposta se baseia nas respostas acima e fornece implementação para lidar com o problema do gradiente não ser aplicado corretamente durante a rotação. Satisfaz esse problema alterando a camada de gradiente para um quadrado, para que a rotação em todas as direções resulte em um gradiente correto. A assinatura da função inclui um argumento variável Swift que permite a passagem de tantos CGColorRef (CGColor) quanto necessário (consulte o uso de amostra). Também é fornecido um exemplo como uma extensão Swift, para que se possa aplicar um gradiente a qualquer UIView.
Usar:
em viewDidLoad ...
Implementação de extensão
Exemplo de caso de uso de extensão:
O que significa que o fundo gradiente agora pode ser aplicado a qualquer UIControl, pois todos os controles são UIViews (ou uma subclasse) e todos os UIViews possuem CALayers.
Swift 4
Implementação de extensão
Exemplo de caso de uso de extensão:
fonte
O que você está procurando é
CAGradientLayer
. Todo mundoUIView
tem uma camada - nessa camada, você pode adicionar subcamadas, assim como adicionar subviews. Um tipo específico é oCAGradientLayer
, no qual você fornece uma variedade de cores para diferenciar.Um exemplo é este wrapper simples para uma visualização de gradiente:
http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/
Observe que você precisa incluir a estrutura QuartZCore para acessar todas as partes da camada de um UIView.
fonte
Swift 4:
Mostra gradiente no IB corretamente:
fonte
USO
fonte
Visualização rápida simples com base na versão de Yuchen
Então você pode usar gradientLayer após a inicialização como esta ...
fonte
Minha solução é criar
UIView
subclasseCAGradientLayer
acessível como uma propriedade somente leitura. Isso permitirá que você personalize seu gradiente da maneira que desejar e não precisará lidar com as alterações de layout. Implementação de subclasse:Uso:
fonte
É uma boa ideia chamar as soluções acima para atualizar a camada no
para atualizar as visualizações corretamente
fonte
SWIFT 3
Para adicionar uma camada de gradiente à sua visualização
Vincule seu ponto de vista
Definir o CAGradientLayer ()
Aqui está o código que você deve escrever na sua viewDidLoad
YOURVIEW.layoutIfNeeded()
gradient.startPoint = CGPoint(x: CGFloat(0), y: CGFloat(1)) gradient.endPoint = CGPoint(x: CGFloat(1), y: CGFloat(0)) gradient.frame = YOURVIEW.bounds gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor] gradient.colors = [ UIColor(red: 255.0/255.0, green: 56.0/255.0, blue: 224.0/255.0, alpha: 1.0).cgColor,UIColor(red: 86.0/255.0, green: 13.0/255.0, blue: 232.0/255.0, alpha: 1.0).cgColor,UIColor(red: 16.0/255.0, green: 173.0/255.0, blue: 245.0/255.0, alpha: 1.0).cgColor] gradient.locations = [0.0 ,0.6 ,1.0] YOURVIEW.layer.insertSublayer(gradient, at: 0)
fonte
No Swift 3.1, adicionei esta extensão ao UIView
que eu chamo com
fonte
Eu implementei isso no meu código.
Agora eu posso ver um gradiente na minha visão.
fonte
Para dar cor de gradiente ao UIView (swift 4.2)
Como usar
fonte