最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS開發(fā)之運(yùn)動事件和遠(yuǎn)程控制

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

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

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

UIResponder處理運(yùn)動事件的方法:

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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)動開始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    //這里只處理搖晃事件
    if (motion == UIEventSubtypeMotionShake) {
        self.image = [self getImage];
    }
}
#pragma mark 運(yùn)動結(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 視圖顯示時讓控件變成第一響應(yīng)者
- (void)viewDidAppear:(BOOL)animated{
    _imageView = [[KCImageView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    _imageView.userInteractionEnabled = true;
    [self.view addSubview:_imageView];
    [_imageView becomeFirstResponder];
}
#pragma mark 視圖不顯示時注銷控件第一響應(yīng)者的身份
- (void)viewDidDisappear:(BOOL)animated{
    [_imageView resignFirstResponder];
}
@end

運(yùn)動事件實例效果

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

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

復(fù)制代碼 代碼如下:

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,
};

實例:

復(fù)制代碼 代碼如下:

#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)程控制實例效果

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

相關(guān)文章

  • iOS開發(fā)中使用屏幕旋轉(zhuǎn)功能的相關(guān)方法

    iOS開發(fā)中使用屏幕旋轉(zhuǎn)功能的相關(guān)方法

    這篇文章主要介紹了iOS開發(fā)中使用屏幕旋轉(zhuǎn)功能的相關(guān)方法,包括Transform變化矩陣原理的講解,需要的朋友可以參考下
    2015-09-09
  • IOS中的target action控件的實現(xiàn)

    IOS中的target action控件的實現(xiàn)

    這篇文章主要介紹了IOS中的target action控件的實現(xiàn)的相關(guān)資料,這里提供實現(xiàn)target action的簡單實例幫助大家學(xué)習(xí)理解該如何實現(xiàn),需要的朋友可以參考下
    2017-08-08
  • iOS閱讀器與直播的控件重疊滑動交互詳解

    iOS閱讀器與直播的控件重疊滑動交互詳解

    這篇文章主要介紹了iOS閱讀器與直播的控件發(fā)生重疊時滑動交互受到影響的問題,開發(fā)中某個控件出現(xiàn)在其它控件上方是和你常見的情況,但是如果影響到正常的交互這就會成為大問題,下面我們來了解一下
    2022-08-08
  • Objective-C基礎(chǔ) 自定義對象歸檔詳解及簡單實例

    Objective-C基礎(chǔ) 自定義對象歸檔詳解及簡單實例

    這篇文章主要介紹了Objective-C基礎(chǔ) 自定義對象歸檔詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試詳解

    iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試詳解

    這篇文章主要給大家介紹了關(guān)于iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • iOS自定義推送消息提示框

    iOS自定義推送消息提示框

    這篇文章主要為大家詳細(xì)介紹了自定義iOS推送消息提示框的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 深入講解iOS開發(fā)中的UIViewController

    深入講解iOS開發(fā)中的UIViewController

    這篇文章主要介紹了iOS開發(fā)中的UIViewController,其中以UIViewController作為著重講解,需要的朋友可以參考下
    2015-09-09
  • iOS中 UIImage根據(jù)屏寬調(diào)整size的實例代碼

    iOS中 UIImage根據(jù)屏寬調(diào)整size的實例代碼

    最近做項目遇到這樣一個需求,要求UIImage根據(jù)屏幕寬度按照自己本身比例改變高度,下面通過本文給大家分享iOS UIImage根據(jù)屏寬調(diào)整size的實例代碼,需要的朋友參考下吧
    2017-01-01
  • IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解

    IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解

    這篇文章主要介紹了IOS網(wǎng)絡(luò)請求之NSURLSession使用詳解,今天使用NSURLConnection分別實現(xiàn)了get、post、表單提交、文件上傳、文件下載,有興趣的可以了解一下。
    2017-02-02
  • iOS設(shè)置圓角的三種方法

    iOS設(shè)置圓角的三種方法

    這篇文章主要為大家詳細(xì)介紹了iOS設(shè)置圓角的三種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

威远县| 鲁山县| 崇左市| 双桥区| 南阳市| 淳化县| 长寿区| 永兴县| 峨山| 南京市| 汕尾市| 广宁县| 鄯善县| 驻马店市| 安达市| 霍邱县| 大方县| 盘山县| 琼结县| 浠水县| 邓州市| 营山县| 台北市| 阿瓦提县| 阿拉善盟| 基隆市| 乐清市| 江油市| 灵丘县| 亚东县| 盘锦市| 成安县| 资阳市| 新巴尔虎左旗| 梁河县| 平潭县| 宁波市| 阿鲁科尔沁旗| 申扎县| 楚雄市| 韶山市|