iPhone_TouchEvent のバックアップ(No.2) - アールメカブ

アールメカブ


iPhone_TouchEvent のバックアップ(No.2)


Programming

ここがとても参考になる.

  - (CGPoint)locationInView:(UIView *)view

locationInView?:hogeは 指定したビュー hoge の座標系でレシーバ(タッチ)の現在の座標を返す。nilを指定した場合ウインドウの座標系になる。(参照

これは hoge の現在の位置を,親ビューの座標系で返せ,ということか. 以下のループ構造でよく使われる.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	for (UITouch *touch in touches) {
		clickPos = [touch locationInView:self];
		break;
	}	
}

ビューの座標系についてはここが詳しい

また以下はここからの引用.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   // We only support single touches, so get the touch from allTouches
   UITouch *touch = [[event allTouches] anyObject];

   // Only move the placard view if the touch was in the placard view
   if ([touch view] != placardView)
   {
       // In case of a double tap outside the placard view, update the placard's display string
       if ([touch tapCount] == 2)
       {
           [placardView setupNextDisplayString];
       }
       return;
   }
   // Animate the first touch
   CGPoint touchPoint = [self convertPoint:[touch locationInView:self] fromView:placardView];
   [self animateFirstTouchAtPoint:touchPoint];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   UITouch *touch = [[event allTouches] anyObject];

   // If the touch was in the placardView, move the placardView to its location
   if ([touch view] == placardView)
   {
       CGPoint location = [touch locationInView:self];
       location = [self convertPoint:location fromView:placardView];
       placardView.center = location;
       return;
   }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
   UITouch *touch = [[event allTouches] anyObject];

   // If the touch was in the placardView, bounce it back to the center
   if ([touch view] == placardView)
   {
       // Disable user interaction so subsequent touches don't interfere with animation
       self.userInteractionEnabled = NO;
       [self animatePlacardViewToCenter];
       return;
   }
}