¿Cómo funciona clipsToBounds?

110

Me gustaría saber cómo usar la UIViewpropiedad clipsToBounds.

La documentación oficial dice lo siguiente:

clipsToBounds propiedad

Un valor booleano que determina si las subvistas se limitan a los límites de la vista.

Discusión
Establecer este valor en YEShace que las subvistas se recorten a los límites del receptor. Si se establece en NO, las subvistas cuyos marcos se extienden más allá de los límites visibles del receptor no se recortan. El valor predeterminado es NO.

Pero no tengo claro qué significa esto exactamente. ¿Cómo debo usar clipsToBounds? ¿Cuáles son las consecuencias de establecer esta propiedad YESexactamente? O a NO?

Toshi
fuente

Respuestas:

283

Si mi supervista es una caja que mide 10 unidades en cada lado, y mi subvista tiene 20 unidades de ancho, con el clipsToBoundsajuste a YES, solo veré la parte de la subvista que se ajuste a los límites de la supervista. De lo contrario, si clipsToBoundsestá configurado en NO, veré la subvista completa, incluso las partes fuera de la supervista (suponiendo que todavía estemos en la pantalla).

Como ejemplo visual, considere las siguientes vistas configuradas en el guión gráfico:

ingrese la descripción de la imagen aquí

Esta es una UIViewetiqueta blanca en la esquina superior izquierda con un simple "1" o "2" para que pueda discutirlos como view1o view2. Además, la vista en negro tiene el mismo tamaño que la vista en blanco, pero su origen está en el centro de la vista en blanco.

En el viewDidLoadmétodo del controlador de vista , tenemos el siguiente código:

C objetivo:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

Rápido:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

Cuando ejecutamos el código y lo miramos en el simulador o en el dispositivo, obtenemos los siguientes resultados:

ingrese la descripción de la imagen aquí

Entonces, a pesar de que estas vistas se configuran de manera idéntica (excepto clipsToBounds), se ven diferentes. Esto es lo que clipsToBoundshace. Establecerlo en YESproporcionará el resultado superior, mientras que establecerlo en NOproporcionará el resultado inferior.

Si depuramos la jerarquía de la vista, podemos ver más claramente que las dos cajas negras se extienden más allá de los límites de la vista blanca, pero solo la vista 2 muestra esto cuando la aplicación se está ejecutando:

ingrese la descripción de la imagen aquí

nhgrif
fuente
3
¡Respuesta fantástica! Bien hecho. Pero tengo una pregunta. Por qué las UITextViewsombras no son visibles, si la clipsToBoundspropiedad es igual a true; ? Si es así false, funciona bien
Mannopson
1
Nota: Es la vista principal en la que cambia clipsToBounds. Entonces, si viewB es una subvista de viewA. Es viewA que clipsToBounds necesita hacerse realidad.
aestusLabs
La vista que se muestra desde el marco de la vista original en esa vista funciona con el gesto de tocar, porque verifico y no funciona.
Pravin Tate
2

Esto pretende ser una respuesta rápida y concisa frente a la respuesta aceptada

Si Apple fue cambiar el nombre de esta propiedad, me nombro: clipSubviewsToBounds.

Me encontré con un error en nuestro código. Donde se estableció la altura de la vista principal 0. Esperábamos ver ninguno de sus elementos. Sin embargo, aparecían los contenidos de la vista de los padres.

Fue porque clipToBoundsno estaba configurado true. Una vez que se establece en true, las alturas de las subvistas no pueden extenderse más allá 0, por lo que no se muestran en absoluto.

Miel
fuente
Esta respuesta está muy subestimada
sasquatch