UIView的drawRect在调试时未被调用
我正在试验高级的Objective-C方法。我想要实现的是将特定的绘图代码附加到现有的UIView
。UIView的drawRect在调试时未被调用
我开始很容易,我去上宣布自己drawRect
方法在一个类别:
@interface UIView (Swizzled)
- (void)my_drawRect:(CGRect)rect;
@end
然后我在执行类搅和的UIView
的drawRect
方法:
+ (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
,甚至我的绞合的实施?
谢谢!
基本上,UIView
检查,如果重写drawRect:
与否。如果你不覆盖它,它可以做很多绘图优化,甚至不会调用该方法。
在这种情况下,您没有覆盖它,因此UIView
认为没有理由调用它,即使您用其他方法替换了空实现。
这是运行时反射和元编程的一个很好的例子。您可以使用运行时更改某些内容,这些内容不具有预期的行为,因为它会破坏其他人在编写使用运行时的代码时所做的假设。一个更加恶毒的例子就是,KVO也搅拌着一个物体:http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo –
伟大的资源,你们俩。我假设'UIView'会执行更深层次的检查,如果执行'drawRect'并且可能无法强制执行此操作。 – Legoless
你可以发布'swizzleInstanceMethod:withMethod:inClass:]'的代码吗? – Austin
这个方法的代码可以在[GitHub](https://github.com/Legoless/Haystack/blob/master/SDK/NSObject+Swizzle/NSObject+Swizzle.m)上找到,就像在上面的帖子中写的一样。但这与这个问题无关。 – Legoless