使用NSLayoutConstraint
该类,可以创建基于视图基线 ( NSLayoutAttributeBaseline
) 的约束。但是,我还没有看到任何描述 aUIView
实际如何为自动布局系统提供基线值的文档。
如果我想创建一个定义UIView
基线的自定义子类,我该怎么做?NSView
定义了一个baselineOffsetFromBottom
我认为在 OS X 上以某种方式涉及的方法,但是这在 iOS 中是如何工作的?
使用NSLayoutConstraint
该类,可以创建基于视图基线 ( NSLayoutAttributeBaseline
) 的约束。但是,我还没有看到任何描述 aUIView
实际如何为自动布局系统提供基线值的文档。
如果我想创建一个定义UIView
基线的自定义子类,我该怎么做?NSView
定义了一个baselineOffsetFromBottom
我认为在 OS X 上以某种方式涉及的方法,但是这在 iOS 中是如何工作的?
从 UIView 文档:
viewForBaselineLayout
返回用于满足基线约束的视图。
- (UIView *)viewForBaselineLayout
返回值
约束系统应用于满足基线约束的视图
我刚刚使用 Hopper 反汇编程序查看了 iOS 8.1 中的 UILabel,它实现了方法_baselineOffsetFromBottom
和_firstBaselineOffsetFromTop
,而这些方法又由 调用-[UIView nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:]
,因此 UIKit 具有类似于 OS X 的私有方法,它们只是不向公众公开。
_baselineOffsetFromBottom
并由_firstBaselineOffsetFromTop
UIView(返回 0)、UILabel 和 UITextView 实现。还有一个名为_UIGlintyStringView
实现的类_baselineOffsetFromBottom
;没有其他 UIKit 类有这些方法。
顺便说一句,当视图的基线发生变化时,它会执行以下操作:
__UITagLayoutConstraintsForConstantChangeForSelectedAttributes(self, __UILayoutAttributeIsBaselineAttribute)
似乎没有什么特别的东西不能暴露在公众面前;也许他们觉得没有必要或不想阻止人们编写自己的标签。UILabel 是一个相当复杂的类,涉及自定义 CoreAnimation 层 (_UILabelLayer) 和一大堆技巧,包括相当多的可访问性支持代码。
您还可以覆盖基线值之一,即firstBaselineOffsetFromTop
,如果不方便与视图对齐。例如,下面的代码将第一个基线设置为视图的中间:
override var firstBaselineOffsetFromTop: CGFloat {
return bounds.midY
}
编辑:我的错,那是 MacOS。我相信 iOS 等价物是firstBaselineAnchor
返回一个NSLayoutYAxisAnchor
对象。我没有对此进行测试,但我希望这会产生类似的效果:
override var firstBaselineAnchor: NSLayoutYAxisAnchor {
return NSLayoutYAxisAnchor.anchorWithOffset(bounds.midY)
}
viewForBaselineLayout
已弃用,因此您必须使用
viewForFirstBaselineLayout
例子
- (UIView *)viewForFirstBaselineLayout {
// Use subLabel view for handling baseline layouts
return self.subLabel;
}