我正在试验高级 Objective-C 方法。我想要实现的是将特定的绘图代码附加到现有的 UIView
。
我开始很容易,我继续在类别中声明我自己的 drawRect
方法:
@interface UIView (Swizzled)
- (void)my_drawRect:(CGRect)rect;
@end
然后我在category的实现中swizzle了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
在这种情况下甚至是我的 swizzled 实现?
谢谢!
最佳答案
基本上,UIView
检查您是否覆盖了 drawRect:
。如果您不覆盖它,它可以进行大量绘图优化,甚至不会调用该方法。
在这种情况下,您没有覆盖它,所以 UIView
认为没有理由调用它,即使您用其他东西替换了空实现也是如此。
关于ios - UIView 的 drawRect 在 swizzled 时没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814005/