ScrollView не распознает жест встряхивания
У меня есть 3 файла.
1.ContentVC — состоит из scrollView для прокрутки между контроллерами просмотра.
2.FirstVC - содержит функцию встряхивания
3.SecondVC - контроллер представления по умолчанию
Когда я встряхиваю устройство, ничего не происходит.
ContentVC.swift
class ContainerVC: UIViewController {
@IBOutlet weak var scroll: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
let left = self.storyboard?.instantiateViewController(withIdentifier: "vw") as! UINavigationController
self.addChild(left)
self.scroll.addSubview(left.view)
self.didMove(toParent: self)
let last = self.storyboard?.instantiateViewController(withIdentifier: "lastviewNav") as! UINavigationController
self.addChild(last)
self.scroll.addSubview(last.view)
self.didMove(toParent: self)
var middleframe:CGRect = last.view.frame
middleframe.origin.x = self.view.frame.width
last.view.frame = middleframe
self.scroll.contentSize = CGSize(width: (self.view.frame.width) * 2, height: (self.view.frame.height))
}
}
FirstVC.swift
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
if event?.subtype == UIEvent.EventSubtype.motionShake {
if motion == .motionShake {
print("quote is appearing by shaking the device")
} else {
print("No quote is coming")
}
}
}





Motion events are delivered initially to the first responder and are forwarded up the responder chain as appropriate.
https://developer.apple.com/documentation/uikit/uiresponder/1621090-motionended
Поэтому убедитесь, что:
FirstVC смог стать первым ответившим:override var canBecomeFirstResponder: Bool {
return true
}
FirstVC является первым ответчиком в определенный момент времени:firstVC.becomeFirstResponder()
Теперь ваш UIViewController сможет получать события встряхивания.
Вы можете прочитать больше о цепочке Responder: Как работает цепочка ответчиков в iPhone? Что такое «следующие ответчики»?
@ Motivationgym5 это действительно зависит от логики вашего приложения. Проще всего поставить его в конце ContainerVC.viewDidLoad()
Он показывает ошибку: член экземпляра «becomeFirstResponder» не может использоваться для типа «FirstVC»; Вы хотели вместо этого использовать значение этого типа?
@Motivationgym5 вам нужно вызвать эту функцию на вашем экземпляре FirstVC. В вашем примере я предполагаю, что это будет (left.rootViewController as? FirstVC)?.becomeFirstResponder() или в viewDidLoad из FirstVC просто позвоните becomeFirstResponder()
Как я уже сказал, это действительно зависит от логики и архитектуры вашего приложения.
где написать firstVC.becomeFirstResponder()?