3

ビューを移動したときにこれがパンしないのはなぜですか?

CGPoint translation = [recognizer translationInView:self.view];


    if ((recognizer.view.frameY + translation.y >= self.view.frameHeight - recognizer.view.frameHeight)) {
        CGPoint newOrigin = CGPointMake(self.view.bounds.size.width, roundf(recognizer.view.frameY + translation.y));
        recognizer.view.frameOrigin = newOrigin;
        NSLog(@"FRAME ORIGIN %@", NSStringFromCGPoint(recognizer.view.frameOrigin));
    } 
4

3 に答える 3

6

カスタム変数などのいくつかについては不明だったので、コードをデバッグするのではなく、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;
    }
}
于 2012-12-23T18:36:36.673 に答える
1

パン ジェスチャ メソッドが呼び出されましたか? ユーザー操作が有効に設定されていない場合。以下のコードを使用できます。

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {


CGPoint translation = [recognizer translationInView:recognizer.view.superview];

recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
                                     recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:recognizer.view.superview];

if (recognizer.state == UIGestureRecognizerStateEnded) {

    CGPoint velocity = [recognizer velocityInView:recognizer.view.superview];
    CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
    CGFloat slideMult = magnitude / 200;
    NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);

    float slideFactor = 0.1 * slideMult; // Increase for more of a slide
    CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), 
                                     recognizer.view.center.y + (velocity.y * slideFactor));
    finalPoint.x = MIN(MAX(finalPoint.x, 0), recognizer.view.superview.bounds.size.width);
    finalPoint.y = MIN(MAX(finalPoint.y, 0), recognizer.view.superview.bounds.size.height);

    [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        recognizer.view.center = finalPoint;
    } completion:nil];

} 



}
于 2012-12-21T05:19:55.203 に答える