遥知兄弟登高处,遍插茱萸少一人!<波波鸽.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{}```
网友评论