Как я могу различить, быстро ли пользователь нажал на 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")
}
}
Пожалуйста, проверьте и дайте мне знать, если что-то требуется.