考虑到我们拥有一个扩展UIView的自定义视图。
它可能具有影响其外观的多个属性。
因此,无论何时更改这些属性中的任何一个,我们都必须调用setNeedsDisplay
。
@interface MyView : UIView
@property (strong, nonatomic) UIColor* someColor;
@end
@implemetation MyView
-(void)setSomeColor:(UIColor*) someColor
{
if(_someColor == someColor) return;
[self willChangeValueForKey: @"someColor"];
_someColor = someColor;
// we needs to call this to re-render.
[self setNeedsDisplay];
[self didChangeValueForKey: @"someColor"];
}
@end
在上面的代码中,只有一个属性。
但是,如果我们有很多会影响外观的属性,那将是非常痛苦的任务。我们必须多次编写非常相似的代码,而在这种情况下,objective-c的自动合成功能似乎毫无用处。
无论如何,要使它整洁简单?
例如,某种合成指令宏或注释如下:
@interface MyView : UIView
@property (strong, nonatomic, needsDisplay) UIColor* someColor;
@end
要么
@interface MyView : UIView
@property (strong, nonatomic) NeedsDisplay UIColor* someColor;
@end
最佳答案
您可以使用键值观察,将自己注册为观察者并正确发送setNeedsDisplay
消息。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqualToString:@"someColor"] || /*other property*/) {
[self setNeedsDisplay] ;
}
/*
Be sure to call the superclass's implementation *if it implements it*.
NSObject does not implement the method.
*/
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
关于ios - 正确调用UIView#setNeedsDisplay进行@property更改的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25195475/