iOS UIView未调整子视图的大小?

iOS UIView未调整子视图的大小?,ios,objective-c,uiview,autolayout,Ios,Objective C,Uiview,Autolayout,我正在以编程方式从故事板加载视图,但我的子视图高度有问题,我正在使用自动调整子视图大小等 加载视图时,主UIView的大小似乎正确,但依赖约束动态计算其最终高度的子视图似乎没有从interface builder中设置的大小调整大小 按如下方式加载视图: UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; ApplicationRecordingViewController* recor

我正在以编程方式从故事板加载视图,但我的子视图高度有问题,我正在使用自动调整子视图大小等

加载视图时,主UIView的大小似乎正确,但依赖约束动态计算其最终高度的子视图似乎没有从interface builder中设置的大小调整大小

按如下方式加载视图:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ApplicationRecordingViewController* recordingController = (ApplicationRecordingViewController*)[storyboard instantiateViewControllerWithIdentifier:@"recordView2"];
[self presentViewController:recordingController animated:NO completion:nil];
橙色区域的高度是从主视图顶部到灰色区域顶部。灰色区域是固定高度

奇怪的是,如果我将interface builder中的模拟大小设置为手机的正确视图,那么大小就会正确。我猜子视图的初始高度是“烘焙”到视图中的,但通常在视图实际加载时调整大小

注意:橙色区域应该完全被我加载到其中的摄影机视图填充

不正确的高度

更改模拟布局时的正确高度

我很想知道我做错了什么

编辑1:约束

照相机是橙色的。“摄影机底部”约束当前设置为视图的底部+灰色条的足够空间。还尝试设置底部以匹配灰色条的顶部


我知道你们都比我强,但我在上一个项目中也有同样的经历。我在UIView中的相机视图不是全屏的,也不是调整整个UIView的大小和尺寸的,我也把它贴在了上面

实现viewDidLayoutSubviews-在该方法中,再次布局视频预览层。不要在该方法中分配任何内容,只需重新布局视图。之后,您的视频预览将填充其父视频的高度和宽度,或任何您所瞄准的对象

这个问题还与约束和视图的层次结构有关


你已经得到答案了

“如果我在interface builder中将模拟大小设置为手机的正确视图,那么大小就会正确。”

您可以调用一些函数来获取viewDidLoad或ViewWillDisplay中的高度

像这样更改代码

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];

    CGFloat height = [self getHeight];
}


正如我在故事板中看到的,您已将底部空间设置为底部布局指南150。我认为这就是问题所在。如果给底部视图指定固定高度,则无需从底部布局指南->150设置常量

您的旧约束:->

只需将orangeview的底部空间从greenview设置为0

检查新约束

这是你的故事板链接

这是您的输出


也许你可以试着摆脱这两个钩子


在进一步研究布局之后,我发现相机视图橙色似乎大小正确,但实时相机预览却不正确

解决方案是将相机库的init方法移动到viewDidLoad中

我的想法是iOS不会像普通UIView那样自动布局相机预览视图,等等

@interface ApplicationRecordingViewController () {
    SCRecorder *_recorder;
}
@end

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    _recorder.previewView = _previewView;
}

您为各种视图设置了哪些约束?我添加了这些约束作为编辑!除了相对于蓝色条,您不会水平定位覆盖视图。如果您希望覆盖相对于摄影机视图的底部进行定位,我希望看到一个约束,即soOverlay是红色条。它位于固定高度的灰色条的正上方,当我为我的设备模拟正确大小的屏幕时,它确实会这样做。那么哪些视图是不正确的呢?我认为你太依赖固定高度了。通常,您希望至少有一个高度可以浮动的对象占据剩余空间。当你向下移动屏幕时,我希望在不同的视图之间看到更多的上/下约束。我想这肯定是相机视图。事实证明,我的解决方案是,在初始化相机视图之前,确保所有内容都正确布局,例如,在VIEWDID中显示。
@interface ApplicationRecordingViewController () {
    SCRecorder *_recorder;
}
@end

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    _recorder.previewView = _previewView;
}