UIStackView自己的intrinsicContentSize

sim*_*yer 12 objective-c uikit ios swift uistackview

我正在使用具有以下配置的UIStackView:

let contentView = UIStackView()
contentView.distribution = .EqualSpacing
contentView.alignment = .Center
contentView.spacing = horizontalSpacing
Run Code Online (Sandbox Code Playgroud)

每个元素都有自己的元素,intrinsicContentSize因此应该可以UIStackView提供自己的元素intrinsicContentSize.文档说明它spacing用作最小间距.

例:

view1: width=10
view2: width=15
spacing = 5
[view1(10)]-5-[view2(15)]
Run Code Online (Sandbox Code Playgroud)

intrinsicContentSize.width该stackView应该是30.

相反,我得到:

? CGSize
 - width : -1.0
 - height : -1.0 { ... }
Run Code Online (Sandbox Code Playgroud)

这告诉我 intrinsicContentSize无法提供.

你是否有人知道我是否做错了什么,是否有意或者这是一个错误?

rob*_*off 15

从iOS 9.1开始,UIStackView未实现intrinsicContentSize:

import UIKit
import ObjectiveC

let stackViewMethod = class_getInstanceMethod(UIStackView.self, "intrinsicContentSize")
let viewMethod = class_getInstanceMethod(UIView.self, "intrinsicContentSize")
print(stackViewMethod == viewMethod)
Run Code Online (Sandbox Code Playgroud)

输出:

true
Run Code Online (Sandbox Code Playgroud)

UIStackView如果你真的需要它,你可以自己创建一个子类并实现它.但是你不应该这样做.如果UIStackView允许(通过约束)选择自己的大小,它会根据其排列的子视图的内在内容大小(或者您根据其排列的子视图的大小设置的其他约束)来实现.


Moj*_*ini 6

换成这个:

stackView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
Run Code Online (Sandbox Code Playgroud)

如果您希望将其安装在视图中,您可以传递实际视图的框架以及水平和垂直安装所需的优先级。例如,这将保留视图的宽度并调整高度:

stackView.systemLayoutSizeFitting(view.frame.size, withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
Run Code Online (Sandbox Code Playgroud)