为啥 addSubview: with autolayout 添加一个尺寸不好的子视图?

Posted

技术标签:

【中文标题】为啥 addSubview: with autolayout 添加一个尺寸不好的子视图?【英文标题】:Why addSubview: with autolayout adds a subview with bad size?为什么 addSubview: with autolayout 添加一个尺寸不好的子视图? 【发布时间】:2018-02-25 01:33:39 【问题描述】:

我在 UIViewController 中有一个 UIView。我正在使用 Objective-c 和自动布局故事板。这是一个简单的步骤:以编程方式将 UIView 添加到我的故事板的 UIView 中。

我正在使用此代码:

UIView *newView = [[UIView alloc]initWithFrame:myStoryboardView.frame];
[newView setNeedsLayout];
[myStoryboardView addSubview:newView];

我也尝试使用边界而不是框架:

UIView *newView = [[UIView alloc]initWithFrame:myStoryboardView.bounds];
[newView setNeedsLayout];
[myStoryboardView addSubview:newView];

但是当我运行这个时,宽度是错误的,不像我的第一个 UIView 的宽度。但是,如果我将情节提要更改为与我用来运行应用程序的模拟器相同的情节提要,则两个 UIView 中的宽度相同...

如何自动设置与我在情节提要中的第一个视图相同的宽度。

【问题讨论】:

尝试将TranslatesAutoresizingMaskIntoConstraints 设置为false 在您的newViewclipsToBounds 上设置true 我在将我的 newView 添加到情节提要中的视图之前和之前添加此代码,但它不起作用 [newView setTranslatesAutoresizingMaskIntoConstraints:NO]; newView.clipsToBounds = YES;我该如何解决这个问题? 如果他禁用自动调整掩码翻译,他将需要在他的视图上设置顶部、底部、前导和尾随约束。与依赖自动调整大小相比,这仍然是首选,但我离题了......无论如何,如果父视图框架不为零,它应该可以在不修改这些属性的情况下工作。 【参考方案1】:

您能否确保此时 myStoryboardView.frame 是正确的?你在哪里执行这段代码?可能此时情节提要视图刚刚从情节提要文件(其中包含您在 IB 中设置的框架)初始化,并且尚未调整到屏幕尺寸,这将在稍后发生。如果您使用的是 UIViewController,请尝试将此代码放入 viewWillApper 方法中。

【讨论】:

【参考方案2】:

尝试在 viewDidLoad 中的某处分配这个新的子视图。然后在 viewDidAppear 中将其框架设置为 superview bouds:

- (void)viewDidLoad 
  UIView *view = UIView.new;
  view.tag = 100; // or store it as a property
  [storyboardView addSubview:view];


- (void)viewDidAppear:(BOOL)animated 
  [[storyboardView viewWithTag:100] setFrame:storyboardView.bounds];

【讨论】:

以上是关于为啥 addSubview: with autolayout 添加一个尺寸不好的子视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 addSubview 为我的 UIView 添加了额外的长度,这是为啥呢?

为啥我会收到 exception_with_response 503 Service Unavailable with Ruby?

为啥在使用`with`时会延迟`not deferable`约束?

为啥 Cypher 中的变量需要提醒 `WITH` 子句?

为啥“WITH”子句在 Informix 上会出现语法错误?

为啥在 AVCapturePhotoOutput 上调用 .capturePhoto(with:,delegate:) 会导致崩溃