从scrollview委托中分配alpha

时间:2016-03-30 14:39:17

标签: ios objective-c user-interface uiscrollview uilabel

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

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

enter image description here

tldr:如何根据scrollView位置更改标签alpha?

{"error":"invalid_request","error_description":"Missing grant type"}

1 个答案:

答案 0 :(得分:1)

我并不完全明白你在功能上想要得到什么,但我知道根据滚动偏移进行连续更改有时很棘手。

通常我能解决的问题是要意识到我需要编写(并测试)一个将y-offset映射到某个实数输出的函数。草绘这个函数的图表通常很有帮助....

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