我正在试验高级Objective-C方法。我想要实现的是将特定的绘图代码附加到现有的UIView
。
我开始很容易,我继续在一个类别中声明我自己的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上可用,swizzling在所有其他情况下都可以工作。
因此,根据逻辑,每次调用drawRect
时,它应该只打印出"Test"。但它不起作用,我搅拌的方法永远不会被调用。我继续寻找我在这里做错了什么,但是我越看越觉得问题出在别的地方。
如果drawRect
方法甚至没有被调用怎么办?我继续尝试强制它被称为:
view.contentMode = UIViewContentModeRedraw;
[view setNeedsDisplay];
也不行
我的问题是:
如何强制UIView
调用drawRect
在这种情况下,甚至我的swizzed实现?
谢谢!
首先,读取drawRect或不drawRect(何时应该使用drawRect/Core Graphics vs subviews/images,为什么?)
基本上,UIView
检查是否覆盖drawRect:
。如果你不重写它,它可以做很多绘图优化,甚至不会调用该方法。
在本例中,您没有覆盖它,因此UIView
认为没有理由调用它,即使您用其他内容替换空实现。