2014-09-25 67 views
4

我有一个非常简单的UIView,那只是画一个三角形。它实现了一个绘制数字的方法UIView drawRect。它在iOS7上工作正常,但是当我在iOS8上运行相同的代码时,它甚至没有被调用。任何想法在iOS8上发生了什么变化?我在一言以蔽之代码:iOS8问题 - UIView drawRect不叫

@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

这是一个错误信息泡沫,而我的观点是指向一个东西喙。

我已经使用了一个新的UI调试工具,但它在那里不可见。 Init方法被调用,drawRect不是。 iOS8中一定有变化,因为iOS7叫drawRect

更新2
当然,我使用的限制(和Masonry POD),这就是为什么我没有指定的帧。

[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],但没有帮助。

+1

有关视图层次结构中引入视图的更多信息?您是否使用新的调试工具检查了视图层次结构,以查明您的视图在哪里? – Vinzzz 2014-09-25 12:20:35

+0

@Vinzzz更新了问题。如果您需要更多信息,请告诉我。 – KlimczakM 2014-09-25 12:31:49

+0

好的...所以你使用这个MASConstraintMaker ...也许iOS 8的bug来自那个类? – Vinzzz 2014-09-25 14:21:07

回答

2

问题终于解决了。我不确定究竟是什么导致了问题(Masonry [约束框架]或iOS8更改为UILabel),但解决方案是更改视图层次结构。我创建了另一个UIView,其中包含UILabel和我的UIView(绘制的喙),而不是将UIView添加到UILabel作为子视图。现在在iOS7和iOS8上调用drawRect方法。

上一个层次:
UIViewController View->Custom UILabel->MyView

新的层次结构:
UIViewController View->Container UIView->Custom UILabel & MyView

综上所述,如果你的drawRect方法不叫上iOS8上,且要添加一些UIViewUILabel作为子视图,尝试使用包含UIViewUILabel的容器。

0

您的方法中缺少一个重要细节。您需要指定一个框架来确定视图的来源和大小。这可以通过的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]; 
+0

感谢您的回复。我当然使用约束,所以我的代码中没有框架。对不起,忘了写这个。已经更新了这个问题。 – KlimczakM 2014-09-25 12:53:14

+0

您可能想要尝试调用[self.view layoutSubviews]以确保您的约束正在被正确处理和渲染。 – dgangsta 2014-09-25 13:06:16

0

确保myView的上海华物业clipToBounds = NO,那myView矩形是在屏幕上