iOS開發(fā)之運(yùn)動(dòng)事件和遠(yuǎn)程控制
之前我們已經(jīng)學(xué)習(xí)了觸摸處理和手勢識(shí)別,其實(shí)這兩個(gè)同屬于iOS事件的觸摸事件,今天我們來學(xué)習(xí)下iOS事件的另外兩個(gè)事件:
一、運(yùn)動(dòng)事件
運(yùn)動(dòng)事件,是通過加速器進(jìn)行觸發(fā),和觸摸事件一樣,繼承UIResponder類的對(duì)象才能處理運(yùn)動(dòng)事件
UIResponder處理運(yùn)動(dòng)事件的方法:
#pragma mark 運(yùn)動(dòng)開始時(shí)執(zhí)行
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
#pragma mark 運(yùn)動(dòng)結(jié)束后執(zhí)行
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
#pragma mark 運(yùn)動(dòng)被意外取消時(shí)執(zhí)行
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
你沒有看錯(cuò),這里說的運(yùn)動(dòng)事件,只是搖晃一下手機(jī)而已,所以只有運(yùn)動(dòng)開始、運(yùn)動(dòng)結(jié)束、運(yùn)動(dòng)取消,無法取得運(yùn)動(dòng)過程中的運(yùn)動(dòng)速度、運(yùn)動(dòng)方向等數(shù)據(jù),這些需要另外的框架去實(shí)現(xiàn),我們可以理解這里的運(yùn)動(dòng)時(shí)間為 “擺動(dòng)事件” 。
監(jiān)聽運(yùn)動(dòng)事件前提:
監(jiān)聽對(duì)象必須成為第一響應(yīng)者,控件需要- (BOOL)canBecomeFirstResponder方法返回YES
在視圖控制器的- (void)viewWillAppear:(BOOL)animated方法中調(diào)用運(yùn)動(dòng)控件的becomeFirstResponder方法,使控件顯示時(shí)成為第一響應(yīng)者
在視圖控制器的- (void)viewDidDisappear:(BOOL)animated方法中調(diào)用運(yùn)動(dòng)控件的resignFirstResponder方法,使控件不顯示時(shí)注銷控件的第一響應(yīng)者身份
實(shí)例:
KCImageView.m
#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 設(shè)置控件可以成為第一響應(yīng)者
- (BOOL)canBecomeFirstResponder{
return YES;
}
#pragma mark 運(yùn)動(dòng)開始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//這里只處理搖晃事件
if (motion == UIEventSubtypeMotionShake) {
self.image = [self getImage];
}
}
#pragma mark 運(yùn)動(dòng)結(jié)束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
}
#pragma mark 隨機(jī)取得圖片
- (UIImage *)getImage{
int index = arc4random() % kImageCount;
NSString *imageName = [NSString stringWithFormat:@"avatar%i.png",index];
UIImage *image = [UIImage imageNamed:imageName];
return image;
}
@end
KCShakeViewController.m
#import "KCShakeViewController.h"
#import "KCImageView.h"
@interface KCShakeViewController (){
KCImageView *_imageView;
}
@end
@implementation KCShakeViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark 視圖顯示時(shí)讓控件變成第一響應(yīng)者
- (void)viewDidAppear:(BOOL)animated{
_imageView = [[KCImageView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
_imageView.userInteractionEnabled = true;
[self.view addSubview:_imageView];
[_imageView becomeFirstResponder];
}
#pragma mark 視圖不顯示時(shí)注銷控件第一響應(yīng)者的身份
- (void)viewDidDisappear:(BOOL)animated{
[_imageView resignFirstResponder];
}
@end
運(yùn)動(dòng)事件實(shí)例效果

二、遠(yuǎn)程控制事件
iOS遠(yuǎn)程控制事件,是通過其他遠(yuǎn)程設(shè)備觸發(fā)的(比如耳機(jī)控制按鈕),iOS遠(yuǎn)程控制事件相關(guān)的只有-(void)remoteControlReceivedWithEvent:(UIEvent *)event
監(jiān)聽遠(yuǎn)程控制事件的前提:
啟動(dòng)遠(yuǎn)程事件接收,調(diào)用
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UI控件同樣要求必須成為第一響應(yīng)者【使用參考運(yùn)動(dòng)事件】
但如果是視圖控制器或UIApplication,就沒有要求成為第一響應(yīng)者
應(yīng)用程序必須是 當(dāng)前音頻額控制者
目前iOS7給我們的遠(yuǎn)程控制權(quán)限僅限于音頻控制
typedef NS_ENUM(NSInteger, UIEventSubtype) {
// 不包含任何子事件類型
UIEventSubtypeNone = 0,
// 搖晃事件(從iOS3.0開始支持此事件)
UIEventSubtypeMotionShake = 1,
//遠(yuǎn)程控制子事件類型(從iOS4.0開始支持遠(yuǎn)程控制事件)
//播放事件【操作:停止?fàn)顟B(tài)下,按耳機(jī)線控中間按鈕一下】
UIEventSubtypeRemoteControlPlay = 100,
//暫停事件
UIEventSubtypeRemoteControlPause = 101,
//停止事件
UIEventSubtypeRemoteControlStop = 102,
//播放或暫停切換【操作:播放或暫停狀態(tài)下,按耳機(jī)線控中間按鈕一下】
UIEventSubtypeRemoteControlTogglePlayPause = 103,
//下一曲【操作:按耳機(jī)線控中間按鈕兩下】
UIEventSubtypeRemoteControlNextTrack = 104,
//上一曲【操作:按耳機(jī)線控中間按鈕三下】
UIEventSubtypeRemoteControlPreviousTrack = 105,
//快退開始【操作:按耳機(jī)線控中間按鈕三下不要松開】
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
//快退停止【操作:按耳機(jī)線控中間按鈕三下到了快退的位置松開】
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
//快進(jìn)開始【操作:按耳機(jī)線控中間按鈕兩下不要松開】
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
//快進(jìn)停止【操作:按耳機(jī)線控中間按鈕兩下到了快進(jìn)的位置松開】
UIEventSubtypeRemoteControlEndSeekingForward = 109,
};
實(shí)例:
#import "ViewController.h"
@interface ViewController (){
UIButton *_playButton;
BOOL _isPlaying;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self initLayout];
}
- (BOOL)canBecomeFirstResponder{
return NO;
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSURL *url = [NSURL URLWithString:@" _player = [[AVPlayer alloc] initWithURL:url];
}
#pragma mark 遠(yuǎn)程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event{
if(event.type == UIEventTypeRemoteControl){
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
[_player play];
_isPlaying = true;
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
[self btnClick:_playButton];
break;
case UIEventSubtypeRemoteControlNextTrack:
NSLog(@"Next...");
break;
case UIEventSubtypeRemoteControlPreviousTrack:
NSLog(@"Previous...");
break;
case UIEventSubtypeRemoteControlBeginSeekingForward:
NSLog(@"Begin seek forward...");
break;
case UIEventSubtypeRemoteControlEndSeekingForward:
NSLog(@"End seek forward...");
break;
case UIEventSubtypeRemoteControlBeginSeekingBackward:
NSLog(@"Begin seek backward...");
break;
case UIEventSubtypeRemoteControlEndSeekingBackward:
NSLog(@"End seek backward...");
break;
default:
break;
}
[self changeUIState];
}
}
#pragma mark 界面布局
- (void)initLayout{
//專輯封面
UIImage *image = [UIImage imageNamed:@"wxl.jpg"];
CGRect *frame = [UIScreen mainScreen].applicationFrame;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = image;
imageView.contentMode = UIViewContentModeScaleAspectFill;
[self.view addSubview:imageView];
//播放控制面板
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 480, 320, 88)];
view.backgroundColor = [UIColor lightGrayColor];
view.alpha = 0.9;
[self.view addSubview:view];
//添加播放按鈕
_playButton = [UIButton buttonWithType:UIButtonTypeCustom];
_playButton.bounds = CGRectMake(0, 0, 50, 50);
CGFloat playBtnX = view.frame.size.width/2;
CGFloat playBtnY = view.frame.size.height/2;
_playButton.center = CGPointMake(playBtnX, playBtnY);
[self changeUIState];
[_playButton addTarget:self
action:@selector(btnClick:)
forControlEvents:UIControlEventTouchUpInside];
[view addSubview:_playButton];
}
#pragma mark 界面狀態(tài)
- (void)changeUIState{
if(_isPlaying){
UIImage *pauseImage = [UIImage imageNamed:@"playing_btn_pause_n.png"];
UIImage *pauseImageH = [UIImage imageNamed:@"playing_btn_pause_h.png"];
[_playButton setImage:pauseImage forState:UIControlStateNormal];
[_playButton setImage:pauseImageH forState:UIControlStateHighlighted];
}else{
UIImage *playImage = [UIImage imageNamed:@"playing_btn_play_n.png"];
UIImage *playImageH = [UIImage imageNamed:@"playing_btn_play_h.png"];
[_playButton setImage:playImage forState:UIControlStateNormal];
[_playButton setImage:playImageH forState:UIControlStateHighlighted];
}
}
- (void)btnClick:(UIButton *)btn{
if (_isPlaying) {
[_player pause];
}else{
[_player play];
}
_isPlaying =! _isPlaying;
[self changeUIState];
}
@end
遠(yuǎn)程控制實(shí)例效果

這次筆記貼了很多代碼,是因?yàn)檫@兩個(gè)事件使用簡單,理論知識(shí)不多,光講理論,也不好理解,貼代碼非常直觀。
- Nagios遠(yuǎn)程監(jiān)控安裝與配置詳解圖文
- iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼
- iOS實(shí)現(xiàn)遠(yuǎn)程推送原理及過程
- iOS實(shí)現(xiàn)播放遠(yuǎn)程網(wǎng)絡(luò)音樂的核心技術(shù)點(diǎn)總結(jié)
- iOS10最新實(shí)現(xiàn)遠(yuǎn)程通知的開發(fā)教程詳解
- 詳解iOS本地推送與遠(yuǎn)程推送
- iOS消息遠(yuǎn)程推送通知
- iOS實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)的改變
- iOS實(shí)現(xiàn)實(shí)時(shí)檢測網(wǎng)絡(luò)狀態(tài)的示例代碼
- iOS中的實(shí)時(shí)遠(yuǎn)程配置全紀(jì)錄
相關(guān)文章
iOS開發(fā)中使用屏幕旋轉(zhuǎn)功能的相關(guān)方法
這篇文章主要介紹了iOS開發(fā)中使用屏幕旋轉(zhuǎn)功能的相關(guān)方法,包括Transform變化矩陣原理的講解,需要的朋友可以參考下2015-09-09
IOS中的target action控件的實(shí)現(xiàn)
這篇文章主要介紹了IOS中的target action控件的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)target action的簡單實(shí)例幫助大家學(xué)習(xí)理解該如何實(shí)現(xiàn),需要的朋友可以參考下2017-08-08
Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡單實(shí)例
這篇文章主要介紹了Objective-C基礎(chǔ) 自定義對(duì)象歸檔詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試詳解
這篇文章主要給大家介紹了關(guān)于iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
深入講解iOS開發(fā)中的UIViewController
這篇文章主要介紹了iOS開發(fā)中的UIViewController,其中以UIViewController作為著重講解,需要的朋友可以參考下2015-09-09
iOS中 UIImage根據(jù)屏寬調(diào)整size的實(shí)例代碼
最近做項(xiàng)目遇到這樣一個(gè)需求,要求UIImage根據(jù)屏幕寬度按照自己本身比例改變高度,下面通過本文給大家分享iOS UIImage根據(jù)屏寬調(diào)整size的實(shí)例代碼,需要的朋友參考下吧2017-01-01
IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用詳解
這篇文章主要介紹了IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用詳解,今天使用NSURLConnection分別實(shí)現(xiàn)了get、post、表單提交、文件上傳、文件下載,有興趣的可以了解一下。2017-02-02

