事件传递、事件响应
学习事件传递、事件响应极力推荐:http://www.jianshu.com/p/2e074db792ba (写的真心很棒,本来还打算自己写一个博客呢,但是发现自己无论如何也达不到那种程度,所以仅仅是把链接贴出来,一方面是为了关注我的朋友能去了解一下,另一方面也是为了给自己学习过程留下一个痕迹)
UIResponder学习
转载(http://blog.csdn.net/maojudong/article/details/7798138)
简介
此类继承自NSObject所属的框架UIKit.framework定义了一些接口对象,然后响应事件,它是 UIApplication, UIView 和UIWindow等的父类
iOS 中,所有显示在界面上的对象都是从 UIResponder 直接或间接继承的。
最新版本的iOS中有三种类型事件:
- 触摸事件(通过触摸、手势进行触发(例如手指点击、缩放))
- motion事件(通过加速器进行触发(例如手机晃动))
-
远程控制(通过其他远程设备触发(例如耳机控制按钮))
下图是苹果官方对于这三种事件的形象描述:
20140902191747111.png
触摸事件
只要手指触摸屏幕,滑动,从屏幕离开,系统都会产生UIEvent对象类型的事件---当然包括UITouch事件
– touchesBegan:withEvent: 当用户触摸到屏幕时调用方法
– touchesMoved:withEvent: 当用户触摸到屏幕并移动时调用此方法
– touchesEnded:withEvent: 当触摸离开屏幕时调用此方法
– touchesCancelled:withEvent: 当触摸被取消时调用此方法(例如正在触摸过程中,接到了一个电话,则会调用该方法)
motion事件
iOS 3.0 + 开始支持motion事件,特别是摇动设备
– motionBegan:withEvent: 运动开始时执行
– motionEnded:withEvent: 运动结束时执行
– motionCancelled:withEvent: 运动被取消时执行
远程控制(remote control)
iOS 4.0 + 开始支持远程事件
– remoteControlReceivedWithEvent:
比较常用的响应链函数
2.会用到的有一些“响应链”函数
– nextResponder下一个响应者(父控件)
– isFirstResponder是否是第一响应者
– canBecomeFirstResponder能够成为第一响应者
– becomeFirstResponder变成第一响应者
– canResignFirstResponder可以失去第一响应者
– resignFirstResponder失去第一响应者
输入试图相关
输入视图是指当对象为 firstResponder 对象时,需要借助另外一个视图用来处理当前对象的信息输入,如 UITextView 和 UITextField 两个对象,在 UITextField 成为 firstResponder 对象时,会显示一个系统键盘,用来输入信息。这个键盘视图就是一个输入视图了。一共有两个相关的输入视图,一个是 inputView, 另一个是 inputAccessoryView,这两个视图显示的关系如下图:

从图中可以看到, 如果 inputView 和 inputAccessoryView 两个属性都指定了相应的视图,则 inputAccessoryView 对象显示在 inputView 对象的上面。
- reloadInputViews这个方法是当view是第一响应者的时候,可以更新inputView和inputAccessoryView,官方给的解释是:You can use this method to refresh the custom input view or input accessory view associated with the current object when it is the first responder. The views are replaced immediately—that is, without animating them into place. If the current object is not the first responder, this method has no effect.
当是第一响应者的时候,通过这个方法,可以去替换inputView和inputAccessoryView,如果不是第一响应者的时候,调用该方法没有效果。
以下是两个从网上获取的两个小例子:
摇一摇播放音效
#import “ViewController.h”
@interface ViewController () {
BOOL acceptNextShake;
}
@end
@implementation ViewController
// 封装一个播放段音频的方法
-(void)playSoundEffect:(NSString )name withCallback:(void ()(SystemSoundID, void )) callback {
NSString audioFile = [[NSBundle mainBundle] pathForResource:name ofType:nil];
NSURL *fileUrl = [NSURL fileURLWithPath:audioFile];
SystemSoundID soundID;
// 在系统中创建一个音效对象并获得其唯一ID
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);
// 注册在播放完之后执行的回调函数
// 第二个和第三个参数跟循环播放有关
// 第五个参数是指向传给回调函数的数据的指针
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, callback, NULL);
// 播放音效
AudioServicesPlaySystemSound(soundID);
// 播放音效并震动
// AudioServicesPlayAlertSound(soundID);
}
// 摇一摇开始播放金币掉下的短音频
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if(acceptNextShake) {
acceptNextShake = NO;
[self playSoundEffect:@"4679.mp3" withCallback:nil];
// 阻止播放音效文件5秒钟
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(5);
acceptNextShake = YES;
});
}
}
-(void)viewDidLoad {
[super viewDidLoad];
acceptNextShake = YES;
}
@end
耳机远程事件参考链接:
http://www.it165.net/pro/html/201409/21350.html (iOS开发系列触摸事件、手势识别、摇晃事件、耳机线控)
特别推荐博客:
- http://www.it165.net/pro/html/201409/21350.html (iOS开发系列触摸事件、手势识别、摇晃事件、耳机线控)
- http://www.jianshu.com/users/93131dfba96a/latest_articl(史上最详细的iOS之事件的传递和响应机制)
欢迎关注我的个人微信公众号,免费送计算机各种最新视频资源!你想象不到的精彩!

网友评论