iOS開發之運動事件和遠端控制_IOS

來源:互聯網
上載者:User

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

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

UIResponder處理運動事件的方法:

複製代碼 代碼如下:

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

你沒有看錯,這裡說的運動事件,只是搖晃一下手機而已,所以只有運動開始、運動結束、運動取消,無法取得運動過程中的運動速度、運動方向等資料,這些需要另外的架構去實現,我們可以理解這裡的運動時間為 “擺動事件” 。

監聽運動事件前提:
監聽對象必須成為第一響應者,控制項需要- (BOOL)canBecomeFirstResponder方法返回YES
在視圖控制器的- (void)viewWillAppear:(BOOL)animated方法中調用運動控制項的becomeFirstResponder方法,使控制項顯示時成為第一響應者
在視圖控制器的- (void)viewDidDisappear:(BOOL)animated方法中調用運動控制項的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 設定控制項可以成為第一響應者
- (BOOL)canBecomeFirstResponder{
    return YES;
}
#pragma mark 運動開始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //這裡只處理搖晃事件
    if (motion == UIEventSubtypeMotionShake) {
        self.image = [self getImage];
    }
}
#pragma mark 運動結束
- (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遠端控制事件,是通過其他遠程裝置觸發的(比如耳機控制按鈕),iOS遠端控制事件相關的只有-(void)remoteControlReceivedWithEvent:(UIEvent *)event

監聽遠端控制事件的前提:
啟動遠程事件接收,調用
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UI控制項同樣要求必須成為第一響應者【使用參考運動事件】
但如果是視圖控制器或UIApplication,就沒有要求成為第一響應者
應用程式必須是 當前音頻額控制者
目前iOS7給我們的遠端控制許可權僅限於音頻控制

複製代碼 代碼如下:

typedef NS_ENUM(NSInteger, UIEventSubtype) {
    // 不包含任何子事件類型
    UIEventSubtypeNone                              = 0,
    // 搖晃事件(從iOS3.0開始支援此事件)
    UIEventSubtypeMotionShake                       = 1,
    //遠端控制子事件類型(從iOS4.0開始支援遠端控制事件)
    //播放事件【操作:停止狀態下,按耳機線控中間按鈕一下】
    UIEventSubtypeRemoteControlPlay                 = 100,
    //暫停事件
    UIEventSubtypeRemoteControlPause                = 101,
    //停止事件
    UIEventSubtypeRemoteControlStop                 = 102,
    //播放或暫停切換【操作:播放或暫停狀態下,按耳機線控中間按鈕一下】
    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:@"http://stream.jewishmusicstream.com:8000"];
    _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 介面狀態
- (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

遠端控制執行個體效果

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.