我正在尝试使用先进的Objective-C方法。我想要实现的是将特定的绘图代码附加到现有的UIView
。
我很容易就开始了,我继续在一个类别中声明我自己的drawRect
方法:
@interface UIView (Swizzled)
- (void)my_drawRect:(CGRect)rect;
@end
然后我在类别的实现中调整了drawRect
UIView
方法:
+ (void)load
{
[self swizzleInstanceMethod:@selector(drawRect:) withMethod:@selector(my_drawRect:) inClass:[UIView class]];
}
- (void)my_drawRect:(CGRect)rect
{
NSLog (@"Test.");
}
GitHub提供了此方法的实现,其他所有情况下都可以使用此方法。
因此,根据逻辑,每次调用drawRect
时,它应该打印出来"测试"。但它不起作用,我调用的方法从未被调用过。我接着发现了我在这里做错了什么,但是我看得越多,我就越相信这个问题就在别的地方。
如果甚至没有调用drawRect
方法怎么办?我接着试着强迫它被召唤:
view.contentMode = UIViewContentModeRedraw;
[view setNeedsDisplay];
也不起作用。
所以我的问题是:
在这种情况下如何强制UIView
致电drawRect
,甚至是我的调整实施?
谢谢!
答案 0 :(得分:6)
基本上,UIView
会检查您是否覆盖drawRect:
。如果你不覆盖它,它可以进行大量的绘图优化,甚至不会调用该方法。
在这种情况下,您没有覆盖它,因此UIView
认为没有理由调用它,即使您用其他内容替换了空实现。