12

使用NSLayoutConstraint该类,可以创建基于视图基线 ( NSLayoutAttributeBaseline) 的约束。但是,我还没有看到任何描述 aUIView实际如何为自动布局系统提供基线值的文档。

如果我想创建一个定义UIView基线的自定义子类,我该怎么做?NSView定义了一个baselineOffsetFromBottom我认为在 OS X 上以某种方式涉及的方法,但是这在 iOS 中是如何工作的?

4

4 回答 4

11

从 UIView 文档:

viewForBaselineLayout

返回用于满足基线约束的视图。

- (UIView *)viewForBaselineLayout

返回值

约束系统应用于满足基线约束的视图

于 2013-05-06T20:52:58.023 回答
8

我刚刚使用 Hopper 反汇编程序查看了 iOS 8.1 中的 UILabel,它实现了方法_baselineOffsetFromBottom_firstBaselineOffsetFromTop,而这些方法又由 调用-[UIView nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:],因此 UIKit 具有类似于 OS X 的私有方法,它们只是不向公众公开。

_baselineOffsetFromBottom并由_firstBaselineOffsetFromTopUIView(返回 0)、UILabel 和 UITextView 实现。还有一个名为_UIGlintyStringView实现的类_baselineOffsetFromBottom;没有其他 UIKit 类有这些方法。

顺便说一句,当视图的基线发生变化时,它会执行以下操作:

__UITagLayoutConstraintsForConstantChangeForSelectedAttributes(self, __UILayoutAttributeIsBaselineAttribute)

似乎没有什么特别的东西不能暴露在公众面前;也许他们觉得没有必要或不想阻止人们编写自己的标签。UILabel 是一个相当复杂的类,涉及自定义 CoreAnimation 层 (_UILabelLayer) 和一大堆技巧,包括相当多的可访问性支持代码。

于 2015-03-31T12:56:48.853 回答
3

您还可以覆盖基线值之一,即firstBaselineOffsetFromTop,如果不方便与视图对齐。例如,下面的代码将第一个基线设置为视图的中间:

override var firstBaselineOffsetFromTop: CGFloat {
    return bounds.midY
}

编辑:我的错,那是 MacOS。我相信 iOS 等价物是firstBaselineAnchor返回一个NSLayoutYAxisAnchor对象。我没有对此进行测试,但我希望这会产生类似的效果:

override var firstBaselineAnchor: NSLayoutYAxisAnchor {
    return NSLayoutYAxisAnchor.anchorWithOffset(bounds.midY)
}
于 2018-07-03T14:20:19.663 回答
2
viewForBaselineLayout 

已弃用,因此您必须使用

viewForFirstBaselineLayout

例子

- (UIView *)viewForFirstBaselineLayout  {
    // Use subLabel view for handling baseline layouts
    return self.subLabel;
}
于 2020-11-15T16:31:17.103 回答