Gradiente en la parte superior / Bot de Scrollview cuando hay contenido adicional

Tengo una configuration de scrollview> ContentView> TextLabel donde aparece el degradado pero no funciona como lo quiero. Es un background claro scrollView, así que todo lo que estoy buscando es una clara máscara de degradado sobre el text. Encontré algo similar a lo que estoy buscando en Objective-C pero ese hilo no tiene una solución Swift.

Mi meta final parece algo que la mayoría de las personas podría usar, así que estoy sorprendido de que no haya una versión Swift todavía. La funcionalidad que estoy tratando de codificar es:

  1. A veces, el text encaja perfectamente en el tamaño fijo de scrollView, por lo que no debe haber ningún degradado.
  2. Cuando el text es más largo de lo que puede caber y, por lo tanto, parte de él está por debajo del límite inferior de la vista de desplazamiento, la parte inferior de la vista debería desaparecer para desaparecer.
  3. Una vez que el usuario se desplaza hacia abajo y la parte superior debe desvanecerse, lo que indica que hay más arriba.

Probé este código para manejar la viñeta n. ° 2:

let gradient = CAGradientLayer() gradient.frame = self.bio_ScrollView.superview!.bounds ?? CGRectNull gradient.colors = [UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] //gradient.locations = [0, 0.15, 0.25, 0.75, 0.85, 1.0] gradient.locations = [0.6, 1.0] self.bio_ScrollView.superview!.layer.mask = gradient 

Pero todo se desvanece, incluido el button debajo de él, que claramente no está en el scrollview:

scrollView con gradiente

Si elimino el .superview y lo aplico directamente al scrollView, simplemente se desvanece todo el text debajo de la parte inicial que estaba visible:

scrollview gradient no funciona

¿Alguien sabe algo sobre cómo implementar esto correctamente?

Lo imaginé. Primero, asegúrese de haber agregado la jerarquía de vista correcta. La vista de desplazamiento debe incrustarse en una vista de contenedor (a lo que se aplicará el degradado):

Jerarquía de vista de gradiente

  1. Vista superior / contenedor: configura esto como quieras
  2. Scrollview: Pinear todos los bordes del contenedor (4 restricciones totales)
  3. Vista del contenido de Scrollview: bordes del pin + centro X (5 restricciones totales)
  4. Etiqueta: bordes del pasador (4 restricciones totales)

Agregue "scrollViewDelegate" a la class ViewController:

 class ViewController_WithScrollView: UIViewController, UIScrollViewDelegate { .... 

Conecte las cuatro vistas enumeradas anteriormente con IBOutlets. Luego, configure su delegado scrollView dentro de viewDidLoad:

 override func viewDidLoad() { super.viewDidLoad() yourScrollView.delegate = self //+All your other viewDidLoad stuff } 

Luego implementa la function scrollViewDidScroll, que se ejecutará automáticamente gracias al trabajo que hiciste anteriormente.

 func scrollViewDidScroll (scrollView: UIScrollView) { if scrollView.isAtTop { self.applyGradient_To("Bot") } else if scrollView.isAtBottom { self.applyGradient_To("Top") } else { self.applyGradient_To("Both") } } 

A continuación, agregue este código de gradiente mágico:

 func applyGradient_To (state: String) { let gradient = CAGradientLayer() gradient.frame = self.yourScrollView.superview!.bounds ?? CGRectNull switch state { case "Top": gradient.colors = [UIColor.clearColor().CGColor,UIColor.whiteColor().CGColor] gradient.locations = [0.0,0.2] case "Bot": gradient.colors = [UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] gradient.locations = [0.8,1.0] default: gradient.colors = [UIColor.clearColor().CGColor,UIColor.whiteColor().CGColor,UIColor.whiteColor().CGColor, UIColor.clearColor().CGColor] gradient.locations = [0.0,0.2,0.8,1.0] } self.yourScrollView.superview!.layer.mask = nil self.yourScrollView.superview!.layer.mask = gradient } 

¡Deberias hacer eso!