0

現在、画面の下部に隠れているビューがあります。ここで、ビューをy軸を介して垂直方向にスクロールして、ビューを移動できるようにします。ただし、ビューの高さ全体よりも高くしたくない(つまり、下部に空白が表示されないようにする)。私はこのコードを書きました:

- (IBAction)panHighlightReadingVC:(UIPanGestureRecognizer *)recognizer
{
    CGPoint translation = [recognizer translationInView:self.view];

    CGPoint newCenter = CGPointMake(self.view.bounds.size.width / 2,
                                    roundf(recognizer.view.center.y + translation.y));

    CGFloat velocityY = [recognizer velocityInView:self.view].y;
    if ((recognizer.view.frameY > self.view.frameHeight - recognizer.view.frameHeight || velocityY > 0)) {
        recognizer.view.center = newCenter;
        [recognizer setTranslation:CGPointZero inView:self.view];
    } 
}

ゆっくりスクロールするとこういう作品。非常に速くスクロールすると、ビューのframeYが `superView.frameHeight--recognizer.view.frameHeightよりも小さい可能性があります。これを修正するにはどうすればよいですか?

4

1 に答える 1

1

newCenternewCenterを計算するときは、実際に収まる範囲に制限します。制限内に制限している場合は、最後のifステートメントはおそらく必要ありません。

また、自分に有利に働き、実際に物事を単純化する場合にのみセンターを使用してください。あなたの場合、フレームを使うべきだと思います。そうすれば、2で割ることを心配する必要はありません。

次のようなものを試してください。

- (IBAction)panHighlightReadingVC:(UIPanGestureRecognizer *)recognizer
{
    CGPoint translation = [recognizer translationInView:self.view];

    CGFloat newY = MAX(recognizer.view.frame.origin.y + translation.y, self.view.frameHeight - recognizer.view.frameHeight);

    CGRect newFrame = CGRectMake(recognizer.view.frame.origin.x, newY, recognizer.view.frame.size.width, recognizer.view.frame.size.height);

    recognizer.view.frame = newFrame;
    [recognizer setTranslation:CGPointZero inView:self.view];
}

また、速度はあなたの状況には当てはまらないようで、物事を複雑にするだけです。

于 2012-12-19T18:38:21.997 に答える