Ios 如何使标签的第一行位于另一视图的同一中心位置

Ios 如何使标签的第一行位于另一视图的同一中心位置,ios,autolayout,Ios,Autolayout,我想把这些单词的第一行(我在这里使用的是UI标签,还是应该使用文本视图?),在红线的中心,红线的中心位于黄色UIView的中心 我尝试了一些自动布局配置,但仍然未能实现这一点 这是一个复杂的过程。花点时间去理解整个逻辑 首先,我们有一些考虑: 黄色视图具有定义的高度(以及定义的宽度,以便确定其水平中心) 标签具有固定的字体大小(因此第一行的水平中心可以通过约束与黄色视图的水平中心对齐) 我们将在黄色视图的右侧添加一个占位符视图,并使其居中对齐。这是方便的UIStackView 我们采用具有

我想把这些单词的第一行(我在这里使用的是UI标签,还是应该使用文本视图?),在红线的中心,红线的中心位于黄色UIView的中心

我尝试了一些自动布局配置,但仍然未能实现这一点
这是一个复杂的过程。花点时间去理解整个逻辑

首先,我们有一些考虑:

  • 黄色视图具有定义的高度(以及定义的宽度,以便确定其水平中心)
  • 标签具有固定的字体大小(因此第一行的水平中心可以通过约束与黄色视图的水平中心对齐)

我们将在黄色视图的右侧添加一个占位符视图,并使其居中对齐。这是方便的
UIStackView

我们采用具有以下属性的
UIStackView

  • 轴:
    水平
  • 对齐:
    居中
  • 分配:
    Fill
  • 间距:根据您的需要
上面的堆栈视图使用自动布局:

  • 前导、尾随、顶部:相对于超级视图(视图控制器的视图/安全区域)
  • 高度:固定高度(这将是黄色视图的高度)
以下是堆栈视图的约束:

现在,我们将向堆栈视图添加两个具有以下属性的视图:

  • 黄色视图:
    • 宽度:固定宽度
    • 高度:等于堆栈视图的高度
    • 但请注意,我使用了宽度和纵横比约束,以便视图保持矩形
  • 占位符视图:
    • 身高:0
以下是两个视图的约束条件:

现在是标签部分。这是一个多行标签(行数设置为
0
),标签将通过顶部、前导和尾随约束与占位符视图对齐。但最重要的限制需要稍加考虑。标签的字体大小为
20
,因此,如果顶部约束具有带有占位符的
-13
(而不是
-10
,因为标签框架和标签文本之间有顶部填充)值,则它可以与黄色视图的水平中心对齐

以下是标签的约束条件:


说够了。我做了一个演示,你会发现。还请记住,如果需要控制黄色视图和标签之间的水平空间,可以通过更改堆栈视图的间距值来实现

还要记住,这个实现的配置非常严格。一切都会改变,一切都会破裂。但是,如果您的需要稍有改变,使标签的第一行垂直对齐(而不是第一行的水平中心),您可以忽略标签的字体大小和
-13
顶部约束的值


下面是最终输出。我添加了一条水平红线,以指示黄色视图的中间


要与多行标签的第一行对齐,应使用约束
nslayouttributefirstbaseline
(在iOS8中可用)或
UIView
firstBaselineAnchor
(在iOS9中可用).

我最近以一种稍微不太复杂的方式解决了这个问题,在与多行标签完全相同的位置和字体中添加了一个隐藏的单行标签,,没有底部约束。

然后,只需将图标图像
.centerY
与隐藏标签的
.centerY
对齐即可

self.view.addConstraint(
    NSLayoutConstraint(
        item: icon,
        attribute: .centerY,
        relatedBy: .equal,
        toItem: hiddenLabel,
        attribute: .centerY,
        multiplier: 1,
        constant: 0
    )
)

从视图中将前导空间设置为8点。将底部空间约束更改为大于或等于
。多行
ui标签
通常不由顶部和底部空间固定。最好让它自己成长。如果要固定视图大小或文本可能比视口长,则应使用
UITextView
。您不能在标签上方添加一些边距,即通过将顶部约束常数设置为0以外的值吗?您可以创建一个0高度视图,该视图的中心与黄色视图垂直对齐,然后将
UILable
的顶部空间设置为0高度视图,设置为0如果您需要占位符视图,然后需要一些填充来说明标签高度,您最好将标签顶部固定到黄色视图,然后添加一些填充,直到看起来合适为止。字体大小固定的初始声明将使视力差的最终用户无法使用。喜欢你的应用程序。当用户进入“设置”并启用“可访问大字体”时,应用程序自动调整字体是一种很好的做法。