0

Mac/iOS Web ページの実装方法に似たものを実装しようとしています。特定のしきい値を超えて引っ張ると、メイン ビューが「伸縮性」になり、引っ張る速度に基づいて移動します。

ただし、違いは、UIPanGestureRecognizer を使用して UITableViewCells に対してこれを水平に実行しようとしていることです。

私はhandlePan方法を持っています:

- (void)handlePan:(UIPanGestureRecognizer *)recognizer
{
    [recognizer setMaximumNumberOfTouches:1];
    CGPoint velocity = [recognizer velocityInView:self];

    int panDelta = ([recognizer locationInView:self].x - [recognizer locationInView:self.superview].x);

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        _originalCenter = self.center;
    }

    if (recognizer.state == UIGestureRecognizerStateChanged) {

        CGPoint translation = [recognizer translationInView:self];

        float xVal = 0;
        if (panDelta <= 38) {
            xVal = _originalCenter.x + translation.x;
        } /*else {


           // this is where I struggle.


            xVal = _originalCenter.x;
        }*/
        self.center = CGPointMake(xVal, _originalCenter.y);

    }

    if (recognizer.state == UIGestureRecognizerStateEnded) {
        CGRect newFrame;
        int xOffset = 0;

        newFrame = CGRectMake(xOffset, self.frame.origin.y,
                                          self.bounds.size.width, self.bounds.size.height);

        [UIView animateWithDuration:0.2 animations:^{
            self.frame = newFrame;
        }];
    }
}

「伸縮性」を作成するための特定のアルゴリズムはありません。私がやろうとしているのは、スライドがユーザーのインタラクションほど広がらず、流動的であるようにすることだけです。

アイデア?

4

1 に答える 1

1

最大オフセットを示す水平漸近線を持つ単純な関数を探していると思います:

// this is where I struggle.
CGFloat maxOffset = 50.0; // change as you like
CGFloat elementWidth = ?; // fill in the width of your view animated, eg: self.frame.size.width
CGFloat absPannedOffset = fabsf(translation.x);
CGFloat rico = powf(elementWidth, 2) / maxOffset;
CGFloat absOffset = (((- 1 / rico) * powf(absPannedOffset - elementWidth, 2)) + maxOffset);

if (pannedOffset < 0) {
    xVal = -absOffset;
} else {
    xVal = absOffset;
}
于 2013-06-24T11:02:21.330 に答える