• iOS开发系列之运动事件


    前面我们主要介绍了触摸事件以及由触摸事件引出的手势识别,下面我们简单介绍一下运动事件。在iOS中和运动相关的有三个事件:开始运动、结束运动、取消运动。

    监听运动事件对于UI控件有个前提就是监听对象必须是第一响应者(对于UIViewController视图控制器和UIAPPlication没有此要求)。这也就意味着如果监听的是一个UI控件那么-(BOOL)canBecomeFirstResponder;方法必须返回YES。同时控件显示时(在-(void)viewWillAppear:(BOOL)animated;事件中)调用视图控制器的becomeFirstResponder方法。当视图不再显示时(在-(void)viewDidDisappear:(BOOL)animated;事件中)注销第一响应者身份。

    由于视图控制器默认就可以调用运动开始、运动结束事件在此不再举例。现在不妨假设我们现在在开发一个摇一摇找人的功能,这里我们就自定义一个图片展示控件,在这个图片控件中我们可以通过摇晃随机切换界面图片。代码比较简单:

    KCImageView.m

    //
    //  KCImageView.m
    //  TouchEventAndGesture
    //
    //  Created by Kenshin Cui on 14-3-16.
    //  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
    //
    
    #import "KCImageView.h"
    #define kImageCount 3
    
    @implementation KCImageView
    
    - (instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            self.image=[self getImage];
        }
        return self;
    }
    
    #pragma mark 设置控件可以成为第一响应者
    -(BOOL)canBecomeFirstResponder{
        return YES;
    }
    
    #pragma mark 运动开始
    -(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        //这里只处理摇晃事件
        if (motion==UIEventSubtypeMotionShake) {
            self.image=[self getImage];
        }
    }
    #pragma mark 运动结束
    -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    
    }
    
    
    #pragma mark 随机取得图片
    -(UIImage *)getImage{
        int index= arc4random()%kImageCount;
        NSString *imageName=[NSString stringWithFormat:@"avatar%i.png",index];
        UIImage *image=[UIImage imageNamed:imageName];
        return image;
    }
    @end

    KCShakeViewController.m

    //
    //  KCShakeViewController.m
    //  TouchEventAndGesture
    //
    //  Created by Kenshin Cui on 14-3-16.
    //  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
    //
    
    #import "KCShakeViewController.h"
    #import "KCImageView.h"
    
    @interface KCShakeViewController (){
        KCImageView *_imageView;
    }
    
    @end
    
    @implementation KCShakeViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
    
    }
    
    #pragma mark 视图显示时让控件变成第一响应者
    -(void)viewDidAppear:(BOOL)animated{
        _imageView=[[KCImageView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
        _imageView.userInteractionEnabled=true;
        [self.view addSubview:_imageView];
        [_imageView becomeFirstResponder];
    }
    
    #pragma mark 视图不显示时注销控件第一响应者的身份
    -(void)viewDidDisappear:(BOOL)animated{
        [_imageView resignFirstResponder];
    }
    
    /*视图控制器的运动事件*/
    //-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //    NSLog(@"motion begin...");
    //}
    //
    //-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //    NSLog(@"motion end.");
    //}
    
    @end

    运行效果(下图演示时使用了模拟器摇晃操作的快捷键,没有使用鼠标操作):

  • 相关阅读:
    009---绑定方法与非绑定方法
    008---封装
    007---多态与多态性
    17.出现fatal signal(SIGSEGV),code 1,fault addr 0x0 in tid 29931的问题
    18.让sublime text3支持Vue语法高亮显示
    PNPoly算法代码例子,判断一个点是否在多边形里面
    5.如何调节ubuntu的分辨率
    4.ubuntu实现linux与windows的互相复制与粘贴
    16.遇到就jar mismatch! Fix your dependencies的问题
    15.遇到window leaked的解决方法
  • 原文地址:https://www.cnblogs.com/fengmin/p/5548425.html
Copyright © 2020-2023  润新知