2012-05-23 18 views
18

I może być brakuje czegoś tutaj, ale ...TouchUpInside na UIView z dziećmi

Mam UIView z kilkoma dziećmi (kilka UILabel „S i UIImageView). Muszę złapać zdarzenie, gdy użytkownik kliknie (stuknie) w dowolnym miejscu w obiekcie macierzystym UIView - widoczna część UIView lub dowolne z jego potomków).

Jaki jest najlepszy sposób na zrobienie tego?

+0

Używasz Xcode 4? – Sirens

Odpowiedz

44

Możesz zmienić klasę UIView w Inspektorze tożsamości ... spraw, aby była to UIControl, a następnie możesz dodać wydarzenie dla widoku UITouchUpInside - aby uchwycić jego kliknięcia.

Powodzenia!

EDIT: oto krok-po-kroku z zrzuty ekranu:

Widok ... Original view - of type UIView

... oczywiście, nie ma żadnych zdarzeń. UIView has no events you can use

wrócić i zmienić UIView z UIControl i ... Change UIView to UIControl

Ta-DAA! Wydarzenia! UIControl allows you to use events

Hook metoda przypadku UITouchUpInside Add event for UITouchUpInside

To jak to powinno wyglądać w pliku interfejsu The interface of the method

To jak to powinno wyglądać w pliku implementacji (można , oczywiście, zastąp rejestrację dowolnie wybranym) The implementation of the method

+0

Czy ktoś może podać przykład kodu? – WebOrCode

+1

@WebOrCode: Edytowałem swoją odpowiedź i dodałem zrzuty ekranu, mam nadzieję, że to pomoże. – DarkByte

1

musisz podać nieco więcej szczegółów, ponieważ istnieje wiele opcji.

Jeśli chcesz normalnie dotknąć, możesz uchwycić jedno ze standardowych zdarzeń dotykowych i zobaczyć, w jakim wydziale znajduje się wydarzenie. Coś takiego:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    if(touch.view != self.mySubViewOfInterest) 
    { 
     // perform my actions 
    } 
} 

Jeśli potrzebujesz skomplikowanego rozpoznawanie gestów można użyć jednego z UIGestureRecognizer i przypisać go do subviews lub widoku głównym.

W każdym razie musisz zwrócić uwagę, że wszystkie subviews (te, w których chcesz je przechwycić) muszą mieć włączoną interakcję użytkownika, w przeciwnym razie widok główny będzie przechwytywał zdarzenia dla subskrybentów, a zakończy się debugowanie i debugowanie bez zrozumienia, co się dzieje.

6

Możesz udawać to zachowanie, korzystając z funkcji rozpoznawania gestów dla widoku macierzystego i upewniając się, że Twoje dzieci nie mają własnych rejestratorów gestów. Aby to zrobić, dodaj urządzenie rozpoznające gesty do swojego rodzica UIView, które nasłuchuje na dotknięcia. Gdzie parentView jest zawierający widok dla swoich poglądów dziecka (UILabels/UIImageView) i handleTap jest metodą realizowany przez parentView, zrób coś takiego:

UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)]; 
[parentView addGestureRecognizer:tapParent]; 
[tapParent release]; 

Jak twoje poglądy dziecka nie mają własne rozpoznające gest nie będzie " zjadaj "gest", więc widok rodzica odpowie tak długo, jak dotkniesz jego granic.

0

To działa dla mnie

Swift 3

let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick)) 
withSender: self) 
customView.addGestureRecognizer(gesture) 


func customViewClick() { 
    print("custom view clicked!") 
    }