当旋转时,UIView的drawRect没有被调用

时间:2014-05-22 17:54:12

标签: ios objective-c core-graphics drawrect swizzling

我正在尝试使用先进的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,甚至是我的调整实施?

谢谢!

1 个答案:

答案 0 :(得分:6)

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

基本上,UIView会检查您是否覆盖drawRect:。如果你不覆盖它,它可以进行大量的绘图优化,甚至不会调用该方法。

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