组织 2.2

Arranged 2.2

kean 维护。



Arranged.StackView

用于 iOS 8(支持 100% 布局)的开源替代品 UIStackView

  • 支持所有对齐、分布、间距、基准相对排列、边距相对排列、轴
  • 经过单元测试,涵盖数千个布局
  • 支持动画
  • 生成的约束与 UIStackView 完全相同

UIStackViewAlignment.LeadingDistribution.FillEqually

<'UISV-alignment' content-view-1.top == content-view-2.top>
<'UISV-canvas-connection' UIStackView:0x7f9cf4816930.leading == content-view-1.leading>
<'UISV-canvas-connection' H:[content-view-2]-(0)-|>
<'UISV-canvas-connection' UIStackView:0x7f9cf4816930.top == content-view-1.top>
<'UISV-canvas-connection' V:[_UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner']-(0)-|>
<'UISV-fill-equally' content-view-2.width == content-view-1.width>
<'UISV-spacing' H:[content-view-1]-(10)-[content-view-2]>
<'UISV-spanning-boundary' _UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner'.top == content-view-1.top priority:999.5>
<'UISV-spanning-boundary' _UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner'.bottom >= content-view-1.bottom>
<'UISV-spanning-boundary' _UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner'.top == content-view-2.top priority:999.5>
<'UISV-spanning-boundary' _UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner'.bottom >= content-view-2.bottom>
<'UISV-spanning-fit' V:[_UILayoutSpacer:0x7f9cf4849f80'UISV-alignment-spanner'(0@51)] priority:51>
<'UISV-ambiguity-suppression' V:[content-view-1(0@25)] priority:25>
<'UISV-ambiguity-suppression' V:[content-view-2(0@25)] priority:25>

ArrangedAlignment.LeadingDistribution.FillEqually

<'ASV-alignment' content-view-1.top == content-view-2.top>
<'ASV-canvas-connection' Arranged.StackView:0x7f9cf4822c90.leading == content-view-1.leading>
<'ASV-canvas-connection' H:[content-view-2]-(0)-|>
<'ASV-canvas-connection' Arranged.StackView:0x7f9cf4822c90.top == content-view-1.top>
<'ASV-canvas-connection' V:[Arranged.LayoutSpacer:0x7f9cf2c4f3f0]-(0)-|>
<'ASV-fill-equally' content-view-1.width == content-view-2.width>
<'ASV-spacing' H:[content-view-1]-(10)-[content-view-2]>
<'ASV-spanning-boundary' Arranged.LayoutSpacer:0x7f9cf2c4f3f0.top == content-view-1.top priority:999.5>
<'ASV-spanning-boundary' Arranged.LayoutSpacer:0x7f9cf2c4f3f0.bottom >= content-view-1.bottom>
<'ASV-spanning-boundary' Arranged.LayoutSpacer:0x7f9cf2c4f3f0.top == content-view-2.top priority:999.5>
<'ASV-spanning-boundary' Arranged.LayoutSpacer:0x7f9cf2c4f3f0.bottom >= content-view-2.bottom>
<'ASV-spanning-fit' V:[Arranged.LayoutSpacer:0x7f9cf2c4f3f0(0@51)] priority:51>
<'ASV-ambiguity-suppression' V:[content-view-1(0@25)] priority:25>
<'ASV-ambiguity-suppression' V:[content-view-2(0@25)] priority:25>

用法

Arranged.StackView 的使用方式与 UIStackView 相同

let stackView = StackView(arrangedSubviews: [view1, view2, view3])
stackView.alignment = .leading
stackView.distribution = .fillEqually
stackView.spacing = 20
stackView.axis = .vertical
stackView.isLayoutMarginsRelativeArrangement = true

唯一的区别是隐藏项目

UIView.animateWithDuration(0.33) {
    stackView.setArrangedView(view, hidden: true)
    stackView.layoutIfNeeded()
}

要求

  • iOS 8.0, tvOS 9.0
  • Xcode 9
  • Swift 4

入门

  • 使用 pod try Arranged 命令获取一个示例项目
  • 安装import Arranged 并享受!

差异

  • UIStackView 监听排列视图的 hidden 属性,如果在该动画块内部调用,则会延迟其效果,并相应地更新约束。我认为这种行为很令人困惑,并且实现起来不实用。《Arranged.StackView》提供了一个简单的方法 setArrangedView(_:hidden:),它以一种与 UIStackView 相同的方式更新约束,但它不影响 hidden 属性。
  • 动画要求你调用 view.layoutIfNeeded()——就像在正常的布局中一样。
  • StackViewDistribution.FillProportionally 在排列视图的 intrinsicContentSize 由于 UIStackView 使用私有 API(《_intrinsicContentSizeInvalidatedForChildView》)改变而不会更新其约束。因此而不出示
  • 《UISV-text-width-disambiguation》约束没有实现,因为它们没有在文档中记录(但实际上你仍然应该以适合你应用的方式使用文本视图来区分)

安装

CocoaPods

在 Podfile 中添加对 Arranged 的依赖项来安装

# source 'https://github.com/CocoaPods/Specs.git'
# use_frameworks!
# platform :ios, "8.0"

pod "Arranged"

Carthage

在 Cartfile 中添加对 Arranged 的依赖项来安装

github "kean/Arranged"

导入

在源文件中导入已安装的模块

import Arranged

许可证

该项目受MIT许可证的许可。有关更多信息,请参阅LICENSE文件。