iOS UIView 不调整子视图的大小?
Posted
技术标签:
【中文标题】iOS UIView 不调整子视图的大小?【英文标题】:iOS UIView Not Resizing Subviews? 【发布时间】:2016-04-17 21:50:41 【问题描述】:我正在以编程方式从情节提要加载视图,但我的子视图高度存在问题(我正在使用 Autoresize Subviews 等)。
当视图加载时,主 UIView 的大小似乎是正确的,但依赖约束来动态计算其最终高度的子视图似乎并没有根据它们在界面生成器中设置的大小调整大小。
像这样加载视图:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ApplicationRecordingViewController* recordingController = (ApplicationRecordingViewController*)[storyboard instantiateViewControllerWithIdentifier:@"recordView2"];
[self presentViewController:recordingController animated:NO completion:nil];
橙色区域的高度是从主视图顶部到灰色区域顶部。灰色区域是固定高度
奇怪的是,如果我在界面生成器中将模拟尺寸设置为我手机的正确视图,尺寸就会生效。我猜想子视图的初始高度被“烘焙”到视图中,但是(通常)在视图实际加载时调整大小?
注意:橙色区域应该被我正在加载的相机视图完全填充。
高度不正确
如果我更改模拟布局,则高度正确
很想知道我做错了什么!
编辑 1:约束
相机是橙色的。 Camera 底部约束当前设置为视图底部 + 灰色条的足够空间。也尝试过设置底部以匹配灰色条的顶部!
Link to Storyboard with Scene
【问题讨论】:
您为各种视图设置了哪些约束? 我已将约束添加为编辑! 除了与蓝条相关的位置外,您没有水平放置覆盖视图。如果您希望叠加层相对于相机视图的底部定位,我希望看到这样的约束 叠加层是红色条。它位于灰色条的正上方(高度固定),当我为我的设备模拟正确的屏幕尺寸时,它似乎确实这样做了。 那么哪些观点不正确呢?我认为您过于依赖固定高度。您通常需要至少一个高度可以“浮动”的对象来占用剩余空间。当您向下移动屏幕时,我希望在各种视图之间看到更多的顶部/底部约束 【参考方案1】:我知道你们都比我好,但我在上一个项目中也有同样的经历。我在 UIView 中的 Camera View 不是全屏或调整大小和适合整个 UIView,我也将它发布在 my daily blog.
实现 viewDidLayoutSubviews -- 在该方法内,再次布局您的视频预览层。不要在该方法内分配初始化任何内容,只需重新布局您的视图。之后,您的视频预览将填充其父级的高度和宽度,或者您所定位的任何内容。
这个问题还与约束和视图的层次结构有关。
【讨论】:
我认为这绝对是相机视图。事实证明,我的解决方案是在初始化相机视图本身(例如在 viewDidAppear 中)之前确保所有内容都正确布置。【参考方案2】:你已经得到答案了。
'如果我在界面生成器中将模拟尺寸设置为我手机的正确视图,尺寸就会生效。'
您可以在 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];
【讨论】:
【参考方案3】:正如我在您的故事板约束中看到的,您已将底部空间设置为底部布局指南 150 。我认为这是问题所在。如果您为底部视图提供固定高度,则无需像底部布局指南那样设置常量 --> 150 。
你的旧约束:- >
只需从 greenview = 0 设置 orangeview 的底部空间。
检查新的约束,
这是您的故事板链接,
Storyboard Download link
这是你的输出,
【讨论】:
【参考方案4】:在进一步调查布局后,我发现相机视图(橙色)的大小似乎正确,但实时相机预览不正确。
解决方法是将相机库(SCRecorder) 的 init 方法移到 viewDidAppear 中(之前在 viewDidLoad 中)。
我的想法是 ios 不会像普通 UIView 等那样自动布局相机预览视图。
@interface ApplicationRecordingViewController ()
SCRecorder *_recorder;
@end
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
_recorder.previewView = _previewView;
【讨论】:
【参考方案5】:也许你可以尝试摆脱这两个钩子。
【讨论】:
以上是关于iOS UIView 不调整子视图的大小?的主要内容,如果未能解决你的问题,请参考以下文章
使用固定大小的子视图和自动布局调整 UIView 的大小不起作用