ios - UIView 的 drawRect 在 swizzled 时没有被调用

标签 ios objective-c core-graphics drawrect swizzling

我正在试验高级 Objective-C 方法。我想要实现的是将特定的绘图代码附加到现有的 UIView

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

@interface UIView (Swizzled)

- (void)my_drawRect:(CGRect)rect;

@end

然后我在category的实现中swizzle了UIViewdrawRect方法:

+ (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 实现?

谢谢!

最佳答案

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

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

在这种情况下,您没有覆盖它,所以 UIView 认为没有理由调用它,即使您用其他东西替换了空实现也是如此。

关于ios - UIView 的 drawRect 在 swizzled 时没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814005/

相关文章:

objective-c - 将 NSString 转换为 HTML 并将 HTML 文本设置为 UILabel

ios - setNeedsDisplay 未调用drawRect

ios - 如何创建适用于 Retina 显示的 CGBitmapContext 而不会浪费常规显示空间?

ios - 为什么 -drawRect 比对 UITableViews 使用 CALayers/UIViews 更快?

objective-c - 获取编译器错误预期标识符/预期方法主体

ios - WatchKit 从 iPhone 中关闭的 App 获取数据

objective-c - NSProxy "transform itself into another object"怎么办?

ios - 如何在应用内购买中识别当前的订阅计划[自动续订]

ios - 将 FBconnect 图查询加载到 Three20 TTTableViewDataSource

ios - UISearchViewController 不允许在解除分配时尝试加载 View Controller 的 View