当两者具有相同的超级视图时,根据其他子视图居中子视图

Posted

技术标签:

【中文标题】当两者具有相同的超级视图时,根据其他子视图居中子视图【英文标题】:center subview according to other subview when both have the same superview 【发布时间】:2015-03-06 12:56:08 【问题描述】:

如果我有 contentView 和 2 个子视图。 我想根据 subviewB 将 subviewA 居中

subviewA 和 subviewB 具有相同的父视图。

这就是我现在要在 uitableview 上方居中的 subviewA(活动指示器)。

self.subViewA.frame = CGRectMake(CGRectGetMidX(self.tableView.frame)-self.subViewA.bounds.size.width/2,
                                                                 CGRectGetMidY(self.tableView.frame)-self.subViewA.bounds.size.height/2,
                                                                 self.subViewA.bounds.size.width,
                                                                 self.subViewA.bounds.size.height);

有更清洁/更短的方法吗?任何存在的方法,我错过了:)?

我想也许有类似的东西:subviewA.frame = centerInOtherFrame(self.subviewB.frame)

【问题讨论】:

约束?如果你得到框架等,你可以通过代码来完成。 您的视图会有一些动态行为吗?你在使用自动布局吗? 我更新了这个问题。我没有使用自动布局。只能通过 layoutSubViews 中的代码。 【参考方案1】:

您的方法可以简化为

self.subViewA.center = self.tableView.center;

【讨论】:

TableView 的中心位于其父视图的坐标中。 SubViewA 的中心应该在 TableView 的坐标中。因此,如果没有适当的坐标转换,这将无法工作。 @Taha "subviewA 和 subviewB 具有相同的超级视图。" 是的,这是真的。但是想象一下:tableView frame=>(0,600,300,300)。所以 tableView.center 是 (150,300)。还假设 subView 的 size=>(100,100)。现在如果你将子视图的中心设置为表格视图的中心,子视图的框架将变为(100,200,100,100)。这意味着子视图不在 tableView 中居中,而是在底部。这就是我想要表达的观点。 @Taha 在你的例子中tableView.center 实际上是(150, 750)subview.frame(100, 700, 100, 100),它在tableView 上方居中(假设它们都在同一个容器中)

以上是关于当两者具有相同的超级视图时,根据其他子视图居中子视图的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局垂直居中子视图

以自定义垂直距离水平居中子视图|斯威夫特

Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView

根据最大的子视图使用自动布局调整超级视图的大小

ScrollView中子视图控制器和超级视图控制器之间的通信

垂直自动布局子视图