2016-01-13 7 views
9

TłoJak dostać dotyk współrzędne ze zdarzenia valueChanged w Swift

Mam previously learned jak korzystać z funkcji Rozpoznawanie gestów lub continueTrackingWithTouch uzyskać ciągłe aktualizacje bieżącej lokalizacji dotykowym i następnie wykorzystać te uwagi coś takiego:

enter image description here

teraz jednak chciałbym, aby dowiedzieć się, jak zrobić to samo przy użyciu celów. Mogę już dotknąć i dotknąć zdarzeń za pomocą TouchDown i TouchUpInside, ale nie wiem, jak uzyskać ciągłe aktualizacje. Zakładałem, że będzie to wydarzenie ValueChanged, ale do tej pory nie działa.

To co próbowałem:

ViewController.swift

import UIKit 
class ViewController: UIViewController { 

    @IBOutlet weak var myCustomControl: MyCustomControl! 
    @IBOutlet weak var trackingBeganLabel: UILabel! 
    @IBOutlet weak var trackingEndedLabel: UILabel! 
    @IBOutlet weak var xLabel: UILabel! 
    @IBOutlet weak var yLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // these work 
     myCustomControl.addTarget(self, action: "myTouchDown", forControlEvents: UIControlEvents.TouchDown) 
     myCustomControl.addTarget(self, action: "myTouchUpInside", forControlEvents: UIControlEvents.TouchUpInside) 

     // this doesn't work 
     myCustomControl.addTarget(self, action: "myValueChangedEvent:", 
      forControlEvents: UIControlEvents.ValueChanged) 
    } 

    // this works 
    func myTouchDown() { 
     trackingBeganLabel.text = "Touched down" 
    } 

    // this works 
    func myTouchUpInside() { 
     trackingEndedLabel.text = "Touch up inside" 
    } 

    // this doesn't work, function never gets called 
    func myValueChangedEvent(sender: UIControl) { 
     let location = sender.convertPoint(CGPointZero, toView: myCustomControl) 
     xLabel.text = "x: \(location.x)" 
     yLabel.text = "y: \(location.y)" 
    } 
} 

MyCustomControl.swift

import UIKit 
class MyCustomControl: UIControl { 
    // currently empty. Do I need to add something here? 
} 

Uwagi

  • Zmieniono kod po uzyskaniu odpowiedzi @ CaseyWagner. Kompilator nie generuje już błędu, ale UIControlEvents.ValueChanged nigdy nie zostanie zwolniony.
  • To jest moja próba uzyskania kompletnej odpowiedzi na temat metody Metoda 1: Dodawanie docelowej sekcji this answer.

Odpowiedz

9

Zastosowanie UIControlEvents.TouchDragInside zamiast UIControlEvents.ValueChanged (również zauważyć, że metoda działania otrzymuje dwa argumenty):

myCustomControl.addTarget(self, action: "didDragInsideControl:withEvent:", 
     forControlEvents: UIControlEvents.TouchDragInside) 

Funkcja modułu obsługi wygląda następująco:

func didDragInsideControl(control: MyCustomControl, withEvent event: UIEvent) { 
    let touch = event.touchesForView(control)!.first! 
    let location = touch.locationInView(control) 
    xLabel.text = "x: \(location.x)" 
    yLabel.text = "y: \(location.y)" 
} 
+0

Świetnie! Brakowało mi wydarzenia "TouchDragInside". Użyłem 'if let touch = ...' ponieważ nie jestem pewien, czy wymuszone rozpakowanie kiedykolwiek spowodowałoby awarię. – Suragch

1

Nie widząc resztę swojego kodu, wygląda na to może być konieczne:

let location = sender.convertPoint(CGPointZero, toView: myCustomControl) 
+0

Zaktualizowałem moje pytanie. – Suragch

1
  1. Komentarz @UIApplicationMain linia AppDelegate
  2. Utwórz nowy plik o nazwie Main.Swift i dodać ten kod w tym pliku

    import UIKit 
    import Foundation 
    UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(AppClass), NSStringFromClass(AppDelegate)) 
    
  3. Utwórz nową klasę o nazwie "AppClass" i podklasy UIApplication

  4. zapis następujący kod w ten sposób importowej UIKit

    class AppClass: UIApplication { 
        override func sendEvent(event: UIEvent) 
        { 
         super.sendEvent(event) 
         print("send event") // this is an example 
         // ... dispatch the message... 
        } 
    } 
    
  5. Tutaj, w metodzie sendEvent, otrzymasz wszystkie zdarzenia występujące w aplikacji (wszystkie ekrany), wszystkie zdarzenia dotykowe, więc tutaj możesz użyć tego UIEvent i wykonać dowolne zadanie, jeśli chcesz

Powiązane problemy