iOS8问题 - 未调用UIView drawRect

时间:2014-09-25 12:10:52

标签: ios objective-c iphone uiview ios8

我有一个非常简单的UIView,它只绘制一个三角形。它实现了一个绘制图形的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

这是一个错误的消息泡泡,我的观点是指向某个东西的喙。

我使用过新的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],但它没有帮助。

3 个答案:

答案 0 :(得分: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上调用,并且您要将一些UIView添加到UILabel作为子视图,请尝试使用一个包含两个UIView的容器{1}}和UILabel

答案 1 :(得分:0)

您的方法中缺少重要细节。您需要指定一个框架来确定视图的原点和大小。这可以使用initWithRect的{​​{1}}方法完成,也可以在分配/初始化后设置帧。由于您已经有自定义UIView方法,因此我会执行以下操作:

init

这将绘制您的自定义视图,其原点为(0.0,0.0),宽度和高度为100.0。

此外,如果您仍遇到问题,添加对myView = [MyView new]; myView.frame = CGRectMake(0.0,0.0,100.0,100.0); [self addSubview:myView]; 的调用应强制调用setNeedsDisplay方法:

drawRect

答案 2 :(得分:0)

确保myView的超级视图属性clipToBounds = NOmyView矩形在屏幕上