关于视图层次结构,需要澄清

Posted

技术标签:

【中文标题】关于视图层次结构,需要澄清【英文标题】:On view hierarchy, clarification needed 【发布时间】:2011-11-21 00:08:01 【问题描述】:

在此代码示例中,我试图生成以下视图层次结构

窗口 -> 背景图片 -> 滚动视图 -> 文本视图

我看到的只是

窗口 -> 背景图片

请问我错过了什么?

-(void) viewWillAppear:(BOOL)animated 

    UIScrollView *scrollWindow = [[UIScrollView alloc] 
                 initWithFrame:CGRectMake(30, 30, 440, 212)];

    UITextView *scrollableText = [[UITextView alloc] init];

    [scrollableText setEditable:NO];
    [scrollableText setText:@"Why, hello there"];

    [scrollWindow addSubview:scrollableText];

    UIImage *backgroundImage = [[UIImage alloc] initWithCGImage:
             [UIImage imageNamed:@"about_bg.png"].CGImage];
    UIImageView *backgroundView = [[UIImageView alloc] 
             initWithImage:backgroundImage];

    [backgroundView addSubview:scrollWindow];

    [[self view] addSubview:backgroundView];


【问题讨论】:

UITextView 已经是 UIScrollView 的子类。您确定在层次结构中还需要一个滚动视图吗? @Davyd,谢谢。我之前没有意识到这一点 【参考方案1】:

Andrew 关于不让滚动视图成为背景UIImageView 视图的子视图是正确的。但是滚动视图不可见的。只会显示其内容 (scrollableText)。而且你还没有设置scrollableText 的框架,所以它实际上也是不可见的。像这样初始化:

[scrollableText setEditable:NO];
[scrollableText setText:@"Why, hello there"];
[scrollableText setFrame:CGRectMake(0, 0, 100, 100)];

你应该会看到的。

【讨论】:

对文本视图框架的良好调用。但是在视图上......你是说滚动视图和背景图像视图在层次结构上应该是相等的吗? 是的(由答案编辑以使其更加清晰)。它可能会起作用,这可能是一种风格上的东西,但在我看来:UIImageView 的层和子视图是一个实现细节。它会执行一些非特定且未记录的操作来显示图像。谁知道现在和将来这将如何与用户添加的子视图交互?这与奇怪的行为相结合,例如它从不调用 -drawRect:,并且默认情况下用户与它的交互是 disabled 的,我觉得在 UIImageViews 之上合成视图比弄乱它们的层次结构更安全.【参考方案2】:

你需要的是这个层次结构:

Window
  background image view
  scroll view
    text view

尝试将两个子视图添加到您的窗口中,而不是将它们作为子视图相互推挤。''-

   - (void) viewWillAppear:(BOOL)animated 

      UIScrollView *scrollWindow = [[UIScrollView alloc] initWithFrame:CGRectMake(30, 30, 440, 212)];

      UITextView *scrollableText = [[UITextView alloc] init];

      UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"about_bg.png"]];

      scrollableText.editable = NO;
      scrollableText.text = @"Why, hello there";

      [scrollWindow addSubview:scrollableText];

      [self.view addSubview:backgroundView];
      [self.view addSubview:scrollWindow];
    

【讨论】:

以上是关于关于视图层次结构,需要澄清的主要内容,如果未能解决你的问题,请参考以下文章

将滚动视图添加到集合视图层次结构

视图层次结构没有为约束做好准备?

iOS 视图与视图层次结构(内容根据iOS编程)

视图不在窗口层次结构错误中

iOS 程序约束:“在容器层次结构中找不到视图”

Android 错误“只有创建视图层次结构的原始线程才能触摸其视图”