1

ここには明らかな答えがあると確信しています。おそらく私は疲れすぎてそれを見ることができませんが、ここに行きます:

私は持っていUIPanGestureRecognizerます。ビューを移動するように配線されています。

alphaこのビューには、ビューがパンされているときに調整したいサブビューがあります。

ビューは水平方向にのみパンできるため、一部の計算が省略されます。

alpha問題のサブビューはof で始まります1.0alphaスーパービューがパンしている間、サブビューのアルファを調整して、最小値に達するまで比例して低くしたいと思い0.3ます。

私のコードはこの時点では大したものではありませんが、実際には次のようになります。

- (void) someMethodForRecognizer: (UIGestureRecognizer *) recognizer {
    // do stuff here

    if (recognizer.state == UIGestureRecognizerStateChanged) {
        // do fancy math here
    }

    // do more stuff here
}

alphaの特定の瞬間に適用する正しい値を計算するには、どのような手の込んだ数学を行う必要がありますUIGestureRecognizerStateChangedか?

(関連する状態関連の ivar が設定されて利用可能であると仮定し、明らかではないかもしれないものを自由に追加してください。)

(私は本当に怠け者ですよね?)

4

2 に答える 2

2

少し異なるアプローチを提案しても構わない場合は、NSTimer ( + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats) を使用します。

- (void) someMethodForRecognizer: (UIGestureRecognizer *) recognizer {
    switch (recognizer.state) {
        case UIGestureRecognizerStateBegan:
            self.panStartTime = CFAbsoluteTimeGetCurrent();
            self.panView = recognizer.view;
            self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                          target:self
                                                        selector:@selector(panIntervalWithTimer:)
                                                        userInfo:nil
                                                         repeats:YES];
            break;

        case UIGestureRecognizerStateChanged:
            // Your current pan handler
            break;

        default:
            self.panView.alpha = 1.0;
            self.panView = nil;
            self.panStartTime = 0;

            [self.timer invalidate];
            self.timer = nil;
    }
}

- (void)panIntervalWithTimer:(NSTimer *)timer
{
    NSTimeInterval interval = CFAbsoluteTimeGetCurrent() - self.panStartTime;
    CGFloat alpha = 1 - interval; // or some better math
    if (alpha > 0.3) {
        self.panView.alpha = alpha;
    } else {
        self.panView.alpha = 0.3;

        [self.timer invalidate];
        self.timer = nil;
    }
}

タイマーに組み込まれた無効化で更新され、いくつかのバグが修正されました。


新しいアイデアでコードを更新しました。

コールバックごとに一定量だけアルファを減らすのはどうですか。ユーザーが一時停止すると、アルファの減少が止まります。レートが 0.025 に設定されている場合、0.3 に達する前に 28 回の更新が行われます。レートが 0.001 の場合、70 回の更新が行われます。

- (void) someMethodForRecognizer: (UIGestureRecognizer *) recognizer {
    …

    if (recognizer.state == UIGestureRecognizerStateChanged) {
        CGFloat alpha = recognizer.view.alpha - kAlphaDecrementRate;
        recognizer.view.alpha = MAX(alpha, 0.3);
    } else {
        recognizer.view.alpha = 1.0;
    }

    …
}
于 2012-07-02T00:23:02.577 に答える
2

このプロパティを使用して、translationInView:パンした距離を確認します。この点の x 値は、水平方向の動きです。この絶対値を取り、最小アルファを与えたい距離の比率として見つけます。この比率に (1 - minAlpha) を掛け、1.0 から引き、サブビューのアルファをこの値に設定します。

擬似コード:

CGPoint translation = [gesture translationInView:self];
CGFloat x = fabsf(translation.x);
CGFloat proportion = x / MIN_ALPHA_DISTANCE;
CGFloat alphaDifference = proportion * (1 - MIN_ALPHA);
subview.alpha = 1 - alphaDifference;
于 2012-07-02T06:07:51.503 に答える