У меня есть UIPageViewController
, где одна страница - это экран Настройки .На этом экране есть UISwitch
для включения или выключения настройки.
Хотя я заметил, что многие люди нажимают UISwitch
, чтобы переключать его, как я, я заметил, что некоторые пользователисдвиньте UISwitch
, чтобы переключить его.
Попытка сдвинуть UISwitch
может вызвать проблемы, когда он находится на UIViewController
, который является частью UIPageViewController
, так как сдвиг переключателя может начать сдвигать UIPageViewController
как будто пользователь хочет изменить страницы.
Это поведение, которое кажется очень испорченным и непоследовательным.Похоже, что если пользователь касается переключателя, но перед скольжением колеблется, касания регистрируются UISwitch
, и он работает так, как ожидает пользователь.Но если пользователь касается UISwitch
и сразу начинает скользить, UIPageViewController
получает вместо этого прикосновения.Кажется, есть очень тонкая грань (порог колебания) между UISwitch
, получающими прикосновения или нет.
Как бы вы решили эту проблему?
ВотПример, который начинается с простых нажатий для переключения UISwitch
, а затем показывает некоторые из различных способов попробовать скользить UISwitch
, которые приводят к противоречивым результатам:
![inconsistent-uiswitch-behavior](https://i.stack.imgur.com/jm8jq.gif)
Возможные решения и проблемы
Один из способов решения этой проблемы, который я рассмотрел, заключается в обнаружении касаний в любом месте Настройки UIViewController
, и если касания начинаются где-то в кадре UISwitch
, предотвратите скольжение UIPageViewController
.
Меня беспокоит то, что простое отключение скольжения для UIPageViewController
не приведет кгарантия касания передаются на UISwitch
.Это может означать, что пользователь может попытаться сдвинуть UISwitch
, а UIPageViewController
не будет скользить, но UISwitch
также не будет реагировать на прикосновения, из-за чего он все еще будет выглядеть сломанным и непоследовательным.
ДляНачните исследовать это возможное решение. Я попытался обнаружить касания, переопределив метод touchesBegan
следующим образом:
override func touchesBegan(_ touches: Set<UITouch>,
with event: UIEvent?) {
print("touchesBegan")
super.touchesBegan(touches,
with: event)
}
Я попытался обнаружить касания таким образом как на UIPageViewController
, так и на UIViewController
определенной страницы Settings , но ни одна не вызывается.Я также пытался установить view.isUserInteractionEnabled = true
на видах и различные комбинации true
или false
на разных UIViewController
с, но все еще не могу обнаружить прикосновения.
I 'Мы также рассмотрели просто отказ от всей парадигмы UIPageViewController
для этого приложения и превращение экрана Settings в модальное, поскольку это решило бы необходимость такого сложного решения, но у * есть и другие преимущества.1074 * парадигма в приложении, поэтому я хочу исследовать, возможно ли сохранить.В конечном счете, кажется, что это была бы лучшая идея, чем странные обходные пути, но я все равно хотел опубликовать это на тот случай, если у кого-то возникнут те же проблемы или у кого-то есть другие возможные решения.: РЕШЕНИЕ
Я потратил кучу времени на эксперименты на основе предоставленных ответов, а также много узнал о том, как работает iOS, поэтому спасибо всем, кто ответил.
В конечном счете, ответ Леона заставил меня пойти по пути к простому решению, которое работало с UIPanGestureRecognizer
, которое очень похоже на то, что я пробовал с UISwipeGestureRecognizer
, основанным на ответе Карла, но в конечном итоге не дало таких же результатов..
Я закончил подклассами UISwitch
и добавил UIPanGestureRecognizer
, который ничего не делает.Это заставляет его вести себя именно так, как я хочу: каждый раз, когда пользователь начинает сдвигать переключатель, UIPageViewController
не панорамирует.
class NoPanSwitch: UISwitch {
override init(frame: CGRect) {
super.init(frame: frame)
let recognizer = UIPanGestureRecognizer(target: self,
action: nil)
addGestureRecognizer(recognizer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}