2012-06-01 24 views
30

Dada una UIView arbitraria en iOS, ¿hay alguna manera de utilizar Core Graphics (CAGradientLayer viene a la mente) para aplicarle un degradado "transparente en primer plano"?gradiente transparente UIView

No puedo usar un CAGradientLayer estándar porque el fondo es más complejo que un UIColor. Tampoco puedo superponer un PNG porque el fondo cambiará a medida que mi subvista se desplaza a lo largo de la vista de desplazamiento vertical principal (ver imagen).

Tengo un respaldo no elegante: tengo mi clip uiview en las subvistas y muevo un png degradado previamente representado del fondo cuando se desplaza la vista de desplazamiento principal.

transparent uiview gradient problem

+0

Cuáles son los antecedentes? ¿Cómo "cambia" a medida que se desplaza la vista de desplazamiento? –

Respuesta

88

Esta fue una solución embarazosamente fácil: aplique CAGradientLayer como la máscara de mi subvista.

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.frame = _fileTypeScrollView.bounds; 
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil]; 
gradientLayer.startPoint = CGPointMake(0.8f, 1.0f); 
gradientLayer.endPoint = CGPointMake(1.0f, 1.0f); 
_fileTypeScrollView.layer.mask = gradientLayer; 

¡Gracias a Cocoanetics por señalarme en la dirección correcta!

+6

Utilicé este código para agregar un degradado a un UIScrollView horizontal muy similar.Se ve muy bien, pero cuando se desplaza, las vistas que vienen desde la derecha son transparentes. Es como si el degradado se aplicara a las vistas reales ubicadas en la vista de desplazamiento y no como una capa encima de ellas. ¿Qué estoy haciendo mal? –

+0

¡esta es la respuesta correcta! – Yariv

+0

¿Cómo crear un degradado vertical que demanda este código? –

0

me gusta decirlo, pero creo que son en la tierra CUSTOM UIView. Creo que trataría de implementar esto en una UIView personalizada que supere la rutina drawRect.

Con esto, puede tener esa vista, colocarla encima de su vista de desplazamiento real, y hacer que su vista de degradado (si lo desea) "transfiera" todos los eventos táctiles (es decir, renuncie a la primera respuesta).

2

Gradient Example

Me acabo de encontrar con el mismo problema y terminó de escribir mi propia clase. Parece una exageración seria, pero era la única forma que podía encontrar de hacer degradados con transparencia. Puedes ver mi writeup and code example here

Básicamente se trata de una UIView personalizada que crea dos imágenes. Uno es un color sólido, el otro es un degradado que se usa como una máscara de imagen. A partir de ahí, apliqué la imagen resultante al uiview.layer.content.

espero que ayude, Joe

1

Esta es la forma en que haré.

Paso 1 definir una vista degradado personalizado (Swift 4):

import UIKit 

class GradientView: UIView { 
    override open class var layerClass: AnyClass { 
     return CAGradientLayer.classForCoder() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     let gradientLayer = self.layer as! CAGradientLayer 
     gradientLayer.colors = [ 
      UIColor.white.cgColor, 
      UIColor.init(white: 1, alpha: 0).cgColor 
     ] 
     backgroundColor = UIColor.clear 
    } 
} 

Paso 2 - arrastrar y soltar un UIView en su guión gráfico y establezca su clase personalizada a GradientView

enter image description here

Como ejemplo, así es como se ve la vista de gradiente anterior:


https://github.com/yzhong52/GradientViewDemo

+0

No funcionó conmigo – Elsammak

+0

@Elsammak Creo que es porque usted no configuró el color de fondo de UIview para borrar. Vea las ediciones de Smaily Carrilho para más detalles. –

+1

Realmente funciona. Gracias. – kkazakov