Как я могу различить, быстро ли пользователь нажал на UIB-кнопку или положил и удерживал ее в Swift?

Я создаю приложение камеры в swift и у меня есть UIButton, Я хочу предложить два варианта: когда пользователь нажимает кнопку один раз - он делает фотографию, и когда пользователь держит палец на кнопке - он записывает фильм, пока пользователь не отпустит кнопку.

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

Доступные действия для этой кнопки:

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

и я попытался начать запись на touch down и прекратить запись на touch up inside, но тогда я не знаю, куда я должен поместить код, ответственный за фотографирование. Если я положу это также в touch down потом когда пользователь начнет запись фильма - тоже сделаю фото, и я хочу этого избежать.

4 ответа

Решение

Распознаватели жестов для касания и длинного касания хорошо работают друг с другом, чтобы замкнуть это (нажатие откладывает срабатывание до тех пор, пока оно не будет уверенным, что это не долгое нажатие).

    class ViewController: UIViewController{

        @IBOutlet weak var button: UIButton!
        override func viewDidLoad() {
            super.viewDidLoad()
            button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap)))
            let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress))
            longPressGestureRecognizer.minimumPressDuration = 1
            button.addGestureRecognizer(longPressGestureRecognizer)
        }

        @objc private func tap(tapGestureRecognizer: UITapGestureRecognizer) {
            print("tap")
        }
        @objc private func longPress (longPressGestureRecognizer: UILongPressGestureRecognizer) {
            if longPressGestureRecognizer.state == .began {
                print("long press began")
            }

        }
    }

Для того, чтобы просто сделать одну фотографию, вы можете просто подключить кнопку к IBAction с помощью Touch Up Inside.

Для съемки видео необходимо сначала подключить кнопку к IBOutlet, а затем добавить к ней UILongPressGestureRecognizer, чтобы определить, когда пользователь долго нажимает кнопку.

@IBOutlet weak var button: UIButton!

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

    let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPress(gesture:)))
    longPressGesture.minimumPressDuration = 1 // Minimum duration to trigger the action
    self.button.addGestureRecognizer(longPressGesture)
}

func longPress(gesture: UILongPressGestureRecognizer) {
    if gesture.state == .began {
        print("Began")
        // Video starts recording
    } else if gesture.state == .ended {
        print("End")
        // Video stops recording
    }
}

@IBAction func takePhoto(_ sender: UIButton) {
    // Take photo
}

Вы можете использовать UILongPressGestureRecognizer для записи видео и @IBAction - Touch Up Inside для функции фотографирования.

Шаг 1: В раскадровке создайте UIButton и перетащите UILongPressGestureRecognizer из Object libray в эту кнопку

Шаг 2: В ViewController.swift у нас есть этот код:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    @IBAction func takePhoto(_ sender: AnyObject) {
        label.text = "Take photo"
    }

    @IBAction func recordVideo(_ sender: AnyObject) {
        label.text = "Record video"
    }
}

Шаг 3: Откройте редактор Assistant и подключите эти @IBOutlet и @IBAction

Это оно!

Вы можете использовать следующий код для нажатия кнопки при длительном нажатии:

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

Objective-C

UILongPressGestureRecognizer *lPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(TakePhotoLongPressAction:)];
[self.btnPhoto addGestureRecognizer:lPress];
[lPress release];


- (void)TakePhotoLongPressAction:(UILongPressGestureRecognizer*)gevent
{
    if ( gevent.state == UIGestureRecognizerStateEnded ) {
         NSLog(@"Button Long Press");
    }
}

СВИФТ

// add guesture recognizer
        let lPress = UILongPressGestureRecognizer(target: self, action: #selector(takePhotoLongPressAction(_:)))
        self.button.addGestureRecognizer(lPress)



func takePhotoLongPressAction(gevent: UILongPressGestureRecognizer) {
        if gevent.state == UIGestureRecognizerState.Began {
            print("Long Press button")
        }
    }

Пожалуйста, проверьте и дайте мне знать, если что-то требуется.

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