【问题标题】:Assigning alpha from scrollview delegate从滚动视图委托分配 alpha
【发布时间】:2016-07-18 15:40:49
【问题描述】:

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

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

tldr:如何根据 scrollView 位置更改标签 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;
}
}

【问题讨论】:

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


    【解决方案1】:

    我不完全了解您想要在功能上获得什么,但我知道根据滚动偏移进行连续更改有时很棘手。

    通常对我来说解决问题的是意识到我需要编写(并测试)一个将 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];
    }
    

    【讨论】:

    • @dahh 哇,非常感谢!我最终对这两个标签使用了不同的方法,以便在不同的 y 值处淡入和淡出,但图表非常有用。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2019-02-22
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多