Crear mediante programación una UIView con degradado de color
292
Estoy tratando de generar una vista con un fondo de color degradado (un color sólido a transparente) en tiempo de ejecución. ¿Hay alguna forma de hacerlo?
Si hay otras vistas agregadas a esto UIView(como a UILabel), es posible que desee considerar configurar el color de fondo de esos UIViewpara [UIColor clearColor]que se presente la vista de degradado en lugar del color de fondo para las vistas secundarias. El uso clearColortiene un ligero impacto en el rendimiento.
+1 para la menor cantidad de código de todas las soluciones. Acabo de agregar a mi controlador de vista existente, cambié las 2 referencias viewa self.viewy funcionó de maravilla :)
Ergin
44
También es relevante dónde agregar este código. Necesitaba la siguiente publicación para que esto funcionara: stackoverflow.com/a/20059268/1480518
Garrett Disco
13
¡Esto me ayudó mucho! ¡Perdí la parte de CGColor en cualquier otro lugar! Gracias
Gyfis
48
No olvide usar 'startPoint' y 'endPoint' para cambiar la dirección del gradiente. Los valores predeterminados son (0.5, 0) y (0.5,1) - de arriba hacia abajo.
Valentin Shamardin
12
Cuando mi UIView está usando diseño automático, también tuve que llamar gradient.frame = view.boundsen viewDidAppear()y en didRotateFromInterfaceOrientation(), o bien el gradiente no se dimensiona adecuadamente.
EricRobertBrewer
70
Puedes crear una clase personalizada GradientView:
Hola @LaloLoop, gracias por el comentario! He actualizado el código. Sin init(frame:CGRect)embargo , no creo que tenga que anular . Probé el código actualizado y funciona bien.
Yuchen Zhong
@Yuchen Zhong Se bloquea en IB, pero funciona en la aplicación. ¿Alguna razón por la que no se procesa en IB si @IBDesignablese usa?
Alexander Volkov
@AlexanderVolkov ¿Probablemente algún otro problema? Lo hemos estado utilizando así en el guión gráfico y no parece tener ningún problema. Puede depurar su guión gráfico y ver qué línea lo está bloqueando.
Yuchen Zhong
1
Mejor solución !
Baran Emre
40
Prueba esto, funcionó como un encanto para mí,
C objetivo
He configurado el color de fondo del degradado RGB en UIview
Para promover la reutilización, diría que cree una categoría CAGradientLayery agregue sus gradientes deseados como métodos de clase. Especifíquelos en el headerarchivo así:
¿Dónde deberías poner el código para usarlo? ¿Qué método de ciclo de vida? viewdidappear hace que parezca un segundo demasiado tarde. viewdidload y viewdidappear hacen que no funcione mientras gira. viewdidlayoutsubviews funciona mejor para la rotación, pero aún así se ve un poco entrecortado.
Adam Johns
Yo personalmente lo puseviewDidLoad
Sam Fischer
1
Cuando lo puse viewDidLoad, no funcionó si la aplicación se lanzó en orientación horizontal. Mi solución fue hacer que el marco de la capa de fondo sea más ancho que el view.frame para compensar otras orientaciones.
Adam Johns
2
viewDidLoad funciona, solo tiene que configurar la máscara AutoResizingMask usando [backgroundLayer setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
ekscrypto
21
Como solo necesitaba un tipo de degradado en mi aplicación, creé una subclase de UIView y preconfiguré la capa de degradado en la inicialización con colores fijos. Los inicializadores de UIView llaman al método configureGradientLayer , que configura 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
La llamada Swift3 debe ser como: myImageView.addGradientWithColor (color: UIColor.blue)
mgyky
8
Un enfoque rápido
Esta respuesta se basa en las respuestas anteriores y proporciona una implementación para tratar el problema de que el gradiente no se aplique correctamente durante la rotación. Satisface este problema cambiando la capa de degradado a un cuadrado para que la rotación en todas las direcciones resulte en un degradado correcto. La firma de la función incluye un argumento variado Swift que le permite a uno pasar tantos CGColorRef (CGColor) como sea necesario (ver uso de muestra). También se proporciona un ejemplo como una extensión Swift para que se pueda aplicar un degradado a cualquier UIView.
Lo que significa que el fondo del degradado ahora se puede aplicar a cualquier UIControl ya que todos los controles son UIViews (o una subclase) y todas las UIViews tienen CALayers.
Lo que estás buscando es CAGradientLayer. Todos UIViewtienen una capa: en esa capa puedes agregar subcapas, así como puedes agregar subvistas. Un tipo específico es el CAGradientLayer, donde le das una variedad de colores para graduarse.
Un ejemplo es este contenedor simple para una vista de degradado:
Mi solución es crear una UIViewsubclase con CAGradientLayeraccesible como propiedad de solo lectura. Esto le permitirá personalizar su gradiente como desee y no necesita manejar los cambios de diseño usted mismo. Implementación de subclase:
Utilicé este enfoque, cambiando "vista superior" al nombre de mi IBoutlet para mi vista. Eliminé la línea "SearchView".
jessi
Buen plan: quizás también tenga en cuenta que puede usar cualquiera de las configuraciones de degradado. Por lo tanto, si comenta los colores degradados simples usando colores de interfaz de usuario con nombre, la imagen es la misma, pero si comenta el otro, el degradado de color depende del rojo al verde. Los usuarios pueden hacer cualquiera de los dos.
Respuestas:
C objetivo:
Rápido:
Información : use startPoint y endPoint para cambiar la dirección del gradiente .
Si hay otras vistas agregadas a esto
UIView
(como aUILabel
), es posible que desee considerar configurar el color de fondo de esosUIView
para[UIColor clearColor]
que se presente la vista de degradado en lugar del color de fondo para las vistas secundarias. El usoclearColor
tiene un ligero impacto en el rendimiento.fuente
view
aself.view
y funcionó de maravilla :)gradient.frame = view.bounds
enviewDidAppear()
y endidRotateFromInterfaceOrientation()
, o bien el gradiente no se dimensiona adecuadamente.Puedes crear una clase personalizada
GradientView
:Swift 5
En el guión gráfico, establezca el tipo de clase en cualquier vista que desee tener un fondo degradado:
Esto es mejor de las siguientes maneras:
CLayer
NSConstraint
como de costumbre en elUIView
fuente
layerClass
ya no es una función, es una propiedad, por lo que debe anularla como una propiedad: stackoverflow.com/questions/28786597/… . También debe implementaroverride init(frame: CGRect)
, verifique esta respuesta: stackoverflow.com/questions/27374330/… . ¡Gracias!init(frame:CGRect)
embargo , no creo que tenga que anular . Probé el código actualizado y funciona bien.@IBDesignable
se usa?Prueba esto, funcionó como un encanto para mí,
C objetivo
He configurado el color de fondo del degradado RGB en UIview
ACTUALIZADO: - Swift3 +
Código : -
Puede agregar el punto inicial y final del color degradado.
Para una descripción más detallada, consulte CAGradientLayer Doc
Espero que esto sea de ayuda para alguien.
fuente
Este es mi enfoque recomendado.
Para promover la reutilización, diría que cree una categoría
CAGradientLayer
y agregue sus gradientes deseados como métodos de clase. Especifíquelos en elheader
archivo así:Luego, en su archivo de implementación, especifique cada gradiente con esta sintaxis:
Luego simplemente importe esta categoría en su
ViewController
o cualquier otra requeridasubclass
, y úsela así:fuente
viewDidLoad
viewDidLoad
, no funcionó si la aplicación se lanzó en orientación horizontal. Mi solución fue hacer que el marco de la capa de fondo sea más ancho que el view.frame para compensar otras orientaciones.Como solo necesitaba un tipo de degradado en mi aplicación, creé una subclase de UIView y preconfiguré la capa de degradado en la inicialización con colores fijos. Los inicializadores de UIView llaman al método configureGradientLayer , que configura CAGradientLayer:
DDGradientView.h:
DDGradientView.m:
fuente
initGradientLayer
es similar a un inicializador. No creo que sea muy adecuado.Implementación rápida:
fuente
He extendido un poco la respuesta aceptada usando la funcionalidad de extensión de Swift, así como una enumeración.
Ah, y si está utilizando Storyboard como lo hace, asegúrese de llamar
gradientBackground(from:to:direction:)
enviewDidLayoutSubviews()
o posterior.Swift 3
fuente
He implementado esto rápidamente con una extensión:
Swift 3
Swift 2.2
No, puedo establecer un gradiente en cada vista de esta manera:
fuente
Un enfoque rápido
Esta respuesta se basa en las respuestas anteriores y proporciona una implementación para tratar el problema de que el gradiente no se aplique correctamente durante la rotación. Satisface este problema cambiando la capa de degradado a un cuadrado para que la rotación en todas las direcciones resulte en un degradado correcto. La firma de la función incluye un argumento variado Swift que le permite a uno pasar tantos CGColorRef (CGColor) como sea necesario (ver uso de muestra). También se proporciona un ejemplo como una extensión Swift para que se pueda aplicar un degradado a cualquier UIView.
Usar:
a la vistaDidLoad ...
Implementación de extensión
Ejemplo de caso de uso de extensión:
Lo que significa que el fondo del degradado ahora se puede aplicar a cualquier UIControl ya que todos los controles son UIViews (o una subclase) y todas las UIViews tienen CALayers.
Swift 4
Implementación de extensión
Ejemplo de caso de uso de extensión:
fuente
Lo que estás buscando es
CAGradientLayer
. TodosUIView
tienen una capa: en esa capa puedes agregar subcapas, así como puedes agregar subvistas. Un tipo específico es elCAGradientLayer
, donde le das una variedad de colores para graduarse.Un ejemplo es este contenedor simple para una vista de degradado:
http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/
Tenga en cuenta que debe incluir el marco QuartZCore para acceder a todas las partes de la capa de una UIView.
fuente
Swift 4:
Muestra el gradiente en IB correctamente:
fuente
USO
fuente
Vista rápida simple basada en la versión de Yuchen
Entonces puede usar gradientLayer después de la inicialización de esta manera ...
fuente
Mi solución es crear una
UIView
subclase conCAGradientLayer
accesible como propiedad de solo lectura. Esto le permitirá personalizar su gradiente como desee y no necesita manejar los cambios de diseño usted mismo. Implementación de subclase:Uso:
fuente
Es una buena idea llamar a las soluciones anteriores para actualizar la capa en el
para actualizar las vistas correctamente
fuente
SWIFT 3
Para agregar una capa de degradado en su vista
Vincula tu punto de vista
Defina el CAGradientLayer ()
Aquí está el código que debe escribir en su vista
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)
fuente
En Swift 3.1 he agregado esta extensión a UIView
que luego llamo con
fuente
He implementado esto en mi código.
Ahora puedo ver un gradiente en mi vista.
fuente
Para dar color degradado a UIView (swift 4.2)
Cómo utilizar
fuente