Обнаружение встряхивания жестом IOS Swift
Я разрабатываю приложение с системой жестов, в основном, если я поверну iPhone влево, мое приложение выполнит функцию, если я поверну iPhone вправо, другую функцию с другими жестами.
Я понятия не имею, как с этим работать, я пытаюсь найти в Google, но не работаю, в результате только жест касания, а не жест движения.
у кого-то есть учебник, чтобы помочь мне?
4 ответа
Swift3 ios10:
override func viewDidLoad() {
super.viewDidLoad()
self.becomeFirstResponder() // To get shake gesture
}
// We are willing to become first responder to get shake motion
override var canBecomeFirstResponder: Bool {
get {
return true
}
}
// Enable detection of shake motion
override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {
if motion == .motionShake {
print("Why are you shaking me?")
}
}
Супер прост в реализации:
1) Сообщите iOS, какой контроллер представления является первым в цепочке респондента:
override func viewDidLoad() {
super.viewDidLoad()
self.becomeFirstResponder()
}
override func canBecomeFirstResponder() -> Bool {
return true
}
2) Обработайте событие некоторым способом:
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
if(event.subtype == UIEventSubtype.MotionShake) {
print("You shook me, now what")
}
}
Swift 5
Просто добавьте следующие методы в ViewController и выполните код
override func becomeFirstResponder() -> Bool {
return true
}
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
if motion == .motionShake
{
print("Shake Gesture Detected")
//show some alert here
}
}
Это было обновлено для IOS 12 - см. Apple Docs Вам больше не нужно добавлять метод comeFirstResponder().
Вам просто нужно добавить функцию motionEnded в ваш код.
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
{
// code here
}
Swift 4, 5
iOS 10+
UIApplication
,
UIViewController
,
UIView
, и
UIWindow
являются все
UIResponder
объекты по умолчанию, что означает, что все они могут обрабатывать события движения, такие как дрожание, без какой-либо специальной настройки. Поэтому просто переопределите соответствующий метод движения:
class YourViewController: UIViewController {
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
if motion == .motionShake {
print("device did shake")
}
}
}
Кроме того, вы можете переопределить
motionBegan(_:with:)
и
motionCancelled(_:with:)
. И, в отличие от переопределения определенных событий касания, нет необходимости вызывать super.
Swift 5
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.becomeFirstResponder()
}
override var canBecomeFirstResponder: Bool {
get {
return true
}
}
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
if motion == .motionShake {
print("shake")
}
}
}
Быстрый ответ Speedy99 в версии Objective C
- (void)viewDidLoad {
[super viewDidLoad];
[self becomeFirstResponder];
}
- (BOOL)canBecomeFirstResponder{
return true;
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
if(event.subtype == UIEventSubtypeMotionShake){
NSLog(@"Why are you shaking me?");
}
}
Документы swift: - https://developer.apple.com/documentation/uikit/uiresponder.
Для обнаружения событий движения Swift предусмотрел 3 метода:
func motionBegan() -> Сообщает получателю, что движение началось
func motionEnded() -> Сообщает получателю, что событие движения закончилось
- func motionCancelled() -> Сообщает получателю, что событие движения было отменено
Например, если вы хотите обновить изображение после встряхивания жестом
class ViewController: UIViewController {
override func motionEnded(_ motion: UIEvent.EventSubtype, with event:
UIEvent?)
{
updateImage()
}
UpdateImage(){
// Implementation
}
}