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甚至是我的调配实现?
谢谢!
首先,读取drawRect或不读取drawRect(何时应该使用drawRect/Core Graphics vs subviews/images以及为什么?)
基本上,UIView检查您是否覆盖drawRect:.如果不覆盖它,它可以进行大量的绘图优化,甚至不会调用该方法.
在这种情况下,你没有覆盖它,所以UIView没有理由调用它,即使你用其他东西替换了空实现.
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |