Как получить координаты касания от события ValueChanged в Swift

Фон

Я уже → узнал, как использовать распознаватель жестов или continueTrackingWithTouch, чтобы получать непрерывные обновления текущего местоположения касания, а затем использовать их, чтобы сделать что-то вроде это:

введите описание изображения здесь

Теперь, однако, я хотел бы узнать, как сделать то же самое, используя цели. Я уже могу прикоснуться к событиям и прикоснуться к ним, используя TouchDown и TouchUpInside, но я не знаю, как получать непрерывные обновления. Я предположил, что он будет использовать событие ValueChanged, но пока это не работает.

Это то, что я пробовал:

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

Примечания

  • Изменен код после ответа @CaseyWagner. Компилятор больше не выдает ошибку, но UIControlEvents.ValueChanged никогда не запускается.
  • Этот вопрос - это моя попытка получить полный ответ для метода 1: добавление цели раздела этого ответа.

Ответы

Ответ 1

Используйте UIControlEvents.TouchDragInside вместо UIControlEvents.ValueChanged (также обратите внимание, что метод действия получает два аргумента):

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

Функция обработчика выглядит следующим образом:

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)"
}

Ответ 2

Не видя остальную часть кода, похоже, что вам может понадобиться:

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

Ответ 3

  • Комментарий @UIApplicationMain строка в AppDelegate
  • Создайте новый файл с именем main.swift и добавьте этот код в этот файл

    import UIKit
    import Foundation
    UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(AppClass), NSStringFromClass(AppDelegate))
    
  • Создать новый класс с именем "AppClass" и подклассом UIApplication

  • Напишите следующий код в этом методе   import UIKit

    class AppClass: UIApplication {
        override func sendEvent(event: UIEvent)
        {
            super.sendEvent(event)
            print("send event") // this is an example
            // ... dispatch the message...
         }   
    }
    
  • Здесь, в методе sendEvent, вы получите все события, происходящие в приложении (все экраны), все события касания, поэтому здесь вы можете использовать этот UIEvent и выполнять любую задачу, если хотите