Как использовать кнопку, чтобы получить сенсорный ввод и вывести местоположение на метку в Swift 3? - PullRequest
0 голосов
/ 23 октября 2018

Я только начал играть со Swift, поэтому извиняюсь, если это глупый вопрос.Я пытаюсь создать кнопку, чтобы, когда пользователь нажимает ее и затем касается экрана внутри изображения, он сохранял местоположение касания в виде CGPoint и изменял текст на метке на координаты.

Пока у меня есть нижеприведенное, но я не уверен, какие аргументы следует использовать для вызова функции touchesBegan из IBAction кнопки, или я полностью ошибаюсь в этом.Любая помощь будет принята с благодарностью.

class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    // *********** Set Coordinates ****************
    // variable to be set as the location of the user's touch
    var toploc:CGPoint? = nil

    @IBOutlet weak var myImageView: UIImageView!

    // label that will change to the coordinates of the touch
    @IBOutlet weak var Topcoord: UILabel!

    func touchesBegan(_ touches:Set<UITouch>, with event: UIEvent?) -> CGPoint {
        if let touch = touches.first {
            let position = touch.location(in: myImageView)
            return position
        } else {
            // print("in else")
        }
    }

    // button that stores location of user's touch and displays the coordinates in the Topcoord text

    @IBAction func settop(_ sender: Any) {
        toploc = touchesBegan(Set<UITouch>, UIEvent)
        Topcoord.text = String(describing: toploc)
    }

    // ************** default stuff ***************
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

То, что вы хотите, это использовать UITapGestureRecognizer, который фактически даст вам местоположение касания.Вы можете добавить его в свой просмотр изображений либо в раскадровке / XIB, либо программно.Например,

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewTapped(_:)))
    myImageView.addGestureRecognizer(tapGestureRecognizer)
}

@IBAction func viewTapped(_ sender: UITapGestureRecognizer) {
    switch sender.state {
    case .ended:
        Topcoord.text = "\(sender.location(ofTouch: 0, in: view))"
    case .possible, .began, .changed, .cancelled, .failed:
        break
    }
}

PS Вы никогда не создаете UITouch объектов, они создаются в частном порядке в UIKit.

0 голосов
/ 23 октября 2018

Вам не нужно вызывать функцию touchesBegan из своего кода, потому что UIKit вызывает этот метод.Когда этот метод сработал, просто сохраните последнее местоположение в переменной toploc и затем используйте его в функции settop, когда пользователь нажмет кнопку.Например,

var toploc: CGPoint?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first

    if let position = touch?.location(in: myImageView) {
        toploc = position  // 
    }
}

@IBAction func settop(_ sender: Any)
{
    topCoord.text = String(describing: toploc)
}

Стиль Сamel обычно используется в Swift для имен, первый символ в верхнем регистре для типов (и протоколов) и в нижнем регистре для всего остального.Таким образом, ваш код будет выглядеть лучше, если Topcoord имя переменной изменится на topCoord или topCoordinates.

...