CGRectContainsPoint

CoreGraphicsのCGGeometry.hには同フレームワークで使用する型等と共に、様々な便利な関数が用意されている。

1番に使えるであろうCGRectContainsPoint。第一パラメタにCGRect、第二パラメタにCGPointを取るこの関数は、特定の座標が矩形に含まれているかをboolで返す。これにより、iOSでUIView上の特定の位置をタップしたかどうかを検出できる。

例えば、タップされた場所にマーカーを配置し、次回そのマーカーがタップされたか否かを判定するコードは以下のように書ける。

NSMutableArray* points = [[NSMutableArray alloc] init];

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];

    CGRect marker = CGRectMake(point.x - 15
                               , point.y - 15
                               , 30
                               , 30);

   if ( CGRectContainsPoint(marker, point) )
   {
       //マーカーがタップされたので追加はせず置換し、この後で移動を表す処理
       NSValue* valueFromPoint = [NSValue valueWithCGPoint:point];
       [points replaceObjectAtIndex:index withObject: valueFromPoint];
   }
   else
   {
       //タップされていないので、この矩形内に図形(例えば塗りつぶした円)を新たに追加して描画する
       NSValue* valueFromPoint = [NSValue valueWithCGPoint:point];
       [points addObject:valueFromPoint];
   }
}

この関数のおかげで、タップに合わせてプリミティブを描画したり移動したりという処理が比較的簡単に書ける。