Sto implementando un semplice solitario per iOS che consente all'utente di trascinare le carte nel solito modo. Le carte sono rappresentate con la sottoclasse UIView
CardView
. Tutte le schede di visualizzazione sono fratelli, che sono subviews di SolitaireView
. Il seguente frammento cerca di "portare una carta al fronte" in modo che sia al di sopra tutte le altre viste mentre viene trascinato:UIView bringSubviewToFront: fa * not * porta in primo piano
-(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];
...
}
}
Sfortunatamente, ordine z della carta rimane invariato durante il trascinamento. Nelle immagini qui sotto, sto trascinando il re. Notate come è correttamente sulla parte superiore dei Nove nell'immagine a sinistra, ma è in modo non corretto sotto le due (sotto l'intero stack in realtà) nell'immagine a destra:
Ho provato anche alterare la proprietà layer.zPosition
come inutilmente. Come posso portare la vista della carta in primo piano durante il trascinamento? Sono confuso.
ho scoperto che 'bringSubviewToFront:' innesca la bandiera della vista 'needsLayout' da impostare. Il mio metodo 'layoutSubviews' stava anche chiamando' bringSubviewToFront: 'ripristinando così tutti gli ordini z view al loro stato iniziale! – wcochran
Allora qual è la soluzione per questo? Ho anche lo stesso tipo di requisiti, dove dalla lista delle carte, se seleziono una qualsiasi delle carte di ordine medio, dovrebbe venire, quindi venire in primo piano. ma la mia animazione non funziona a causa di bringSubviewToFront: metodo – Mrunal
Se continui a utilizzare sottoclassi UIView, devi contrassegnare la scheda trascinata in modo che layoutSubviews possa posizionarla sopra. In realtà ho deciso di utilizzare CALayer come indicato di seguito. – wcochran