#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
}