UIViews 重叠,即使设置原点和大小以保持它们分开

Posted

技术标签:

【中文标题】UIViews 重叠,即使设置原点和大小以保持它们分开【英文标题】:UIViews overlap even when setting origin and size to keep them separate 【发布时间】:2015-10-20 16:22:48 【问题描述】:

我正在尝试设计一个汉堡菜单,这意味着导航角左上角的一个小按钮,当按下该按钮时,左侧会显示一个菜单,并在右侧保留部分可见的原始视图。

但是,在我的代码中,我无法正确定位两个视图(汉堡菜单视图和主视图),并且它们重叠。这是我在viewDidLoad() 中所做的事情。

CGRect frame = self.containerView.bounds;

int widthForHamburgerVC = 150;
CGRect hamburgerVCFrame = frame;
hamburgerVCFrame.size.width = widthForHamburgerVC;
hamburgerVCFrame.origin.x = 0;
self.hamburgerVC.view.frame = hamburgerVCFrame;
self.hamburgerVC.view.bounds = hamburgerVCFrame;

CGRect mainVCFrame = self.containerView.bounds;
mainVCFrame.origin.x = widthForHamburgerVC;
self.mainVC.view.frame = mainVCFrame;

[self.containerView addSubview:self.mainVC.view];
[self.containerView addSubview:self.hamburgerVC.view];

containerView 是占据整个屏幕的视图。因此,从代码来看,意图是让 hamburgerVC 视图从 x = 0 开始,宽度为 150 个单位,而 mainVC 视图从 x = 150 开始,并具有通常的宽度。不应该有任何重叠,但它看起来像这样。

红色汉堡包视图与主视图重叠。两个视图之间大约有 50 个单位重叠,我无法解释。我尝试设置断点并检查两个视图的宽度和 x 坐标,结果符合预期(汉堡视图:x = 0,宽度 = 150。主视图:x = 150,宽度 = 320)。

是否有人发现设置这些视图的代码有任何问题?两者都启用了自动布局。

【问题讨论】:

尝试在 viewWillAppear 中进行。您永远不应该在 viewDidLoad 中对子视图进行任何布局,因为尚未(始终)设置框架。 【参考方案1】:

如果您使用自动布局,则应避免指定框架。您应该通过更改约束来调整视图。您可以在代码中为您的约束创建出口并指定更改,然后在约束更新的视图上调用 layoutIfNeeded 方法。

【讨论】:

以上是关于UIViews 重叠,即使设置原点和大小以保持它们分开的主要内容,如果未能解决你的问题,请参考以下文章

如果我的 UIViews 边框颜色 alpha 小于 1.0,如何避免颜色重叠?

当我们在运行时更改模拟器方向时,UIViews 重叠

如何将图形保持在主窗口的中心

UIButton 原点和设备方向

模态视图控制器即使在设置其框架 iphone 后也会与导航栏重叠

防止视图重叠