【问题标题】:Container view is covering my image view容器视图覆盖了我的图像视图
【发布时间】:2014-05-31 22:12:26
【问题描述】:

我有一个默认情况下应该被 imageView 隐藏的 containerView,在启动时图像应该覆盖容器。然而,即使 IB 中的分层是正确的,并且在容器之后更新了 imageView,容器仍然显示在图像的前面。有没有办法阻止这种情况发生?

IB的大纲如下:

当我第一次发布这个时,我有图像视图,以及主视图中视图上的三个按钮。但从那以后,我把它改成了它的显示方式。

鉴于我对每个子视图都有如下出口:Container View-Container、Image View-backgroundImage、Buttons-item1、item2、item3。

这是我尝试过的事情的清单:

  1. [self.view sendSubviewToBack: _Container];
  2. [self.view bringSubviewToFront: _item1];
  3. [self.view bringSubviewToFront: _item2];
  4. [self.view bringSubviewToFront: _item3];
  5. [self.view bringSubviewToFront: _backgroundImage];

我也尝试将容器视图从视图控制器的可见坐标中移出,但这也不起作用。

这也是我的 View Controller 的 viewDidAppear 方法:

首先我设置容器视图,然后对按钮和图像视图进行一些初始设置。在这个方法的底部是我放置子视图命令的地方。 希望这会有所帮助。

-(void) viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];
[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];

_item1.center = self.view.center;
_item2.center = self.view.center;
_item3.center = self.view.center;
_item1.layer.anchorPoint = CGPointMake(.5,1.5);
_item3.layer.anchorPoint = CGPointMake(.5,-.5);

CGAffineTransform move1 = CGAffineTransformMakeTranslation(0, -15);
CGAffineTransform move3 = CGAffineTransformMakeTranslation(0, 15);

_item1.transform = move1;
_item3.transform = move3;

[_item1 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item2 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item3 setTranslatesAutoresizingMaskIntoConstraints:YES];

CGAffineTransform scale = CGAffineTransformMakeScale(1.25, 1.25);

_item1.transform = scale;
_item2.transform = scale;
_item3.transform = scale;

_item1.alpha = menuAlpha;
_item2.alpha = menuAlpha;
_item3.alpha = menuAlpha;

_menuBackground.image = [self applyBlurWithRadius:10
                                        tintColor:[UIColor colorWithWhite:.3 alpha:.7]
                            saturationDeltaFactor:1
                                        maskImage:nil];

}

【问题讨论】:

  • 请提供屏幕截图以证明“IB中的分层是正确的”。

标签: ios uiimageview uicontainerview


【解决方案1】:

尽管你的问题的标题,麻烦的视图是不是容器视图。它停留在你放置它的地方。麻烦的视图是一个不同的视图,一个额外的包含视图,它没有出现在故事​​板屏幕截图中——因为嵌入segue或其他形式的父子视图涉及到控制器收容。

可能是您在没有真正了解它是什么的情况下使用了嵌入转场。我注意到您有一个容器视图一个容器视图控制器一些其他视图控制器。可能是你自己搞糊涂了。

一个可能的开始解决方案可能是删除(注释掉)这一行:

[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];
  • 没有必要。您已经从容器视图中获得了嵌入 segue,这将自动执行。如果容器视图没有自动加载正确的视图控制器及其视图,则说明您在情节提要中设置错误(可能包含太多级别)。

  • 这是一种父子视图控制器关系。这意味着子视图控制器将会出现,它的视图,这是一个全新的视图,将被注入到你的界面中。这就解释了为什么不能控制视图的前后位置!您可以随心所欲地使用“容器视图”,但 不是您看到的导致问题的视图 - 导致问题的视图是 新的 查看。因此,您将图像视图置于最前面,但随后将这个新视图注入到所有事物的前面

但是,我会走得更远。通过使用嵌入转场,您已经放弃了对注入视图的分层顺序的所有控制。我建议你问自己两个问题:

  1. 我真的需要父子视图控制器关系吗?在很多情况下,答案是否定的。例如,假设您想要在界面中添加一个小表格视图。有些人认为这需要一个表格视图控制器和一个嵌入segue。但事实并非如此;永远不需要表格视图控制器,您可以使用您的

  2. 将表格作为视图完美地管理
  3. 如果 (1) 的答案确实是肯定的,那么我最好还是手动管理这种关系 - 以及生成的注入视图

如果您这样做了 (2),您将不需要容器视图,并且您可以完全控制注入的视图在哪里以及如何放置到您的界面中。

【讨论】:

  • 这是我对如何手动管理父子视图控制器关系(和视图)的讨论:apeth.com/iOSBook/ch19.html#_container_view_controllers
  • 但实际上,考虑使用它。您可能会更喜欢只有 一个 视图控制器,而其他一切都只是它管理的视图。
  • 非常感谢您提供的链接,它非常有帮助。我只有几个问题。我将拥有一些带有自己视图的主视图控制器,然后该视图将具有一些子视图(按钮和图像视图),这些视图将永久存在,这将充当菜单。但随后我将有几个其他可能的全屏视图,我的问题是,当稍后引入这些子视图时,我仍然可以让它们作为菜单视图后面的一个层进入吗?跨度>
  • 这是一个全新的问题。问一个全新的问题!我试图做的是回答你在这里提出的问题,即为什么这个视图出现在我的图像视图前面。我想我已经成功地解释了这一点。
  • 另外我对此很陌生,所以你能解释一下我如何保留对我的子视图控制器的引用吗?我认为这必须在 IB 中完成,否则在程序运行时您将无法访问它们,对吗?无论如何,我到底在哪里做这个参考?
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多