觸摸事件包括一個或者多個觸摸(touches), 每個觸摸有一個UITouch對象表示。當觸摸事件發生時,系統會通過觸摸處理的邏輯找到合適的responder並把UIEvent對象傳遞過去。responder通過touchesBegan:withEvent:等方法去接收UIEvent對象。
晃動設備等
主要是外部輔助設備或者耳機的遠程命令,例如控制音樂聲音的大小,或者下一首歌。
/** 下面的四個方法都有的參數: @param NSSet*) touches 觸摸點集合 (根據觸摸點的個數可以判斷是幾個觸摸點) @param event 事件對象,記錄事件產生的時刻和類型(下面的四個方法傳入都是同一個對象) */ // 開始觸摸 // 手指開始觸摸view,系統會自動調用方法 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } // 手指在view上移動,系統會自動調用(隨著手指的移動,會持續調用該方法) -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ } // 一手指離開view,系統會自動調用方法 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ } // 觸摸結束前,有可能系統的事件打斷了觸摸的響應,會調用的方法。(系統方法例如:電話來了) - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { }
UITouch 對象:
我們用手指觸摸屏幕的時候,就會創建一個與觸摸點關聯的 UITouch 對象,每一個觸摸點對應一個UITouch 實例對象
這個對象保存了與觸摸相關的信息(位置、時間、階段)
觸摸點改變(手指移動),系統對應更新 UITouch 對象,適時地記錄觸摸點信息。
觸摸結束時候,UITouch 對象被銷毀
UITouch 方法:
返回當前觸摸點在 View 上面的位置,傳入 View 為 nil 時候位置是在 UIWindow。
- (CGPoint)locationInView:(UIView *)view;
返回前一個觸摸點在 View 上的位置。
- (CGPoint)previousLocationInView:(UIView *)view;
// 開始搖晃 加速計事件 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{ } // 搖晃結束 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{ } // 搖晃取消 - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{ }
准備:
先在targets -> Build Phases -> Link Binary With Libraries裡面添加AudioToolbox.framework;
AudioservicesPlaySystemSound函數來播放簡單的聲音
1.音頻長度小於30秒
2.格式只能是PCM或者IMA4
3.文件必須被存儲為.caf、.aif、或者.wav格式
4.簡單音頻不能從內存播放,而只能是磁盤文件
注意局限性: 無法循環播放聲音,也無法控制立體聲效果。可以設置一個回調函數,在音頻播放結束時被調用,可以對音頻對象做清理工作,以及通知你的程序播放結束。
在模擬器中運行時,可以通過「Hardware」-「Shake Gesture」來測試「搖一搖」功能
導入音頻的頭文件
#import
定義一個回調函數,就是我們搖一搖的音效播放完回調方法函數
// 當音頻播放完畢會調用這個函數// 在完成處理程序標簽存儲在 data 。需要到 __bridge 。static void SoundFinished(SystemSoundID soundID, void *data){ /*播放全部結束,因此釋放所有資源 */ AudioServicesDisposeSystemSoundID(soundID); NSLog(@"%s--->%@",__func__,(__bridge UIViewController *)data); }
設置允許搖一搖功能
// 允許搖一搖功能 [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;// 設置第一響應者 [self becomeFirstResponder];
開始搖晃的時候我們播放音效
// 注冊系統音頻ID SystemSoundID soundID; // 獲取聲音的路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"59" ofType:@"m4a"]; NSURL *soundUrl = [NSURL fileURLWithPath:path]; // 根據路徑創建 AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID); /* *參數說明: * 1、剛剛播放完成自定義系統聲音的ID * 2、回調函數(playFinished)執行的run Loop,NULL表示main run loop * 3、回調函數執行所在run loop的模式,NULL表示默認的run loop mode * 4、需要回調的函數 * 5、傳入的參數, 此參數會被傳入回調函數裡 */ AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, SoundFinished, (__bridge void *)self); // 開始播放 AudioServicesPlaySystemSound (soundID); return; }
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { NSLog(@"取消搖動"); return; } - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionShake) { // 判斷是否是搖動結束 NSLog(@"搖動結束"); } return; }
// 根據傳進來的 event 進行判斷,並進行相應操作即可。 - (void)remoteControlReceivedWithEvent:(UIEvent *)event{}