Estoy implementando un sencillo juego de solitario iOS que permite al usuario arrastrar las tarjetas de la manera habitual. Las tarjetas se representan con la subclase UIView
CardView
. Todas las vistas de tarjeta son hermanos que son subvistas de SolitaireView
. El siguiente fragmento intenta "llevar una tarjeta en la parte delantera" de modo que está por encima de todos los otros puntos de vista, ya que está siendo arrastrado:UIView bringSubviewToFront: does * not * bring view to front
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if (touch.view.tag == CARD_TAG) {
CardView *cardView = (CardView*) touch.view;
...
[self bringSubviewToFront:cardView];
...
}
}
Desafortunadamente, el orden Z de la tarjeta se mantiene sin cambios durante el arrastre. En las imágenes de abajo, estoy arrastrando al Rey. Observe cómo es correcta en la parte superior del Nueve en la imagen izquierda, pero es incorrectamente en los dos (debajo de toda la pila en realidad) en la imagen de la derecha:
También probé alterar la propiedad layer.zPosition
como bien en vano. ¿Cómo puedo llevar la vista de la tarjeta al frente durante el arrastre? Estoy desconcertado.
descubrí que 'bringSubviewToFront:' desencadena la bandera de la vista 'needsLayout' a establecer. Mi método 'layoutSubviews' también llamaba a' bringSubviewToFront: 'volviendo todas las z-órdenes de vista a su estado inicial. – wcochran
Entonces, ¿cuál es la solución para esto? También estoy teniendo el mismo tipo de requisitos, donde de la lista de tarjetas, si selecciono cualquiera de la tarjeta de orden intermedia, debería aparecer, luego pasar al frente. pero mi animación no está funcionando debido a bringSubviewToFront: método – Mrunal
Si te quedas con el uso de subclases de UIView, entonces necesitas marcar la tarjeta que se está arrastrando para que layoutSubviews pueda colocarlo en la parte superior. De hecho, cambié a usar CALayers como se menciona a continuación. – wcochran