【问题标题】:Change UIView alpha value更改 UIView alpha 值
【发布时间】:2012-07-07 15:18:09
【问题描述】:

我正在尝试创建一个 UIView 并更改其 alpha 属性以模拟背光变化。 这是我的代码

    TransparentView = [[UIView alloc] initWithFrame:self.view.bounds];
    TransparentView.backgroundColor = [UIColor whiteColor];
    self.view = TransparentView;

    TransparentView.alpha = 0.2; 
    float step = 1.0 / ( appDelegate.OnOffTime * 100);
    for (float f = 0; f < 1; f=f+step) {
        TransparentView.alpha = (CGFloat)(1 - f);
        [NSThread sleepForTimeInterval:0.01];
}

TransparentView.alpha = 0.2TransparentView.alpha = (CGFloat)(1 - f) 都改变了TransparentView.alpha,但只有TransparentView.alpha = 0.2 改变了真实设备的“亮度”。 我做错了什么?

【问题讨论】:

    标签: objective-c ios ios5 uiview


    【解决方案1】:

    我认为问题在于您正在休眠线程,而不是实际设置异步计时器。这意味着,您实际上并没有让运行循环在屏幕上进行更改,因为您不会退出此循环,直到它恢复到 1 :-)

    编辑:澄清:

    在运行循环“返回”之前,您对 UI 所做的任何更改实际上都不会被绘制,这需要您的方法返回。您可能需要一个 NSTimer 实例,配置为调用此对象上的一个方法,该方法会增加 alpha(并根据您的目标值检查 alpha;当它到达时使计时器无效。

    【讨论】:

    • 有什么类似于 C# this.Refresh() 来重绘屏幕吗?
    • 实际上,alpha 是由后台 CALayer 立即处理的,并且使用 drawRect 重新绘制视图。不需要运行循环和计时器。
    • ctrahey 是对的。我修改了我的代码并抛出了循环。现在它可以工作了。但我仍然不明白为什么我应该打破循环来处理 alpha 变化
    • @CodaFi,我只是做了一些测试来验证;但是如果您在主线程上运行这样的代码,则在您返回之前不会对 UI 进行更新,在这种情况下,此时甚至不会调用 drawRect(这是有道理的,因为 alpha 更改与合成有关,而不是实际您视图的像素数据)。
    【解决方案2】:

    您可能需要考虑更改代码以使用内置的 UIView 动画支持。这将确保您的视图已更新,并且您不会使主线程处于休眠状态。如果您需要在动画完成后做一些特别的事情,您可以使用 completion: 版本的方法。

    TransparentView.alpha = 0.2;
    [UIView animateWithDuration: appDelegate.OnOffTime animations:^{
        TransparentView.alpha = 0.0;
    }];
    

    【讨论】:

      【解决方案3】:

      Alpha 和亮度是视图的两个不同概念。如果你真的想改变显示器的亮度,你可以使用 iOS 5+ 的[[UIScreen mainScreen]brightness];,否则你的 alpha 变化需要在黑色背景下进行,而不是使用像 cast 1-float 这样奇怪的数字。我敢打赌,你的小算法返回了一个足够大的步长因子,以至于你的视图被告知显示超过一个的 alpha 值(无论如何默认为一个)。

      【讨论】:

      • 如果你改变 [[UIScreen mainScreen]brightness] 他们会在 appstore 中禁止你的应用
      • @问你确定吗?这看起来记录并支持我。
      • 非常确定。还有一个在应用关闭时恢复亮度级别的错误discussions.apple.com/thread/3907286?start=0&tstart=0
      • 不。支持。有 2 个应用在商店中使用它。
      • 您是否遇到过在用户按下 Home 键时恢复亮度级别的问题?
      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2013-12-23
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多