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作为子视图,那么尝试使用一些包含UIViewUILabel容器。

确保myView属性clipToBounds = NO ,并且myView rect在屏幕上

你的方法中缺less一个重要的细节。 您需要指定一个框架来确定视图的来源和大小。 这可以通过UIViewinitWithRect方法完成,也可以在分配/初始化后设置帧。 既然你有一个自定义的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];