考虑到我们拥有一个扩展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/

10-12 00:16