2013-08-06 14 views
7

ho un UIView che contiene tre contenitorispostamento di un UIView in cima UITableView - toccare l'UIView superiore seleziona ancora righe della tabella

Container A - contains a UITableView 
Container B - contains Container C and Container O 
Container C - contains a UITableView 
* - touch event 
@ - touch event 

---------------------- 
|  |    | 
| ---*|  B  | 
| --- |    | 
| -A- | ----------- | 
| --- ||@----C---- | | 
|  | ----------- | 
---------------------- 

Un evento si verifica quando sposto la cornice di contenitore B (e mostro un visualizza (etichettato O) a destra di B, che non è importante). Ora Container B si sovrappone Contenitore A

O - Other view (unimportant) 
$ - original location of touch @ 

---------------------- 
| |    | | 
| --|*  B  | | 
| --|    | | 
| -A|------------ |O| 
| --||@-$--C----| | | 
| |------------ | | 
---------------------- 

Ma ora, quando cerco di selezionare una riga UITableView del contenitore C toccando il bordo sinistro della riga (@), il tocco è stato registrato da di Container A UITableView. O anche se tocco la vista sopra la tabella (*), viene selezionata la riga corrispondente in A.

Posso risolvere parte del problema modificando la larghezza del contenitore A di UITableView. Ma poi ho ancora il problema in cui se tocco tabella C (@), la riga C non seleziona. È come se l'inizio della tabella C si trovasse nella vecchia posizione ($).

Quindi, cosa posso fare in modo che toccando la nuova posizione @ selezioni la riga corretta in C?

=======

EDIT con un po 'di codice:

Questo è il codice che faccio nel container B. Si tratta di un'animazione molto semplice del telaio di B. self.view è UIView del contenitore B.

Tutte le viste sono sullo schermo (l'altro contenitore è nascosto) attraverso lo Storyboard. Altro contenitore è una visualizzazione secondaria di B.

// this code basically aligns the "other" container to the right/"offscreen" of 
// Container B. Yes extending beyond the frame of B, but this part works fine 
CGRect otherContainerFrame = self.otherContainerView.frame; 
otherContainerFrame.origin.x = CGRectGetMaxX(self.view.frame); 
[self.otherContainerView setFrame:otherContainerFrame]; 
[self.otherContainerView setHidden:NO]; 

// I'm going move Container B by the width of the "other" view 
float offset = CGRectGetWidth(self.otherContainerView.frame); 

CGRect frame = self.view.frame; 
frame.origin.x -= offset; 
[UIView animateWithDuration:.35 
       animations:^{ 
        [self.view setFrame:frame]; 
       } 
]; 

prega fatemi sapere cosa altro codice che si desidera vedere.

+0

Molto buona spiegazione, ma penso che abbiamo bisogno di vedere il codice utilizzato per mostrare e animare i vostri contenitori di risolvere questo problema ... – Beppe

+1

@ Beppe, ho aggiunto il codice per l'animazione. – David

risposta

0

così ho scaricato Rivela a vedere visivamente (in 3d) cosa stava succedendo con le viste. Sembra che i diagrammi che ho disegnato non siano completi e fuorvianti.

Ciascuno dei contenitori A e B (che sono UIViews) contengono subviews A 'e B' (anche UIViews). Nel blocco di animazione quando stavo cambiando self.view, stavo davvero spostando il fotogramma per B '. Il telaio è stato spostando fuori dai limiti della B.

---------------------- 
| A' |  B'  | 
| ---*|  B  | 
| --- |    | 
| -A- | ----------- | 
| --- ||@----C---- | | 
|  | ----------- | 
---------------------- 

Quindi, anche la B 'stata sovrapposizione A e A', immagino nella gerarchia di vista, il tocco è ancora catturato dai subviews sottostante (contenitori) A e B. Non penso che sia così che dovrebbe accadere, ma immagino che questo sia il modo in cui le cose cadono.

In ogni caso, la soluzione era semplice.

invece di:

[self.view setFrame:frame]; 

sto essenzialmente intenzione di fare:

[self.view.superview setFrame:frame]; 
0

Mmm ... Non so se questo funziona nel tuo caso, ma prova a gestire l'animazione in un contenitore più grande che contiene tutto il tuo altro contenitore.

Voglio dire, creare un contenitore che contiene Z A, B, O e le loro subviews e cercare di animare la posizione di B da Z, controllando che B si trova di fronte A.

+0

grazie per il suggerimento. Ho spostato la logica su ViewController padre di A e B, e lo stesso comportamento esiste. – David

Problemi correlati