아이폰 3.0 SDK 부터는 accelerometer를 사용하지 않고도 UIResponder에 추가된 motion 이벤트 처리 메소드를 구현함으로써 간단하게 사용자의 흔들기 동작을 체크할 수 있습니다. 저도 처음 사용해 보면서 간단한 내용들을 정리해 보았습니다.

1. First responder 되기
사용자의 흔들기 이벤트를 처리할 ViewController는 그 자신이 First responder가 되어야 합니다. becomFirstResponder 메소드를 호출하고 canBecomeFirstResponder 메소드에서 YES를 반환합니다.

  1. - (void)viewDidAppear:(BOOL)animated {
  2.     [super viewDidAppear:animated];
  3.     [self becomeFirstResponder];
  4. }
  5.  
  6. - (BOOL)canBecomeFirstResponder {
  7.     return YES;
  8. }

viewDidAppear는 코드에서 서브뷰로 추가될 때만 호출됩니다. IB에서 바로 Window에 View를 추가하였으면 awakeFromNib등의 메소드에서 becomFirstResponder를 호출하셔야 합니다.

2. motion 메소드 구현
이후로는 간단합니다. 사용자의 흔들기가 시작되면 해당 motionBegan이 호출되고 종료될 때 motionEnded가 호출됩니다. 지나치게 많이 흔들거나 하여 유효하지 않은 흔들기로 판단될 때는 motionCancelled가 호출됩니다.

  1. - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
  2.     NSLog(@"Shaking start");
  3. }
  4.  
  5. - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
  6.     NSLog(@"Shaking end");
  7. }
  8.  
  9. - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
  10.     NSLog(@"Shaking cancel");  
  11. }
  12.  

motionEnded 메소드에 사용자의 흔들기가 끝난 후 실행할 코드를 추가하면, 간단하게 흔들기를 지원할 수 있습니다.

모든 댓글을 환영합니다. (욕설과 광고는 삭제합니다.)
  1. TODD 2009.09.29 12:59  댓글주소  수정/삭제  댓글쓰기

    좋은 포스트 내용 잘 보았습니다.
    질문이 하나 있습니다.

    아이폰을 흔드는 것에 대해
    motionBegan, motionEnded, motionCancelled 등의 이벤트가 발생한다고 하셨는데요.
    저는 이런 이벤트가 존재하는지 조차 알기 어렵네요..

    상황에 맞는 이런 이벤트들의 리스트를 쪼로록 볼 수 있는 방법이 있나요?
    Visual Studio 환경에 익숙한 저로서는 OnKeyDown 같은 On~~ 으로 시작하는 이벤트 리스트 같은 것을 기대하고 있습니다.

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2009.10.01 14:56 신고  댓글주소  수정/삭제

      ESC나 F5 키를 누르시면 일치하는 메소드 리스트를 볼 수 있습니다. Help 메뉴의 리서치 어시스턴트를 활용하시면 관련 문서를 좀 쉽게 찾을 수 있습니다.

  2. Favicon of http://blog.windclimb.com BlogIcon 문군 2009.10.14 19:58  댓글주소  수정/삭제  댓글쓰기

    언제나 좋은 내용만 알려주시는 쩔님^^

    가끔 들어와서 업데이트 되엇나 쳐다보고 갑니다.

    저도 맥을 사용하는 유저인데...쩔님에게 많이 배우고 있습니다.

    항상 좋은 내용 많이 많이 올려주세요^^

  3. Favicon of http://icarusx.tistroy.com BlogIcon ICARUSX 2009.11.30 16:23  댓글주소  수정/삭제  댓글쓰기

    또 왔습니다 ^^
    아이폰 구매신청한상태인데 않오는군요 ㅎㅎ
    뭐 와도.. 구지 만들어서 테스트해볼만한게 없지만 ㅎㅎ

    좋은 강좌또보고갑니다 ^^
    아.. 그리고 결혼한답니다 ^^

    이리저리 인터넷에 아는 지인께 글남기는중.
    코코아데브님에게도 소식을 ㅋㅋ

    http://www.icarusx.com/icarusx/index.php?BD_NO=1023

    좋은 하루되세요 ㅎ

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2009.12.01 10:31 신고  댓글주소  수정/삭제

      이카루스님은 좋은 소식 풍년이네요. 이번에 예약하셨군요. 전 나중에 사기로 했습니다.

      가장 좋은 소식은 결혼 소식이네요. 축하드리며 행복한 가정 꾸리시기 바랍니다. :)

  4. 나그네^^ 2010.04.05 02:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    이 메소드를 cocos2d에서 사용할려면 어떻게 사용해야하는지 알려주실수있으신지요

    • Favicon of https://www.cocoadev.co.kr BlogIcon cocoadev 2010.04.06 18:23 신고  댓글주소  수정/삭제

      ViewController에서 받는 메시지니 해당 뷰클래스를 하나 만드셔야 될 것 같습니다. 구조를 어떻게 하실지 모르겠지만 cocoas2d의 Director에서 attach하는 뷰에 뷰컨트롤러를 만들어서 해당 메시지를 받으시면 될 것 같습니다.

  5. 수세미 2017.02.09 10:36  댓글주소  수정/삭제  댓글쓰기

    2017년에도 이글이 유효하네요. shake 잘 동작하네요. ^^