欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS開發(fā)之運動事件和遠程控制

 更新時間:2016年04月28日 09:19:50   作者:執(zhí)著丶執(zhí)念  
在iOS中事件分為三類:觸摸事件:通過觸摸、手勢進行觸發(fā)(例如手指點擊、縮放),運動事件:通過加速器進行觸發(fā)(例如手機晃動),遠程控制事件:通過其他遠程設(shè)備觸發(fā)(例如耳機控制按鈕)今天我們來詳細探討下運動事件和遠程控制

之前我們已經(jīng)學習了觸摸處理和手勢識別,其實這兩個同屬于iOS事件的觸摸事件,今天我們來學習下iOS事件的另外兩個事件:

一、運動事件
運動事件,是通過加速器進行觸發(fā),和觸摸事件一樣,繼承UIResponder類的對象才能處理運動事件

UIResponder處理運動事件的方法:

復制代碼 代碼如下:

#pragma mark 運動開始時執(zhí)行
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
#pragma mark 運動結(jié)束后執(zhí)行
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
#pragma mark 運動被意外取消時執(zhí)行
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

你沒有看錯,這里說的運動事件,只是搖晃一下手機而已,所以只有運動開始、運動結(jié)束、運動取消,無法取得運動過程中的運動速度、運動方向等數(shù)據(jù),這些需要另外的框架去實現(xiàn),我們可以理解這里的運動時間為 “擺動事件” 。

監(jiān)聽運動事件前提:
監(jiān)聽對象必須成為第一響應者,控件需要- (BOOL)canBecomeFirstResponder方法返回YES
在視圖控制器的- (void)viewWillAppear:(BOOL)animated方法中調(diào)用運動控件的becomeFirstResponder方法,使控件顯示時成為第一響應者
在視圖控制器的- (void)viewDidDisappear:(BOOL)animated方法中調(diào)用運動控件的resignFirstResponder方法,使控件不顯示時注銷控件的第一響應者身份
實例:

復制代碼 代碼如下:

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è)置控件可以成為第一響應者
- (BOOL)canBecomeFirstResponder{
    return YES;
}
#pragma mark 運動開始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //這里只處理搖晃事件
    if (motion == UIEventSubtypeMotionShake) {
        self.image = [self getImage];
    }
}
#pragma mark 運動結(jié)束
- (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
#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];
}
@end

運動事件實例效果

二、遠程控制事件
iOS遠程控制事件,是通過其他遠程設(shè)備觸發(fā)的(比如耳機控制按鈕),iOS遠程控制事件相關(guān)的只有-(void)remoteControlReceivedWithEvent:(UIEvent *)event

監(jiān)聽遠程控制事件的前提:
啟動遠程事件接收,調(diào)用
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UI控件同樣要求必須成為第一響應者【使用參考運動事件】
但如果是視圖控制器或UIApplication,就沒有要求成為第一響應者
應用程序必須是 當前音頻額控制者
目前iOS7給我們的遠程控制權(quán)限僅限于音頻控制

復制代碼 代碼如下:

typedef NS_ENUM(NSInteger, UIEventSubtype) {
    // 不包含任何子事件類型
    UIEventSubtypeNone                              = 0,
    // 搖晃事件(從iOS3.0開始支持此事件)
    UIEventSubtypeMotionShake                       = 1,
    //遠程控制子事件類型(從iOS4.0開始支持遠程控制事件)
    //播放事件【操作:停止狀態(tài)下,按耳機線控中間按鈕一下】
    UIEventSubtypeRemoteControlPlay                 = 100,
    //暫停事件
    UIEventSubtypeRemoteControlPause                = 101,
    //停止事件
    UIEventSubtypeRemoteControlStop                 = 102,
    //播放或暫停切換【操作:播放或暫停狀態(tài)下,按耳機線控中間按鈕一下】
    UIEventSubtypeRemoteControlTogglePlayPause      = 103,
    //下一曲【操作:按耳機線控中間按鈕兩下】
    UIEventSubtypeRemoteControlNextTrack            = 104,
    //上一曲【操作:按耳機線控中間按鈕三下】
    UIEventSubtypeRemoteControlPreviousTrack        = 105,
    //快退開始【操作:按耳機線控中間按鈕三下不要松開】
    UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
    //快退停止【操作:按耳機線控中間按鈕三下到了快退的位置松開】
    UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
    //快進開始【操作:按耳機線控中間按鈕兩下不要松開】
    UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
    //快進停止【操作:按耳機線控中間按鈕兩下到了快進的位置松開】
    UIEventSubtypeRemoteControlEndSeekingForward    = 109,
};

實例:

復制代碼 代碼如下:

#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 遠程控制事件
- (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

遠程控制實例效果

這次筆記貼了很多代碼,是因為這兩個事件使用簡單,理論知識不多,光講理論,也不好理解,貼代碼非常直觀。

相關(guān)文章

  • 淺談RxSwift 網(wǎng)絡(luò)請求

    淺談RxSwift 網(wǎng)絡(luò)請求

    這篇文章主要介紹了淺談RxSwift 網(wǎng)絡(luò)請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • IOS開發(fā)中鍵盤輸入屏幕上移的解決方法

    IOS開發(fā)中鍵盤輸入屏幕上移的解決方法

    在IOS開法中經(jīng)常會遇到鍵盤遮擋屏幕的事情,經(jīng)常檔住下面的按鈕,下面小編給大家分享IOS開發(fā)中鍵盤輸入屏幕上移的解決方法,感興趣的朋友一起看看吧
    2016-10-10
  • iOS 屏幕解鎖文字動畫效果

    iOS 屏幕解鎖文字動畫效果

    這篇文章主要介紹了iOS 屏幕解鎖文字動畫效果的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • iOS開發(fā)中的幾個手勢操作實例分享

    iOS開發(fā)中的幾個手勢操作實例分享

    這篇文章主要介紹了iOS開發(fā)中的幾個手勢操作實例分享,編寫代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-09-09
  • IOS開發(fā)之路--C語言基礎(chǔ)知識

    IOS開發(fā)之路--C語言基礎(chǔ)知識

    當前移動開發(fā)的趨勢已經(jīng)勢不可擋,這個系列希望淺談一下個人對IOS開發(fā)的一些見解,今天我們從最基礎(chǔ)的C語言開始,C語言部分我將分成幾個章節(jié)去說,今天我們簡單看一下C的一些基礎(chǔ)知識,更高級的內(nèi)容我將放到后面的文章中。
    2014-08-08
  • 詳解iOS 加載本地HTML,css,js

    詳解iOS 加載本地HTML,css,js

    本篇文章主要介紹了詳解iOS 加載本地HTML,css,js,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 淺談iOS關(guān)于頭文件的導入問題

    淺談iOS關(guān)于頭文件的導入問題

    本篇文章主要介紹了淺談iOS關(guān)于頭文件的導入問題,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • iOS實現(xiàn)按鈕點擊選中與被選中切換功能

    iOS實現(xiàn)按鈕點擊選中與被選中切換功能

    這篇文章主要介紹了iOS實現(xiàn)按鈕點擊選中與被選中切換功能,需要的朋友可以參考下
    2017-07-07
  • iOS 監(jiān)聽回調(diào)機制KVO實例

    iOS 監(jiān)聽回調(diào)機制KVO實例

    下面小編就為大家分享一篇iOS 監(jiān)聽回調(diào)機制KVO實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS實現(xiàn)漸變按鈕Gradient Button的方法示例

    iOS實現(xiàn)漸變按鈕Gradient Button的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實現(xiàn)漸變按鈕Gradient Button的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08

最新評論