2012-11-12 20 views
6

Uczę się iOS i nie mogę znaleźć sposobu dodania funkcji przeciągania i upuszczania do UIView.Proste przeciąganie i upuszczanie do widoku?

Próbowałem:

[_view addTarget:self action:@selector(moved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 

on mówi „nie widoczny interfejs UIView deklaruje selektor addTarget (etc)

Również próbowałem dodanie pan gest rozpoznawania ale nie jestem pewien, czy to, co muszę

- (IBAction)test:(id)sender { 
     NSLog(@"dfsdfsf"); 
    } 

To się nazywa, ale nie wiem, jak uzyskać współrzędne tego wydarzenia. Jaki jest standardowy i prosty sposób rejestrowania wywołania zwrotnego dla zdarzeń przeniesienia/przeciągania i upuszczania?

Z góry dziękuję.

Odpowiedz

12

A UIPanGestureRecognizer to zdecydowanie najlepsza droga.Jeśli chcesz, aby użytkownik, aby przeciągnąć widok dookoła, trzeba się „tłumaczenie” (ruch) gestu w układzie współrzędnych na Superview za:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:_view.superview]; 

Gdy masz tłumaczenie, można przenieść („przeciągnij „) widok zmieniając jego center:

CGPoint center = _view.center; 
    center.x += translation.x; 
    center.y += translation.y; 
    _view.center = center; 

Wreszcie chcesz ustawić tłumaczeniem pAN gest Rozpoznawania z powrotem do zera, więc następnym razem, gdy pojawia się komunikat, że tylko powie Ci ile gest został przeniesiony od ostatniej wiadomości:

[recognizer setTranslation:CGPointZero inView:_view.superview]; 
} 

Tutaj to wszystko razem do łatwego kopiowania/wklejania:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:_view.superview]; 

    CGPoint center = _view.center; 
    center.x += translation.x; 
    center.y += translation.y; 
    _view.center = center; 

    [recognizer setTranslation:CGPointZero inView:_view.superview]; 
} 
+0

użytkownik musi dodać to w viewDidLoad: UIPanGestureRecognizer * Panner = [[UIPanGestureRecognizer alloc] initWithTarget: self działanie: @selector (panWasRecognized:)]; [_viewaddGestureRecognizer: panner]; –

+1

Możesz też dodać narzędzie do rozpoznawania gestów w swoim scenorysie lub XIB. –

+0

To prawda, ale kiedy podążyłem za twoją odpowiedzią, nie wiedziałem, że musi, więc nie działa ze mną: D –

4

Zacznij od touchesBegan, touchesMoved, touchesEnded. Zastąp je w swojej podklasie UIView, a będziesz na najlepszej drodze do nauki systemu zdarzeń. Możesz uzyskać współrzędne zdarzenia w następujący sposób:

- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event 
{ 
    float x = [[touches anyObject] locationInView:self].x; 
    float y = [[touches anyObject] locationInView:self].y; 
} 

Następnie jest mnóstwo rzeczy do konwersji współrzędnych między różnymi widokami i tak dalej. Gdy już to zrozumiesz, możesz pracować z rzeczami, które już znalazłeś i które są potrzebne.

Do przeciągnięcia/upuszczenia potrzebny będzie wykrywacz gestów panoramicznych. Możesz użyć selektora locationInView: w , aby dowiedzieć się, gdzie jesteś w danym momencie.

dodać swój gest rozpoznawania jak tak, to nie z rzeczy docelowego akcji, staraliśmy:

UIPanGestureRecognizer *dragDropRecog = [[UIPanGestureRecognizer alloc] initWithTarget:yourView action:@selector(thingDragged:)]; 
[yourView addGestureRecognizer:dragDropRecog]; 

potem trzeba wdrożyć selektor thingDragged: w widoku:

- (void) thingDragged:(UIPanGestureRecognizer *) gesture 
{ 
    CGPoint location = [gesture locationInView:self]; 
    if ([gesture state] == UIGestureRecognizerStateBegan) { 
     // Drag started 
    } else if ([gesture state] == UIGestureRecognizerStateChanged) { 
     // Drag moved 
    } else if ([gesture state] == UIGestureRecognizerStateEnded) { 
     // Drag completed 
    } 
} 

You Będę tłumaczył widok przeciągany w zmienionym bicie i obsługę kropli w zakończonej sekcji.

Powiązane problemy