在属性更改时强制重绘自定义cocoa控件

时间:2010-08-23 14:10:15

标签: cocoa drawing custom-controls

假设我有一个名为FooBox的自定义控件。它只是屏幕上的一个正方形。它有一些属性,如颜色,边框等。当我更改属性时,我希望FooBox重绘自身以反映其新属性。有没有办法在不编写自定义setter并将[self setNeedsDisplay:YES]放入所有这些内容的情况下执行此操作?

5 个答案:

答案 0 :(得分:5)

我不确定这是否是正确的方法,但您可以考虑使用NSKeyValueObserving并将对象注册为自身的观察者,并在-observeValueForKeyPath:ofObject:change:context:方法中重绘。 / p>

答案 1 :(得分:2)

编辑:彼得在评论中是正确的,这个解决方案只有在有一个注册了该属性的观察者时才有效。我现在记得我在带有@dynamic属性的CALayer上完成了这个,在这种情况下,这可以按照你的意愿工作。但在一般情况下,这不是解决问题的好方法。

假设您的类与要触发重新显示的属性符合KVC,当密钥与您的某个属性匹配时,我会覆盖-didChangeValueForKey:方法以调用[self setNeedsDisplay]。我认为这比Peter的覆盖-setValue的方法稍好一点:forKey:因为它不会妨碍正常的KVC机制并且不需要他提到的拳击。

- (void)didChangeValueForKey:(NSString*)key {
    if ([@"propertyOne" isEqualToString:Key] ||
        ....) {
        [self setNeedsDisplay];
    }
    [super didChangeValueForKey:key]; // <- Don't forget this
}

答案 2 :(得分:1)

另外两种方式:

  1. 在发送视图之后,访问者消息会立即向其发送setNeedsDisplay:YES。并非总是可能,也不乏麻烦。
  2. 覆盖setValue:forKey:以向其添加setNeedsDisplay:消息,并使用该消息设置视图的属性。这将需要装箱任何数字或结构值,这是另一个麻烦。
  3. 所以,实际上,没有。

答案 3 :(得分:0)

我不知道一个。如果它足够困扰我,我会给自己写几个宏来做这个技巧。

答案 4 :(得分:0)

如果通过NSControl更改属性,则可以始终放置

[theView setNeedsDisplay:YES]

在NSControl发送的动作中。