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

Leg*_*ess 3 core-graphics objective-c drawrect swizzling ios

我正在尝试使用先进的Objective-C方法.我想要实现的是将特定的绘图代码附加到现有的UIView.

我开始很容易,我继续drawRect在一个类别中声明我自己的方法:

@interface UIView (Swizzled)

- (void)my_drawRect:(CGRect)rect;

@end
Run Code Online (Sandbox Code Playgroud)

然后我在实施类别中调整了drawRect方法UIView:

+ (void)load
{
    [self swizzleInstanceMethod:@selector(drawRect:) withMethod:@selector(my_drawRect:) inClass:[UIView class]];
}

- (void)my_drawRect:(CGRect)rect
{
    NSLog (@"Test.");
}
Run Code Online (Sandbox Code Playgroud)

GitHub上提供了这种方法的实现,并且在所有其他情况下都可以使用这种方法.

所以根据逻辑,每次drawRect调用时,都应该打印出"Test".但它不起作用,我调用的方法从未被调用过.我接着发现了我在这里做错了什么,但是我看的越多,我就越相信问题就在其他地方.

如果drawRect甚至没有调用该方法怎么办?我接着试着强迫它被召唤:

view.contentMode = UIViewContentModeRedraw;
[view setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

也不起作用.

所以我的问题是:

在这种情况下如何强制UIView调用drawRect甚至是我的调配实现?

谢谢!

Sul*_*han 6

首先,读取drawRect或不读取drawRect(何时应该使用drawRect/Core Graphics vs subviews/images以及为什么?)

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

在这种情况下,你没有覆盖它,所以UIView没有理由调用它,即使你用其他东西替换了空实现.