0

我正在尝试创建一个 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改变了真实设备的“亮度”。我做错了什么?

4

3 回答 3

3

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

编辑:澄清:

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

于 2012-07-07T15:59:36.040 回答
2

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

TransparentView.alpha = 0.2;
[UIView animateWithDuration: appDelegate.OnOffTime animations:^{
    TransparentView.alpha = 0.0;
}];
于 2012-07-07T20:03:27.040 回答
1

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

于 2012-07-07T15:47:40.887 回答