メイン ビューに 2 次元のボタン配列があり、このビュー内でドラッグして移動できるようにしたいと考えています。ボタンはかなり狭く、約 23x23 ピクセルです。touchDragExit
コントロール イベントのターゲットを追加しましtouchDragOutside
たが、ボタンの外に指を移動した後、多くのピクセルが発生しました。したがって、SO で見つけたコードをサブクラス化UIButton
し、オーバーライドしました。continueTrackingWithTouch
スーパークラスの実装を呼び出していないことに注意してください。
-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
CGFloat boundsExtension = 5.0f;
CGRect outerBounds = CGRectInset(self.bounds, -1 * boundsExtension, -1 * boundsExtension);
BOOL touchOutside = !CGRectContainsPoint(outerBounds, [touch locationInView:self]);
if(touchOutside)
{
BOOL previousTouchInside = CGRectContainsPoint(outerBounds, [touch previousLocationInView:self]);
if(previousTouchInside)
{
[self sendActionsForControlEvents:UIControlEventTouchDragExit];
}
else
{
[self sendActionsForControlEvents:UIControlEventTouchDragOutside];
}
}
return self.tracking;
}
どちらのイベントも正しく発生しますがUIControlEventTouchDragOutside
、アクションが呼び出されたときにアクションが間違ったタッチ情報を受け取ります。これが私の実装の最初の部分です。
-(void) dragOutside:(UIButton *) sender withEvents:(UIEvent *) event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint relativeLocToInitialCell = [touch locationInView:sender];
NSLog(@"Translation %f %f NumTouch %d",relativeLocToInitialCell.x, relativeLocToInitialCell.y, [[event allTouches] count]);
...
}
[[event allTouches] count]
ボタンから指を離すまで、0 を返します。もちろん、relativeLocToInitialCell
フィールドx
とフィールドy
は両方とも 0 です。これは、後の計算に使用する値です。何が問題なのですか?
編集:削除された回答はUIPanGestureRecognizer
、タッチドラッグイベントの代わりに使用することを提案しましたが、別のイベントを処理する前にあまりにも速く発火していたため、使用できませんでした。