0

ここに画像の説明を入力UIPanGestureRecognizer クラスを使用して、y 軸上で上下にドラッグする UIButton があります。垂直機能の UISlider の代わりにこれを使用しています。最小値 0 から最大値 1 に制限される UISlider のように、ボタンを上下にドラッグして、0 と 1 の間のすべての float 値をキャプチャしたいと考えています。

私の現在のコードは正しい値をキャプチャしていません。これを修正するにはどうすればよいですか:

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

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

    CGPoint newCenter = CGPointMake(recognizer.view.center.x,recognizer.view.center.y + translation.y);

    //range is 139 pixels

    //i tried dividing 1/139 to get the increment using pixels

    if(newCenter.y >= 126 && newCenter.y <= 265)
    {
        currentMainVolValue = currentMainVolValue - 0.00714285714286; 
        recognizer.view.center = newCenter;
        [recognizer setTranslation:CGPointZero inView:self.view];
    }
}
4

2 に答える 2

1

126それが最小のy値で265あり、最大であると仮定します。現在の翻訳から最小の y を減算し、結果を範囲で割る必要があります

CGFloat minY  = 126;
CGFloat range = 256 - minY;

return 1 - ((yTranslation - minY) / range);

これは与える

yTranslation = 256 then value = 0
yTranslation = 126 then value = 1
yTranslation = 191 then value = 0.5
于 2013-11-04T21:00:36.117 に答える
0

locationOfTouch私は似たようなことを達成するために、 (ではなく )ジェスチャのtranslationInView違いに依存していました。state

私の場合、このサブビュー内の固定ボタン (UIPanGestureRecognizer に登録されたボタン) を使用してサブビューを移動する必要がありました。ジェスチャが終了すると、私のビューは再び画面の左の壁にスナップします (y 軸の動き)。

- (void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer
{
    // Need to make below calculation for other orientations. Until then this is not allowed.
    if (self.interfaceOrientation != UIInterfaceOrientationPortrait) return;
    static CGFloat initialCenterPointX = 0;

    const CGPoint deltaPoint = CGPointMake(self.view.bounds.size.width/2 - gestureRecognizer.view.superview.center.x, self.view.bounds.size.height/2 - gestureRecognizer.view.superview.center.y);

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        initialCenterPointX = self.view.center.x;
    }
    else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint location = [gestureRecognizer locationOfTouch:0 inView:self.view];

        NSLog(@"gestureRecognizer.view = %@ location = %f, %f", gestureRecognizer.view, location.x, location.y);
        CGFloat proposedCenterPointX = self.view.frame.origin.x + location.x;
        CGFloat proposedCenterPointY = self.view.frame.origin.y + deltaPoint.y + location.y;

        CGPoint newCenterLocation = CGPointZero;

        newCenterLocation.x = MAX(proposedCenterPointX, self.view.bounds.size.width/2);
        newCenterLocation.y = MAX(proposedCenterPointY, self.view.bounds.size.height/2);

        self.view.center = newCenterLocation;
    }
    else {
        [UIView animateWithDuration:0.2 animations:^{
            self.view.center = CGPointMake(initialCenterPointX, self.view.center.y);
        }];
    }
}
于 2013-11-04T20:46:09.993 に答える