1

我相当肯定这里有一个明显的答案,也许我太累了,看不到它,但这里有:

我有一个UIPanGestureRecognizer. 它被连接起来以移动视图。

我在这个视图中有一个子视图,我想alpha在平移视图时调整它。

该视图只能水平平移,因此消除了一些数学运算。

alpha有问题的子视图以of开头1.0。在超视图平移时,我想调整子视图的 alpha 使其按比例越来越低,直到达到最小值alpha0.3

我的代码在这一点上并不多,但实际上看起来像这样:

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

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

    // do more stuff here
}

我需要做什么样的花哨数学来计算alpha在任何给定时刻应用的正确值UIGestureRecognizerStateChanged

(假设相关状态相关的 ivars 已设置且可用,并且可以随意添加任何看起来不明显的内容。)

(我真的是个懒惰的白痴,不是吗?)

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;
    }
}

更新了计时器内置的无效功能并修复了一些错误。


用新的想法更新了代码。

如何在每次回调时将 alpha 降低一定数量。当用户暂停时,alpha 停止减少。如果速率设置为 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 值是您的水平运动。取它的绝对值,并将其作为您想要给出最小 alpha 的任何距离的比例。将此比例乘以 (1 - minAlpha),从 1.0 中减去它并将子视图的 alpha 设置为此值。

伪代码:

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 回答