2013-08-06 16 views
7

mam UIView który zawiera trzy pojemnikiPrzenoszenie UIView na górze UITableView - dotykając górnej UIView jeszcze wybiera wiersze tabeli

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---- | | 
|  | ----------- | 
---------------------- 

zachodzi zdarzenie, gdzie przesunięcie ramki pojemnika B (i pokazują widok (oznaczony literą O) na prawo od B, co nie jest ważne). Teraz Container B nakładających pojemniku

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

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

ale teraz, gdy próbuję wybrać wiersz UITableView pojemnika C poprzez dotykanie lewą krawędź wiersza (@), dotyk jest zarejestrowany przez pojemniku w UITableView. Lub nawet jeśli dotknę widoku nad tabelą (*), wybierany jest odpowiedni wiersz w A.

Mogę rozwiązać część problemu, zmieniając szerokość UITableView kontenera A. Ale nadal mam problem, jeśli dotknę tabeli C (@), wiersz C nie wybierze. To tak, jak na początku tabeli C znajduje się w starej lokalizacji ($).

Co mogę zrobić, aby stukając w nowej lokalizacji @ wybrać właściwy wiersz w C?

=======

EDIT z kodem:

Jest to kod mam w pojemniku B. Jest to bardzo prosta animacja ramce B.. self.view to UIView kontenera B.

Wszystkie widoki są na ekranie ("inny" kontener jest ukryty) w Storyboard. Innym kontem jest wyszczególnienie 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]; 
       } 
]; 

Proszę dać mi znać, jaki inny kod chcesz zobaczyć.

+0

Bardzo dobre wytłumaczenie, ale myślę, że musimy zobaczyć kod używany do wyświetlania i ożywiać swoje pojemniki do rozwiązać ten problem ... – Beppe

+1

@ Beppe, dodałem kod do animacji. – David

Odpowiedz

0

Więc ściągnąłem do Reveal wizualnie widzą (w 3d), co działo się z poglądami. Wygląda na to, że narysowane przeze mnie diagramy nie są kompletne i wprowadzają w błąd.

Każdy z kontenerów A i B (które są UIViews) zawiera subviews A 'i B' (również UIViews). W bloku animacji, kiedy zmieniałem self.view, naprawdę poruszałem ramkę dla B '. Rama porusza się z granicami B.

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

Więc nawet B „został nakładających A i A”, jak sądzę w hierarchii poglądów, dotyk jest nadal schwytany przez subviews bazowych (kontenery) A i B. Nie do końca myślę, że tak powinno się stać, ale myślę, że tak to się dzieje.

W każdym razie rozwiązanie było proste.

zamiast:

[self.view setFrame:frame]; 

jestem zasadniczo zamiar zrobić:

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

Mmm ... Nie jestem pewien, czy to działa w twoim przypadku, ale spróbuj zarządzać animacją w większym pojemniku, w którym mieści się cały twój inny pojemnik.

Znaczy utwórz Z pojemnika, który zawiera A, B, O i ich subviews i starają się animować położenie B z Z, sprawdzając, że B jest przed A.

+0

dzięki za sugestię. Przeniosłem logikę do nadrzędnego kontrolera ViewController z A i B i zachowano to samo zachowanie. – David