美文网首页iOS 开发 iOS Developer
iOS 基础--UIEvent 事件类型简单总结(触摸、摇一摇、

iOS 基础--UIEvent 事件类型简单总结(触摸、摇一摇、

作者: 云之君兮鹏 | 来源:发表于2016-10-10 11:17 被阅读497次
遥知兄弟登高处,遍插茱萸少一人!<波波鸽.png>

UIEvent 事件类型:

  • 触摸事件(UIEventTypeTouches )

    • 触摸事件包括一个或者多个触摸(touches), 每个触摸有一个UITouch对象表示。当触摸事件发生时,系统会通过触摸处理的逻辑找到合适的responder并把UIEvent对象传递过去。responder通过touchesBegan:withEvent:等方法去接收UIEvent对象。
  • 加速计事件,运动事件(UIEventTypeMotion )

    • 晃动设备等
  • 远程控制事件 (UIEventTypeRemoteControl)

    • 主要是外部辅助设备或者耳机的远程命令,例如控制音乐声音的大小,或者下一首歌。

  • 触摸相关方法:


/**
 下面的四个方法都有的参数:
 @param NSSet <UITouch *> *) touches 触摸点集合 (根据触摸点的个数可以判断是几个触摸点)
 @param event   事件对象,记录事件产生的时刻和类型(下面的四个方法传入都是同一个对象)
 */


// 开始触摸
// 手指开始触摸view,系统会自动调用方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
}
// 手指在view上移动,系统会自动调用(随着手指的移动,会持续调用该方法)
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
}
// 一手指离开view,系统会自动调用方法
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
}
// 触摸结束前,有可能系统的事件打断了触摸的响应,会调用的方法。(系统方法例如:电话来了)
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
}

UITouch 对象:

  • 我们用手指触摸屏幕的时候,就会创建一个与触摸点关联的 UITouch 对象,每一个触摸点对应一个UITouch 实例对象
  • 这个对象保存了与触摸相关的信息(位置、时间、阶段)
  • 触摸点改变(手指移动),系统对应更新 UITouch 对象,适时地记录触摸点信息。
  • 触摸结束时候,UITouch 对象被销毁

UITouch 方法:

  • 返回当前触摸点在 View 上面的位置,传入 View 为 nil 时候位置是在 UIWindow。
    - (CGPoint)locationInView:(UIView *)view;
  • 返回前一个触摸点在 View 上的位置。
    - (CGPoint)previousLocationInView:(UIView *)view;

  • 加速相关方法:

// 开始摇晃 加速计事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    
}
// 摇晃结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    
}
// 摇晃取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    
}```
##### 小例子:[摇一摇简单实现GitHub](https://github.com/YunZhiJunXiPeng/HotTool.git)
- 准备:
>- 先在targets -> Build Phases -> Link Binary With Libraries里面添加AudioToolbox.framework;
   -  >AudioservicesPlaySystemSound函数来播放简单的声音
 1.音频长度小于30秒
 2.格式只能是PCM或者IMA4
 3.文件必须被存储为.caf、.aif、或者.wav格式
 4.简单音频不能从内存播放,而只能是磁盘文件
     - 注意局限性: 无法循环播放声音,也无法控制立体声效果。可以设置一个回调函数,在音频播放结束时被调用,可以对音频对象做清理工作,以及通知你的程序播放结束。 
  - 在模拟器中运行时,可以通过「Hardware」-「Shake Gesture」来测试「摇一摇」功能

-------
- 导入音频的头文件
```code
#import <AudioToolbox/AudioToolbox.h>```
- 定义一个回调函数,就是我们摇一摇的音效播放完回调方法函数
```code
// 当音频播放完毕会调用这个函数
// 在完成处理程序标签存储在 data 。需要到 __bridge 。
static void SoundFinished(SystemSoundID soundID, void *data){
    /*播放全部结束,因此释放所有资源 */
    AudioServicesDisposeSystemSoundID(soundID);
    NSLog(@"%s--->%@",__func__,(__bridge UIViewController *)data);
}
  • 设置允许摇一摇功能
// 允许摇一摇功能
    [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
  // 设置第一响应者
    [self becomeFirstResponder];```

- 开始摇晃的时候我们播放音效
```code 
// 注册系统音频ID
    SystemSoundID soundID;
    
    // 获取声音的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"59" ofType:@"m4a"];
    NSURL *soundUrl = [NSURL fileURLWithPath:path];
    
    // 根据路径创建
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID);
    /*
     
     *参数说明:
     * 1、刚刚播放完成自定义系统声音的ID
     * 2、回调函数(playFinished)执行的run Loop,NULL表示main run loop
     * 3、回调函数执行所在run loop的模式,NULL表示默认的run loop mode
     * 4、需要回调的函数
     * 5、传入的参数, 此参数会被传入回调函数里
     */
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, SoundFinished, (__bridge void *)self);
    
    // 开始播放
    AudioServicesPlaySystemSound (soundID);
    return;
}```


```code
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"取消摇动");
    return;
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (event.subtype == UIEventSubtypeMotionShake) {
        // 判断是否是摇动结束
        NSLog(@"摇动结束");
    }  
    return;  
}

远程控制相关:

// 根据传进来的 event 进行判断,并进行相应操作即可。
- (void)remoteControlReceivedWithEvent:(UIEvent *)event{}```

相关文章

网友评论

    本文标题:iOS 基础--UIEvent 事件类型简单总结(触摸、摇一摇、

    本文链接:https://www.haomeiwen.com/subject/khsmyttx.html