从滚动视图委托分配 alpha

Assigning alpha from scrollview delegate

我在导航栏中添加了两个标签,我试图根据滚动视图上的 y 位置使一个标签淡出并使另一个标签淡入。当我记录 alpha 值时,这些值似乎是正确的。但是当你 运行 它看起来是不对的。 topTitleLable 的 alpha 从 1 变为几乎 0,然后慢慢淡入而不是淡出。不确定如何调试。

这是向下滚动的图像,标签在应该淡出的时候淡入:

tldr: 如何根据滚动视图位置更改标签 alpha?

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
static CGFloat startFade = 190;
static CGFloat endFade = 215;
CGFloat difference = endFade - startFade;

if (scrollView.contentOffset.y < startFade && self.navigationController.topTitleLabel.alpha != 1.0) {
    self.navigationController.topTitleLabel.alpha = 1.0;
    self.navigationController.bottomTitleLabel.alpha = 0.0;
} else if (scrollView.contentOffset.y >= startFade && scrollView.contentOffset.y <= endFade) {
    CGFloat scrollViewFraction = difference - (scrollView.contentOffset.y - startFade);
    CGFloat topLabelAlpha = scrollViewFraction/difference;
    CGFloat bottomLabelAlpha = 1 - topLabelAlpha;
    self.navigationController.topTitleLabel.alpha = topLabelAlpha;
    NSLog(@"%f VS. %f", topLabelAlpha, self.navigationController.topTitleLabel.alpha);

    self.navigationController.topTitleLabel.alpha = bottomLabelAlpha;
} else if (scrollView.contentOffset.y > endFade && self.navigationController.topTitleLabel.alpha != 0.0) {
    self.navigationController.topTitleLabel.alpha = 0.0;
    self.navigationController.bottomTitleLabel.alpha = 1.0;
}
}

我不明白你到底想在功能上达到什么目的,但我知道根据滚动偏移量进行连续更改有时很棘手。

通常解决问题的方法是意识到我需要编写(并测试)一个将 y 偏移量映射到某个实数输出的函数。绘制此函数的图形通常很有帮助....

alpha |
      |
    1 |         /------
      |        /
      |       /
    0 |------/
      --------------------- y offset
             |   |
            190 215

这为类似这样的事情提供了很好的指导...

- (CGFloat)bottomLabelAlphaAtY:(CGFloat)y {
    if (y < 190) return 0;
    if (y >= 215) return 1;
    return (y-190) / (215-190);
}

之前我们把滚动视图弄混了,写个小测试,比如...

- (void)testBottomLabelAlphaFunction {
    for (int y=180; y<225; y+=0.5) {
        NSLog(@"y=%.2f f(y)=%.3f", y, [self bottomLabelAlphaAtY:y]);
    }
}

通读输出并确保它按预期运行。

分解出真实平面逻辑的一个很好的副作用是您可以使用已经测试过的函数的组合。例如,仍在猜测您的确切功能目标,也许您需要类似...

- (CGFloat)topLabelAlphaAtY:(CGFloat)y {
    return 1 - [self bottomLabelAlphaAtY:y];
}

另一个不错的副作用是您现在可以在委托方法中获得简单明了...

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat y = scrollView.contentOffset.y
    self.navigationController.topTitleLabel.alpha = [self topLabelAlphaAtY:y];
    self.navigationController.bottomTitleLabel.alpha = [self bottomLabelAlphaAtY:y];
}