UIScrollView не распознает ShakeGesture

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")
        }
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Поэтому убедитесь, что:

  1. FirstVC смог стать первым ответившим:
override var canBecomeFirstResponder: Bool {
    return true
}
  1. FirstVC является первым ответчиком в определенный момент времени:
firstVC.becomeFirstResponder()

Теперь ваш UIViewController сможет получать события встряхивания.

Вы можете прочитать больше о цепочке Responder: Как работает цепочка ответчиков в iPhone? Что такое «следующие ответчики»?

где написать firstVC.becomeFirstResponder()?

Motivation gym5 21.03.2019 16:33

@ Motivationgym5 это действительно зависит от логики вашего приложения. Проще всего поставить его в конце ContainerVC.viewDidLoad()

ManWithBear 21.03.2019 16:35

Он показывает ошибку: член экземпляра «becomeFirstResponder» не может использоваться для типа «FirstVC»; Вы хотели вместо этого использовать значение этого типа?

Motivation gym5 21.03.2019 16:42

@Motivationgym5 вам нужно вызвать эту функцию на вашем экземпляре FirstVC. В вашем примере я предполагаю, что это будет (left.rootViewController as? FirstVC)?.becomeFirstResponder() или в viewDidLoad из FirstVC просто позвоните becomeFirstResponder()

ManWithBear 21.03.2019 22:22

Как я уже сказал, это действительно зависит от логики и архитектуры вашего приложения.

ManWithBear 21.03.2019 22:25

Другие вопросы по теме