UIView的drawRect在调试时未被调用

问题描述:

我正在试验高级的Objective-C方法。我想要实现的是将特定的绘图代码附加到现有的UIViewUIView的drawRect在调试时未被调用

我开始很容易,我去上宣布自己drawRect方法在一个类别:

@interface UIView (Swizzled) 

- (void)my_drawRect:(CGRect)rect; 

@end 

然后我在执行类搅和的UIViewdrawRect方法:

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

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

该方法的实现可在GitHub上找到,而且在其他所有情况下都可以使用。

所以根据逻辑,每次调用drawRect时,都应该打印出“Test”。但它不起作用,我咒骂的方法永远不会被调用。我继续发现我在这里做错了什么,但我越看越,我越相信这个问题在别的地方。

如果drawRect方法没有被调用,该怎么办?我继续试图强制它被称为:

view.contentMode = UIViewContentModeRedraw; 
[view setNeedsDisplay]; 

也不管用。

所以我的问题是:

如何强制UIView调用在这种情况下drawRect,甚至我的绞合的实施?

谢谢!

+0

你可以发布'swizzleInstanceMethod:withMethod:inClass:]'的代码吗? – Austin

+0

这个方法的代码可以在[GitHub](https://github.com/Legoless/Haystack/blob/master/SDK/NSObject+Swizzle/NSObject+Swizzle.m)上找到,就像在上面的帖子中写的一样。但这与这个问题无关。 – Legoless

首先,阅读to drawRect or not to drawRect (when should one use drawRect/Core Graphics vs subviews/images and why?)

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

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

+0

这是运行时反射和元编程的一个很好的例子。您可以使用运行时更改某些内容,这些内容不具有预期的行为,因为它会破坏其他人在编写使用运行时的代码时所做的假设。一个更加恶毒的例子就是,KVO也搅拌着一个物体:http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo –

+0

伟大的资源,你们俩。我假设'UIView'会执行更深层次的检查,如果执行'drawRect'并且可能无法强制执行此操作。 – Legoless