Swift Как я могу ограничить прикосновения к левой и правой стороне телефона

#ios #swift

#iOS #swift

Вопрос:

Это ниже является частью моего приложения, когда вы щелкаете по экрану, оно регистрирует касание и либо переходит к предыдущей фотографии, либо к следующей фотографии в зависимости от касания. Прямо сейчас в любом месте, где вы касаетесь экрана, он регистрируется и переходит к предыдущему или следующему изображению. Я хочу ограничить это и регистрировать прикосновения только к красным квадратам, чтобы, если вы коснетесь чего-либо между 2 красными квадратами, ничего не произошло. Это мой код

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {


    for touch in touches {
        let location = touch.location(in: self.view)

       if location.x <  self.view.layer.frame.size.width / 2        {
  // touched left side of screen show previous image if exist

        }
        else {

     // touched right side of screen show next 

        }
    }
}
  

Я думаю, что ключ — это разрешить location = touch.location(в: self.view), тогда location.x знает местоположение ширины, к которому вы прикоснулись. Я хочу регистрировать только нажатия, скажем, на крайних 10% экрана и на крайних 10% экрана. Любые предложения были бы замечательными, я использую swift 4.

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

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

Комментарии:

1. Добавьте две прозрачные кнопки или два прозрачных пользовательского интерфейса с распознавателями жестов касания.

2. Я согласен, для этого были созданы распознаватели жестов. Переопределение touchesBegan является излишне сложным процессом для этого, и для этого может потребоваться переопределение других методов касания в зависимости от подкласса.

3. Я согласен, превратите красные прямоугольники в четкие прямоугольники и установите на них распознаватели жестов.

Ответ №1:

В ViewDidLoad вы можете добавить два невидимых UIView , чтобы получить жест касания с обеих сторон, как показано ниже,

 override func viewDidLoad() {
    super.viewDidLoad()

    let touchArea = CGSize(width: 80, height: self.view.frame.height)

    let leftView = UIView(frame: CGRect(origin: .zero, size: touchArea))
    let rightView = UIView(frame: CGRect(origin: CGPoint(x: self.view.frame.width - touchArea.width, y: 0), size: touchArea))

    leftView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(leftViewTapped)))
    rightView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(rightViewTapped)))

    leftView.backgroundColor = .clear
    rightView.backgroundColor = .clear

    self.view.addSubview(leftView)
    self.view.addSubview(rightView)
}

@objc func leftViewTapped() {
    print("Left")
}

@objc func rightViewTapped() {
    print("Right")
}
  

или

Вы можете обновить текущий метод, о котором идет речь, как показано ниже, чтобы получить требуемый результат.

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let location = touches.first?.location(in: self.view) else { return }

    let touchAreaWidth: CGFloat = 80

    if location.x <= touchAreaWidth {
        print("Left area touched")
    } else if location.x >= (self.view.frame.size.width - touchAreaWidth) {
        print("Right area touched")
    } else {
        print("Ignore in-between touch.")
    }
}
  

Ответ №2:

Для меня принятый ответ не сработал. Что сработало, так это:

 func addLeftTapGesture() {
    let leftTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(leftTap))
    leftTapGestureRecognizer.delegate = self
    view.addGestureRecognizer(leftTapGestureRecognizer)
}

func addRightTapGesture() {
    let rightTapGestureRecongnizer = UITapGestureRecognizer(target: self, action: #selector(rightTap))
    rightTapGestureRecongnizer.delegate = self
    view.addGestureRecognizer(rightTapGestureRecongnizer)
}
  

Затем я проверяю, какая часть экрана была затронута:

 @objc func rightTap(tap: UITapGestureRecognizer) {
    let point = tap.location(in: self.view)
    let rightArea = CGRect(x: view.frame.width/2, y: 0, width: view.frame.width/2, height: view.frame.height)
    if rightArea.contains(point) {
        print("Right tapped")
    }
    currentImage  = 1
}

@objc func leftTap(tap: UITapGestureRecognizer) {
    let point = tap.location(in: self.view)
    let leftArea = CGRect(x: 0, y: 0, width: view.frame.width/2, height: view.frame.height)
    if leftArea.contains(point) {
        print("Left tapped")
    }
    currentImage -= 1
}