iOS8问题 – 不调用UIView drawRect
我有一个非常简单的UIView
,那只是画一个三angular形。 它实现了一个绘制graphics的UIView drawRect
方法。 它在iOS7上工作正常,但是当我在iOS8上运行相同的代码时,甚至没有被调用。 任何想法在iOS8上发生了什么变化? 我的代码简而言之:
@interface MyView : UIView @end @implementation MyView - (instancetype)init { self = [super init]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; } - (void)drawRect:(CGRect)rect { // draw things } @end myView = [MyView new]; [self addSubview:myView];
更新
我的视图层次结构: UIViewController View->Custom UILabel->MyView
这是一个错误消息的泡沫,我的观点是一个指向某事的喙。
我已经使用了一个新的UIdebugging工具,但它不可见。 Init方法被调用, drawRect
不是。 iOS8中的一些东西一定会改变,因为iOS7正在调用drawRect
。
更新2
当然我使用约束(和Masonry
荚),这就是为什么我没有指定框架。
[myView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(make.superview.mas_bottom); make.centerX.equalTo(make.superview); make.width.equalTo(@10.0f); make.height.equalTo(@5.0f); }];
我也尝试在不同的地方添加[myView setNeedsDisplay]
,但没有帮助。
问题终于解决了。 我不确定究竟是什么导致了问题( Masonry
[约束框架]或iOS8更改为UILabel
),但解决scheme是更改视图层次结构。 我创build了另一个UIView
,包含UILabel
和我的UIView
(绘制的喙),而不是将UIView
作为子视图添加到UILabel
。 现在在iOS7和iOS8上调用drawRect
方法。
以前的层次:
UIViewController View->Custom UILabel->MyView
新的等级:
UIViewController View->Container UIView->Custom UILabel & MyView
总之,如果你的drawRect
方法在iOS8上没有被调用,并且你正在向UILabel
添加一些UIView
作为子视图,那么尝试使用一些包含UIView
和UILabel
容器。
确保myView
属性clipToBounds = NO
,并且myView
rect在屏幕上
你的方法中缺less一个重要的细节。 您需要指定一个框架来确定视图的来源和大小。 这可以通过UIView
的initWithRect
方法完成,也可以在分配/初始化后设置帧。 既然你有一个自定义的init
方法,我会做以下几点:
myView = [MyView new]; myView.frame = CGRectMake(0.0,0.0,100.0,100.0); [self addSubview:myView];
这将绘制您的自定义视图的原点(0.0,0.0)和宽度和高度100.0。
此外,如果您仍然遇到问题,那么添加对setNeedsDisplay
的调用应该强制调用drawRect
方法:
[myView setNeedsDisplay];