カスタム変数などのいくつかについては不明だったので、コードをデバッグするのではなく、UIPanGestureRecognizer
.
したがって、(a) ドラッグされているビューにジェスチャが追加されていると仮定します。(b) そのビューが、ビューの動きを制限したいスーパービュー内に含まれている場合、コードは次のようになります。
- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
static CGRect originalFrame;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = gesture.view.frame;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
CGRect newFrame = CGRectMake(originalFrame.origin.x + translate.x,
originalFrame.origin.y + translate.y,
originalFrame.size.width,
originalFrame.size.height);
if (CGRectContainsRect(gesture.view.superview.bounds, newFrame))
gesture.view.frame = newFrame;
}
}
上記はある程度の単純さを楽しんでいますが、ユーザーエクスペリエンスを改善できると思います. 特に、ユーザーがビューをスーパービューの外にドラッグすると、上記のコードは何もしません (たとえば、左の境界線を越えてドラッグすると、指を上下に動かしてもそこでフリーズします。あまりエレガントではありません)。以下はより優雅なユーザー インターフェイスだと思います (ただし、コードを読むのは少し複雑です)。ユーザーが指をドラッグすると、オブジェクトがスーパービュー内の最も近いポイントにドラッグされます。ユーザーの指は。
- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
static CGRect originalFrame;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = gesture.view.frame;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
CGRect newFrame = CGRectMake(fmin(gesture.view.superview.frame.size.width - originalFrame.size.width, fmax(originalFrame.origin.x + translate.x, 0.0)),
fmin(gesture.view.superview.frame.size.height - originalFrame.size.height, fmax(originalFrame.origin.y + translate.y, 0.0)),
originalFrame.size.width,
originalFrame.size.height);
gesture.view.frame = newFrame;
}
}