Как получить координаты касания из события valueChanged в Swift
фон
Я ранее изученные как использовать распознаватель жестов или continueTrackingWithTouch
чтобы получить непрерывные обновления текущего местоположения касания, а затем использовать их, чтобы сделать что-то вроде этого:
теперь, однако, я хотел бы узнать, как сделать то же самое, используя цели. Я уже могу получить touch down и touch Up события с помощью TouchDown
и TouchUpInside
, но я не знаю как получайте непрерывные обновления. Я предположил, что он будет использовать ValueChanged
событие, но до сих пор это не работает.
это то, что я пробовал:
ViewController.Свифт!--28-->
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.Свифт!--28-->
import UIKit
class MyCustomControl: UIControl {
// currently empty. Do I need to add something here?
}
Примечания
- изменил код после получения ответа @CaseyWagner. Компилятор больше не выдает ошибку, но
UIControlEvents.ValueChanged
никогда получает уволены. - этот вопрос-моя попытка получить полный ответ на метод 1: Добавление цели на ответ.
3 ответов
использовать 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)"
}
Не видя остальной части вашего кода, похоже, вам может понадобиться:
let location = sender.convertPoint(CGPointZero, toView: myCustomControl)
- комментарий
@UIApplicationMain
в строкеAppDelegate
-
создать новый файл с именем main.swift и добавьте этот код в этот файл
import UIKit import Foundation UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(AppClass), NSStringFromClass(AppDelegate))
создайте новый класс с именем "AppClass" и подклассом UIApplication
-
напишите следующий код в этом методе импорт базе UIKit
class AppClass: UIApplication { override func sendEvent(event: UIEvent) { super.sendEvent(event) print("send event") // this is an example // ... dispatch the message... } }
здесь, в методе sendEvent, вы получите все события, происходящие в приложении( все экраны), все сенсорные события, поэтому здесь вы можете использовать этот UIEvent и выполнять любую задачу, если хотите