0

我有一个默认情况下应该被 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];

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

这也是我的视图控制器的 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];

}

4

1 回答 1

0

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

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

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

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

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

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

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

  2. 如果 (1) 的答案确实是肯定的,那么我是否会更好地手动管理这种关系 -以及由此产生的注入视图

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

于 2014-06-01T15:23:44.780 回答