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 - 设置背景颜色