iOS UIView没有调整子视图的大小?

时间:2016-04-17 21:50:42

标签: ios objective-c uiview autolayout

我以编程方式从故事板加载视图,但是我的子视图高度存在问题(我使用自动调整子视图等)。

当视图加载时,主UIView似乎是正确的大小,但是依赖于动态计算其最终高度的约束的子视图似乎从它们在界面中设置的大小调整大小助洗剂。

像这样加载视图:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ApplicationRecordingViewController* recordingController = (ApplicationRecordingViewController*)[storyboard instantiateViewControllerWithIdentifier:@"recordView2"];
[self presentViewController:recordingController animated:NO completion:nil];

Interface Builder

橙色区域的高度是从主视图顶部到灰色区域顶部。灰色区域是固定高度

奇怪的是,如果我将界面构建器中的模拟大小设置为我手机的正确视图,那么这些尺寸就可以了。我想子视图的初始高度是“烘焙”#39;进入视图,但是当视图实际加载时(通常)调整大小?

注意:橙色区域应完全由相机视图填充。

incorrect height

身高不正确

correct height

如果我更改模拟布局,请更正高度

很想知道我做错了什么!

修改1:约束

相机是橙色位。 Camera底部约束当前设置为视图的底部+灰色条的足够空间。还试过设置底部以匹配灰色条的顶部!

Constraints

Constraints 2

Link to Storyboard with Scene

5 个答案:

答案 0 :(得分:0)

我知道你比我更好,但我在上一个项目中也经历了同样的事情。 UIView中的我的相机视图不是全屏或调整大小并适合整个UIView,我也将其发布在my daily blog.

实现viewDidLayoutSubviews - 在该方法内部,再次布局视频预览图层。不要在该方法内部分配任何内容,只需重新布局视图。之后,您的视频预览将填充其父级的高度和宽度,或者您正在定位的任何内容。

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

enter image description here

答案 1 :(得分:0)

你已经得到了答案。

'如果我将界面构建器中的模拟尺寸设置为我手机的正确视图,则尺寸可以确定。'

您可以调用某些函数来获取viewDidLoad或viewWillAppear中的高度。

像这样改变代码

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

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

    CGFloat height = [self getHeight];
}

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

    CGFloat height = [self getHeight];
}

答案 2 :(得分:0)

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

你原来的约束: - >

enter image description here

只需从greenview = 0设置orangeview的底部空间。

检查新约束,

enter image description here

这是您的故事板链接,

Storyboard Download link

这是你的输出,

enter image description here

答案 3 :(得分:0)

稍微调查一下布局后,我发现相机视图(橙色)似乎是正确的尺寸,但实时相机预览不是。

解决方法是将相机库(SCRecorder)的初始化方法移动到viewDidAppear中(之前在viewDidLoad中)。

我的想法是iOS没有像普通UIViews那样自动布局相机预览视图。

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

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

    _recorder.previewView = _previewView;
}

答案 4 :(得分:-1)

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

enter image description here