Swift 3 перетаскиваемый UIButton

Извиняюсь, поскольку я все еще изучаю основы Swift.

Я пытаюсь переместить кнопку, когда перетаскиваю ее, что звучит просто. Я не могу понять, как передать информацию об отправителе в функцию перетаскивания, чтобы связать ее с перетаскиваемой кнопкой.

Я создаю несколько кнопок, состоящих из одного слова, которые являются всего лишь текстом, и прикрепляю к ним распознаватель жестов панорамирования:

let pan = UIPanGestureRecognizer(target: self, action: #selector(panButton(_:)))
let word = UIButton(type: .system)
word.addGestureRecognizer(pan)

Я создал эту функцию для запуска при перемещении кнопки:

func panButton(sender: UIPanGestureRecognizer){
    if sender.state == .began {
        //wordButtonCenter = button.center // store old button center
    } else if sender.state == .ended || sender.state == .failed || sender.state == .cancelled {
        //button.center = wordButtonCenter // restore button center
    } else {
        let location = sender.location(in: view) // get pan location
        //button.center = location // set button to where finger is
    }
}

Я получаю следующую ошибку:

Use of unresolved identifier 'panButton'

2 ответа

Решение

Как указывает @benjamin в Swift 3, вы должны быть селектором. Я обновил свой код до следующего, чтобы извлечь тег кнопки:

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.panGestureHandler(panGesture:)))
    panGesture.minimumNumberOfTouches = 1
    let word = UIButton(type: .system)

Со следующим селектором:

@objc func panGestureHandler(panGesture recognizer: UIPanGestureRecognizer) {

    let buttonTag = (recognizer.view?.tag)!
    if let button = view.viewWithTag(buttonTag) as? UIButton {

        if recognizer.state == .began {
            wordButtonCenter = button.center // store old button center
        } else if recognizer.state == .ended || recognizer.state == .failed || recognizer.state == .cancelled {
            button.center = wordButtonCenter // restore button center
        } else {
            let location = recognizer.location(in: view) // get pan location
            button.center = location // set button to where finger is
        }
    }
}

Прежде всего, ваше действие должно быть селектором в Swift 3. Так что это будет выглядеть примерно так:

let pan = UIPanGestureRecognizer(target: self, action: #selector(panButton(_:))

Кроме того, вы не можете передать значение кнопки через селектор, поэтому вам нужно изменить функцию следующим образом:

func panButton(sender: UIPanGestureRecognizer){
    ...
}

Если вам интересно, как вы должны найти кнопку, если не можете передать ее в качестве параметра, то вы можете рассмотреть возможность использования тегов.

Другие вопросы по тегам