iOS: cómo crear una UIV compatible con "layout de materiales" con sombra?

Estoy tratando de ver si hay una manera de crear una UIView con un comportamiento de sombra que cumpla con el layout de materiales . Mi entendimiento es que la sombra se vuelve más intensa a medida que el object se elimina más de la superficie del background.

Puedo agregar manualmente una sombra como esta, pero esta sombra no calcula cuán intenso debería ser la sombra (basado en el order Z).

button.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:button.layer.bounds cornerRadius:11].CGPath; button.layer.shadowOpacity = 1.0; button.layer.shadowOffset = CGSizeMake(1,1); button.layer.shadowColor = [UIColor blackColor].CGColor; 

¿Cómo creo una UIView que se comporte como el layout de material de Google? Encontré este ejemplo, llamado Material Kit , sin embargo, simplemente oculta la sombra al tacto

Una forma en que Google hace esto es haciendo hincapié en el uso de un 'eje z' para crear una sensación de profundidad en la que los elementos pueden ocupar diferentes niveles. Para mostrar que un elemento ocupa un nivel superior en el eje z, las sombras se utilizan alnetworkingedor de su borde, y se lanzan al nivel siguiente. Lo que esto crea es la ilusión de una capa / elemento interactivo que existe por encima de una capa / elemento interactivo inferior diferente.

introduzca la descripción de la imagen aquí

Podrías subclasificar el UIButton , y primero establecer las properties de sombra a tu gusto:

 button.layer.shadowOffset = CGSizeMake(0, 1); button.layer.shadowRadius = 5; button.layer.shadowOpacity = 0; 

Luego, cambia la propiedad shadowOpacity cuando cambia el estado resaltado:

 - (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; self.layer.shadowOpacity = (highlighted ? 0.85 : 0); } 

Para aplicar una sombra y una esquina networkingondeada, debe usar 2 vistas anidadas. Esto se debe a que los dos efectos requieren properties de masksToBounds .

Nido 2 UIViews. Aplica la sombra a la vista exterior, estableciendo masksToBounds = false . Luego aplique la esquina networkingondeada a la vista interior, que requiere masksToBounds = true .

Tenga en count que, según Apple docs, masksToBounds es equivalente a clipsToBounds .