Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 第二次向窗口添加视图不可见_Ios_Objective C_Autolayout - Fatal编程技术网

Ios 第二次向窗口添加视图不可见

Ios 第二次向窗口添加视图不可见,ios,objective-c,autolayout,Ios,Objective C,Autolayout,我有一个视图(View1),最初布置在屏幕的右侧,左侧有一个tableview,两个视图都固定在内容视图的外边缘。我试图支持动画视图1全屏,同时也覆盖在它上面的另一个视图,以提供一些控制,如退出全屏 我能够以编程方式存储与View1关联的内容视图的约束和框架,将View1添加到窗口的视图中,然后在其顶部添加覆盖视图,而不会出现问题。我还能够支持退出全屏,这将删除覆盖视图,将View1添加回原始内容视图,并将存储的非View1帧和约束恢复到内容视图。这很有效。然而,第二次尝试全屏显示是行不通的。视

我有一个视图(View1),最初布置在屏幕的右侧,左侧有一个tableview,两个视图都固定在内容视图的外边缘。我试图支持动画视图1全屏,同时也覆盖在它上面的另一个视图,以提供一些控制,如退出全屏

我能够以编程方式存储与View1关联的内容视图的约束和框架,将View1添加到窗口的视图中,然后在其顶部添加覆盖视图,而不会出现问题。我还能够支持退出全屏,这将删除覆盖视图,将View1添加回原始内容视图,并将存储的非View1帧和约束恢复到内容视图。这很有效。然而,第二次尝试全屏显示是行不通的。视图1不可见,覆盖视图仅部分可见

这些视图在我想打印出来的任何时候都有合适的大小,包括ViewDidLayoutSubView。布局完所有内容后检查视图,我看到View1的高度为零,覆盖视图将折叠以仅适合其子视图

我怀疑自动布局在起作用,希望我只是错过了退出全屏上的一些东西。任何帮助都将不胜感激

编辑:全屏移动视图的代码是:

// View1
for (NSLayoutConstraint *constraint in self.contentView.constraints) {
    if (constraint.firstItem == self.imageView || constraint.secondItem == self.imageView) {
        [self.nonFullscreenConstraints addObject:constraint];
    }
}
self.nonFullscreenFrame = self.imageView.frame;
[self.view.window addSubview:self.imageView];
[self.view.window bringSubviewToFront:self.imageView];
self.imageView.frame = self.view.window.frame;

// Overlay
[self.view.window addSubview:self.fullscreenOverlayView];
[self.view.window bringSubviewToFront:self.fullscreenOverlayView];
self.fullscreenOverlayView.frame = self.view.window.frame;
// View1
self.imageView.frame = self.nonFullscreenFrame;
self.nonFullscreenFrame = CGRectZero;
[self.contentView addSubview:self.imageView];
for (NSLayoutConstraint *constraint in self.nonFullscreenConstraints) {
    [self.contentView addConstraint:constraint];
}
[self.nonFullscreenConstraints removeAllObjects];

// Overlay
[self.fullscreenOverlayView removeFromSuperview];
我退出全屏的代码是:

// View1
for (NSLayoutConstraint *constraint in self.contentView.constraints) {
    if (constraint.firstItem == self.imageView || constraint.secondItem == self.imageView) {
        [self.nonFullscreenConstraints addObject:constraint];
    }
}
self.nonFullscreenFrame = self.imageView.frame;
[self.view.window addSubview:self.imageView];
[self.view.window bringSubviewToFront:self.imageView];
self.imageView.frame = self.view.window.frame;

// Overlay
[self.view.window addSubview:self.fullscreenOverlayView];
[self.view.window bringSubviewToFront:self.fullscreenOverlayView];
self.fullscreenOverlayView.frame = self.view.window.frame;
// View1
self.imageView.frame = self.nonFullscreenFrame;
self.nonFullscreenFrame = CGRectZero;
[self.contentView addSubview:self.imageView];
for (NSLayoutConstraint *constraint in self.nonFullscreenConstraints) {
    [self.contentView addConstraint:constraint];
}
[self.nonFullscreenConstraints removeAllObjects];

// Overlay
[self.fullscreenOverlayView removeFromSuperview];

发现了问题。我没有将覆盖视图添加回原始父视图,并以与View1相同的方式恢复约束。完成此操作后,我可以按预期在全屏显示中弹出。

我怀疑一个问题是,您在更改约束之前更改了视图层次结构。删除我相信的视图会删除任何约束。您可能应该首先复制约束,然后移动视图,然后应用约束和所需的最后一个布局。这就是我在View1下的第一个for循环中所做的。我不存储覆盖约束,因为它只需要全屏显示,并且在我需要它之前它只是浮动的。如果在这些循环之前和之后中断点,您可以确认应用了正确的约束吗?刚刚确认的约束对于View1完全相同。视图的行为也符合预期。