iOS / Objective-C:子视图的子视图未显示

时间:2018-08-12 17:42:50

标签: ios objective-c addsubview

我正在尝试创建一个图表,其中以UIView形式的条形图显示在背景UIView的顶部。我希望两者都显示在整个屏幕的UIView上。我已经成功完成了此操作,但是尽管可以显示第一个视图,但是我却无法以某种方式显示代码。可能与设置颜色有关吗?还是有人可以建议为什么不显示第二个子视图。

我的代码:

//Make background box:  
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    CGFloat graphWidth = screenWidth-40;
    CGFloat graphHeight = 160;
      CGRect graphBounds =CGRectMake(20, 200, graphWidth, graphHeight);
    float tableStartY = graphBounds.origin.y;

    UIView *graphBox = [[UIView alloc] initWithFrame:graphBounds];
    graphBox.backgroundColor = [UIColor colorWithRed:200.0/255.0 green:200.0/255.0 blue:200.0/255.0 alpha:0.2]; graphBox.layer.borderWidth = 1;
    graphBox.layer.borderColor = [UIColor blueColor].CGColor;

//Make Bar

    CGFloat barWidth = 20;
    CGFloat barHeight = 100;
    CGRect aBar = CGRectMake(20, tableStartY+1, barWidth, barHeight);
    UIView *barView = [[UIView alloc] initWithFrame:aBar];
   barView.backgroundColor = [UIColor blueColor];
    barView.layer.borderWidth = 1;
    barView.layer.borderColor = [UIColor redColor].CGColor;

   // [graphBox addSubview:barView];
    [self.view addSubview: graphBox];

如果运行上面的代码,它将显示graphBox。如果我将条形图作为子视图而不是graphBox直接添加到视图中,则显示条形图。但是,如果我取消注释显示的行,然后先将barView添加到graphBox,然后再将graphBox添加到视图,则不会显示barView。

预先感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您需要做什么,则应该更换

CGRect aBar = CGRectMake(20, tableStartY+1, barWidth, barHeight);

使用

CGRect aBar = CGRectMake(20, 1, barWidth, barHeight);

[edit:显然取消了addSubview行的注释]

答案 1 :(得分:1)

也许这是您发布的代码中的意外,但是您特别注释了osprey-mock-service将添加到屏幕的位置。

barView

此外,如another answer所示,如果将 // [graphBox addSubview:barView]; 添加到barView,则偏移量是不正确的。如果您将其添加到graphBox,则偏移量是正确的。

因此,根据视图层次结构中所需的包含性,您有两种选择:

self.view

CGRect aBar = CGRectMake(20, 1, barWidth, barHeight);
// ...
[graphBox addSubview:barView];

请注意,在第二个选项中,顺序很重要,这样才能使CGRect aBar = CGRectMake(20, tableStartY+1, barWidth, barHeight); // ... [self.view addSubview: graphBox]; [self.view addSubview:barView]; 显示在barView上方,因为它们将成为同级。