iOS:从运行循环外部设置 UIView 背景颜色

Posted

技术标签:

【中文标题】iOS:从运行循环外部设置 UIView 背景颜色【英文标题】:iOS: setting UIView background color from outside the run loop 【发布时间】:2010-11-05 03:22:42 【问题描述】:

我希望在专用于音频的线程中运行的事件来更改 UI。简单地调用 view.backgroundColor 似乎没有任何效果。

这是我的 viewController 中的两个方法。第一个是由触摸触发的。第二个是从音频代码中调用的。第一个作品。第二。知道为什么吗?

// this changes the color
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    [touchInterpreter touchesMoved:touches withEvent:event];
    self.view.backgroundColor = [UIColor colorWithWhite: 0.17 + 2 *  [patch getTouchInfo]->touchSpeed alpha:1];

;

// this is called from the audio thread and has no effect
-(void)bang: (float)intensity
    self.view.backgroundColor = [UIColor colorWithWhite: intensity alpha:1];

知道为什么吗?我只是在做一些愚蠢的事情,还是有什么技巧可以从运行循环之外更改 UI 元素?

【问题讨论】:

【参考方案1】:

不允许从主线程以外的任何地方触摸 UI,这会导致奇怪的行为或崩溃。在 ios 4.0 或更高版本上,您应该使用类似

- (void)bang:(float)intensity 
    dispatch_async(dispatch_get_main_queue(), ^
        self.view.backgroundColor = [UIColor colorWithWhite:intensity alpha:1];
    );

或 NSOperationQueue 变体

- (void)bang:(float)intensity 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^
        self.view.backgroundColor = [UIColor colorWithWhite:intensity alpha:1];
    ];

在 iOS 3.2 或更早的版本上,您可以使用 [self performSelectorOnMainThread:@selector(setViewBackgroundColor:) withObject:[UIColor colorWithWhite:intensity alpha:1] waitUntilDone:NO] 然后定义

- (void)setViewBackgroundColor:(UIColor *)color 
    self.view.backgroundColor = color;

请注意,调用 [self.view performSelectorOnMainThread:@selector(setBackgroundColor:) withObject:[UIColor colorWithWhite:intensity alpha:1] waitUntilDone:NO] 并不安全,因为 UIViewController 的 view 属性不是线程安全的。

【讨论】:

以上是关于iOS:从运行循环外部设置 UIView 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用的配色方案 - UIView 和 UIAppearance - 设置背景颜色

iOS:笔尖中的 TableView - 设置背景颜色

从 UIViewController 设置 UIView 的背景颜色

UIView 背景颜色颜色循环

在 while 循环中更新 UIView 的背景颜色

iOS 设置状态栏的背景颜色