Su pregunta terminó siendo la mejor fuente que pude encontrar en el problema de fondo, por lo que decidí publicar mi solución aquí.
Si agrega la máscara directamente a la vista de desplazamiento, termina aplicando la máscara al contenido por alguna razón: i. mi. la transparencia no cambia a medida que se desplaza. De acuerdo con las sugerencias de otras publicaciones, pongo el degradado en una vista sobre (o más bien, que contiene) la vista de desplazamiento. Como resultado, scrollContainer es un UIViewObject cuya única subvista es la vista de desplazamiento en cuestión.
Esta máscara está configurada para desplazamiento de izquierda a derecha. Podrías cambiarlo de arriba a abajo manipulando las propiedades de inicio y fin del gradiente.
El único inconveniente es que esto también recorta el indicador de la barra de posición de desplazamiento de la vista de desplazamiento. Como mi escenario no necesita uno, es aceptable, pero su kilometraje puede variar.
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = scrollView.bounds;
gradient.colors = [NSArray arrayWithObjects:
(id)[[UIColor colorWithWhite:0 alpha:0] CGColor],
(id)[[UIColor colorWithWhite:0 alpha:1] CGColor],
(id)[[UIColor colorWithWhite:0 alpha:1] CGColor],
(id)[[UIColor colorWithWhite:0 alpha:0] CGColor], nil];
gradient.locations=[NSArray arrayWithObjects:
[NSNumber numberWithFloat:0],
[NSNumber numberWithFloat:.1],
[NSNumber numberWithFloat:.9],
[NSNumber numberWithFloat:1], nil];
gradient.startPoint=CGPointMake(0, .5);
gradient.endPoint=CGPointMake(1, .5);
[scrollContainer.layer setMask:gradient];
Sí, estaba pensando en eso. Lamentablemente, en este caso necesitaré una imagen como fondo, y la imagen de fondo también debe ser dinámica. – Nick