3

我正在尝试使用高级 Objective-C 方法。我想要实现的是将特定的绘图代码附加到现有的UIView.

我很容易开始,我继续drawRect在一个类别中声明我自己的方法:

@interface UIView (Swizzled)

- (void)my_drawRect:(CGRect)rect;

@end

然后我在类的实现中swizzleddrawRect方法:UIView

+ (void)load
{
    [self swizzleInstanceMethod:@selector(drawRect:) withMethod:@selector(my_drawRect:) inClass:[UIView class]];
}

- (void)my_drawRect:(CGRect)rect
{
    NSLog (@"Test.");
}

此方法的实现可在GitHub 上获得,并且在所有其他情况下都可以使用 swizzling。

所以按照逻辑,每次drawRect被调用,应该只是打印出“Test”。但它不起作用,我调配的方法永远不会被调用。我继续发现我在这里做错了什么,但我越看它,我就越相信问题出在其他地方。

如果drawRect甚至没有调用该方法怎么办?我继续尝试强制调用它:

view.contentMode = UIViewContentModeRedraw;
[view setNeedsDisplay];

也不行。

所以我的问题是:

如何在这种情况下强制UIView调用drawRect,甚至是我的 swizzled 实现?

谢谢!

4

1 回答 1

6

首先,阅读drawRect或不阅读drawRect(什么时候应该使用drawRect/Core Graphics vs subviews/images,为什么?)

基本上,UIView检查您是否覆盖drawRect:。如果你不重写它,它可以做很多绘图优化,甚至不会调用该方法。

在这种情况下,您没有覆盖它,因此UIView没有理由调用它,即使您用其他东西替换了空实现。

于 2014-05-22T18:36:44.400 回答