diff --git a/TZStackView.xcodeproj/project.pbxproj b/TZStackView.xcodeproj/project.pbxproj index b9e35a1..2eede14 100644 --- a/TZStackView.xcodeproj/project.pbxproj +++ b/TZStackView.xcodeproj/project.pbxproj @@ -13,13 +13,14 @@ 5F50E9F2F7E5B2DA68C946E0 /* ExplicitIntrinsicContentSizeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F50E5EB8202F5247F8517F3 /* ExplicitIntrinsicContentSizeView.swift */; }; 5F50EAD959E8ACC5929DBD75 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB41AF691B294B8E003DB902 /* NSLayoutConstraintExtension.swift */; }; 5F50EF474D670FC33E8E80EA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F50ED5A43FBFC32B9B9E1AA /* Images.xcassets */; }; + 7EF572D81BEE41100095237E /* Array+Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EF572D71BEE41100095237E /* Array+Product.swift */; }; A45441C21B9B6D71002452BA /* TZStackView.h in Headers */ = {isa = PBXBuildFile; fileRef = A45441C11B9B6D71002452BA /* TZStackView.h */; settings = {ATTRIBUTES = (Public, ); }; }; A45441C61B9B6D71002452BA /* TZStackView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A45441BF1B9B6D71002452BA /* TZStackView.framework */; }; A45441C71B9B6D71002452BA /* TZStackView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A45441BF1B9B6D71002452BA /* TZStackView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - A45441D01B9B6D9C002452BA /* TZSpacerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CC1B9B6D9C002452BA /* TZSpacerView.swift */; settings = {ASSET_TAGS = (); }; }; - A45441D11B9B6D9C002452BA /* TZStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CD1B9B6D9C002452BA /* TZStackView.swift */; settings = {ASSET_TAGS = (); }; }; - A45441D21B9B6D9C002452BA /* TZStackViewAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CE1B9B6D9C002452BA /* TZStackViewAlignment.swift */; settings = {ASSET_TAGS = (); }; }; - A45441D31B9B6D9C002452BA /* TZStackViewDistribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CF1B9B6D9C002452BA /* TZStackViewDistribution.swift */; settings = {ASSET_TAGS = (); }; }; + A45441D01B9B6D9C002452BA /* TZSpacerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CC1B9B6D9C002452BA /* TZSpacerView.swift */; }; + A45441D11B9B6D9C002452BA /* TZStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CD1B9B6D9C002452BA /* TZStackView.swift */; }; + A45441D21B9B6D9C002452BA /* TZStackViewAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CE1B9B6D9C002452BA /* TZStackViewAlignment.swift */; }; + A45441D31B9B6D9C002452BA /* TZStackViewDistribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45441CF1B9B6D9C002452BA /* TZStackViewDistribution.swift */; }; DB41AF6A1B294B8E003DB902 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB41AF691B294B8E003DB902 /* NSLayoutConstraintExtension.swift */; }; DB5B70851B2A1963006043BD /* TestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B70841B2A1963006043BD /* TestView.swift */; }; DB5B70871B2B8816006043BD /* TZStackViewTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B70861B2B8816006043BD /* TZStackViewTestCase.swift */; }; @@ -67,6 +68,7 @@ 5F50EDEB0947F99E67140FC6 /* TZStackViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TZStackViewTests.swift; sourceTree = ""; }; 5F50EF54F01A3A6938C6CEA1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5F50EFD0C46B7C7F989F10E1 /* TZStackViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TZStackViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 7EF572D71BEE41100095237E /* Array+Product.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Product.swift"; sourceTree = ""; }; A45441BF1B9B6D71002452BA /* TZStackView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TZStackView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A45441C11B9B6D71002452BA /* TZStackView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TZStackView.h; sourceTree = ""; }; A45441C31B9B6D71002452BA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -130,6 +132,7 @@ 5F50EDEB0947F99E67140FC6 /* TZStackViewTests.swift */, DB5B70841B2A1963006043BD /* TestView.swift */, DB5B70861B2B8816006043BD /* TZStackViewTestCase.swift */, + 7EF572D71BEE41100095237E /* Array+Product.swift */, 5F50E05A91CC731E5AFD4E94 /* Supporting Files */, ); path = TZStackViewTests; @@ -325,6 +328,7 @@ 5F50E6EAC8DDE44079E03638 /* TZStackViewTests.swift in Sources */, DB5B70871B2B8816006043BD /* TZStackViewTestCase.swift in Sources */, DB5B70851B2A1963006043BD /* TestView.swift in Sources */, + 7EF572D81BEE41100095237E /* Array+Product.swift in Sources */, 5F50EAD959E8ACC5929DBD75 /* NSLayoutConstraintExtension.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/TZStackView/TZSpacerView.swift b/TZStackView/TZSpacerView.swift index bb8e9b9..3fad8ec 100644 --- a/TZStackView/TZSpacerView.swift +++ b/TZStackView/TZSpacerView.swift @@ -9,5 +9,5 @@ import UIKit public class TZSpacerView: UIView { - + public var identifier: String = "" } diff --git a/TZStackView/TZStackView.swift b/TZStackView/TZStackView.swift old mode 100755 new mode 100644 index 2fd77a8..45d41f6 --- a/TZStackView/TZStackView.swift +++ b/TZStackView/TZStackView.swift @@ -36,6 +36,26 @@ public class TZStackView: UIView { public var spacing: CGFloat = 0 public var layoutMarginsRelativeArrangement = false + + override public var layoutMargins: UIEdgeInsets { + get { + if #available(iOS 8, *) { + return super.layoutMargins + } else { + return _layoutMargins + } + } + set { + if #available(iOS 8, *) { + super.layoutMargins = newValue + } else { + _layoutMargins = newValue + setNeedsUpdateConstraints() + } + } + } + + private var _layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8) public private(set) var arrangedSubviews: [UIView] = [] { didSet { @@ -48,8 +68,10 @@ public class TZStackView: UIView { private var stackViewConstraints = [NSLayoutConstraint]() private var subviewConstraints = [NSLayoutConstraint]() - - private var spacerViews = [UIView]() + + private var layoutMarginsView: TZSpacerView? + private var alignmentSpanner: TZSpacerView? + private var distributionSpacers: [TZSpacerView] = [] private var animationDidStopQueueEntries = [TZAnimationDidStopQueueEntry]() @@ -177,6 +199,22 @@ public class TZStackView: UIView { arrangedSubview.removeConstraints(subviewConstraints) } subviewConstraints.removeAll() + + if let spacerView = layoutMarginsView { + spacerView.removeFromSuperview() + layoutMarginsView = nil + } + + if let spacerView = alignmentSpanner { + spacerView.removeFromSuperview() + alignmentSpanner = nil + } + + for spacerView in distributionSpacers { + spacerView.removeFromSuperview() + } + distributionSpacers.removeAll() + for arrangedSubview in arrangedSubviews { if alignment != .Fill { @@ -204,24 +242,22 @@ public class TZStackView: UIView { } } - for spacerView in spacerViews { - spacerView.removeFromSuperview() - } - spacerViews.removeAll() - if arrangedSubviews.count > 0 { + if layoutMarginsRelativeArrangement { + layoutMarginsView = addSpacerView("TZViewLayoutMarginsGuide") + } + + if alignment != .Fill { + alignmentSpanner = addSpacerView("TZSV-alignment-spanner") + } + + stackViewConstraints += createMatchEdgesContraints(arrangedSubviews) + stackViewConstraints += createFirstAndLastViewMatchEdgesContraints() let visibleArrangedSubviews = arrangedSubviews.filter({!self.isHidden($0)}) switch distribution { case .FillEqually, .Fill, .FillProportionally: - if alignment != .Fill || layoutMarginsRelativeArrangement { - addSpacerView() - } - - stackViewConstraints += createMatchEdgesContraints(arrangedSubviews) - stackViewConstraints += createFirstAndLastViewMatchEdgesContraints() - if alignment == .FirstBaseline && axis == .Horizontal { stackViewConstraints.append(constraint(item: self, attribute: .Height, toItem: nil, attribute: .NotAnAttribute, priority: 49)) } @@ -242,17 +278,13 @@ public class TZStackView: UIView { continue } if index > 0 { - views.append(addSpacerView()) + let spacerView = addSpacerView("TZSV-distributing") + distributionSpacers.append(spacerView) + views.append(spacerView) } views.append(arrangedSubview) index++ } - if spacerViews.count == 0 { - addSpacerView() - } - - stackViewConstraints += createMatchEdgesContraints(arrangedSubviews) - stackViewConstraints += createFirstAndLastViewMatchEdgesContraints() switch axis { case .Horizontal: @@ -265,20 +297,14 @@ public class TZStackView: UIView { } stackViewConstraints += createFillConstraints(views, constant: 0) - stackViewConstraints += createFillEquallyConstraints(spacerViews) + stackViewConstraints += createFillEquallyConstraints(distributionSpacers) stackViewConstraints += createFillConstraints(arrangedSubviews, relatedBy: .GreaterThanOrEqual, constant: spacing) case .EqualCentering: for (index, _) in visibleArrangedSubviews.enumerate() { if index > 0 { - addSpacerView() + distributionSpacers.append(addSpacerView("TZSV-distributing")) } } - if spacerViews.count == 0 { - addSpacerView() - } - - stackViewConstraints += createMatchEdgesContraints(arrangedSubviews) - stackViewConstraints += createFirstAndLastViewMatchEdgesContraints() switch axis { case .Horizontal: @@ -293,7 +319,7 @@ public class TZStackView: UIView { var previousArrangedSubview: UIView? for (index, arrangedSubview) in visibleArrangedSubviews.enumerate() { if let previousArrangedSubview = previousArrangedSubview { - let spacerView = spacerViews[index - 1] + let spacerView = distributionSpacers[index - 1] switch axis { case .Horizontal: @@ -307,22 +333,38 @@ public class TZStackView: UIView { previousArrangedSubview = arrangedSubview } - stackViewConstraints += createFillEquallyConstraints(spacerViews, priority: 150) + stackViewConstraints += createFillEquallyConstraints(distributionSpacers, priority: 150) stackViewConstraints += createFillConstraints(arrangedSubviews, relatedBy: .GreaterThanOrEqual, constant: spacing) } - if spacerViews.count > 0 { - stackViewConstraints += createSurroundingSpacerViewConstraints(spacerViews[0], views: visibleArrangedSubviews) + if let spanner = alignmentSpanner { + stackViewConstraints += createSurroundingSpacerViewConstraints(spanner, views: visibleArrangedSubviews) } - if layoutMarginsRelativeArrangement { - if spacerViews.count > 0 { - stackViewConstraints.append(constraint(item: self, attribute: .BottomMargin, toItem: spacerViews[0])) - stackViewConstraints.append(constraint(item: self, attribute: .LeftMargin, toItem: spacerViews[0])) - stackViewConstraints.append(constraint(item: self, attribute: .RightMargin, toItem: spacerViews[0])) - stackViewConstraints.append(constraint(item: self, attribute: .TopMargin, toItem: spacerViews[0])) + if let layoutMarginsView = layoutMarginsView { + let bottomConstraint: NSLayoutConstraint + let leftConstraint: NSLayoutConstraint + let rightConstraint: NSLayoutConstraint + let topConstraint: NSLayoutConstraint + if #available(iOS 8.0, *) { + bottomConstraint = constraint(item: self, attribute: .BottomMargin, toItem: layoutMarginsView, attribute: .Bottom) + leftConstraint = constraint(item: self, attribute: .LeftMargin, toItem: layoutMarginsView, attribute: .Left) + rightConstraint = constraint(item: self, attribute: .RightMargin, toItem: layoutMarginsView, attribute: .Right) + topConstraint = constraint(item: self, attribute: .TopMargin, toItem: layoutMarginsView, attribute: .Top) + } else { + bottomConstraint = constraint(item: self, attribute: .Bottom, toItem: layoutMarginsView, attribute: .Bottom, constant: _layoutMargins.bottom) + leftConstraint = constraint(item: self, attribute: .Left, toItem: layoutMarginsView, attribute: .Left, constant: -_layoutMargins.left) + rightConstraint = constraint(item: self, attribute: .Right, toItem: layoutMarginsView, attribute: .Right, constant: _layoutMargins.right) + topConstraint = constraint(item: self, attribute: .Top, toItem: layoutMarginsView, attribute: .Top, constant: -_layoutMargins.top) } + + bottomConstraint.identifier = "TZView-bottomMargin-guide-constraint" + leftConstraint.identifier = "TZView-leftMargin-guide-constraint" + rightConstraint.identifier = "TZView-rightMargin-guide-constraint" + topConstraint.identifier = "TZView-topMargin-guide-constraint" + stackViewConstraints += [bottomConstraint, leftConstraint, rightConstraint, topConstraint] } + addConstraints(stackViewConstraints) } @@ -333,11 +375,11 @@ public class TZStackView: UIView { super.init(coder: aDecoder)! } - private func addSpacerView() -> TZSpacerView { + private func addSpacerView(identifier: String = "") -> TZSpacerView { let spacerView = TZSpacerView() spacerView.translatesAutoresizingMaskIntoConstraints = false + spacerView.identifier = identifier - spacerViews.append(spacerView) insertSubview(spacerView, atIndex: 0) return spacerView } @@ -481,7 +523,9 @@ public class TZStackView: UIView { case .Trailing, .Bottom: constraints += equalAttributes(views: views, attribute: .Bottom) case .FirstBaseline: - constraints += equalAttributes(views: views, attribute: .FirstBaseline) + if #available(iOS 8.0, *) { + constraints += equalAttributes(views: views, attribute: .FirstBaseline) + } } case .Vertical: @@ -509,58 +553,71 @@ public class TZStackView: UIView { let visibleViews = arrangedSubviews.filter({!self.isHidden($0)}) let firstView = visibleViews.first let lastView = visibleViews.last - - var topView = arrangedSubviews.first! - var bottomView = arrangedSubviews.first! - if spacerViews.count > 0 { - if alignment == .Center { - topView = spacerViews[0] - bottomView = spacerViews[0] - } else if alignment == .Top || alignment == .Leading { - bottomView = spacerViews[0] - } else if alignment == .Bottom || alignment == .Trailing { - topView = spacerViews[0] - } else if alignment == .FirstBaseline { - switch axis { - case .Horizontal: - bottomView = spacerViews[0] - case .Vertical: - topView = spacerViews[0] - bottomView = spacerViews[0] - } - } - } - let firstItem = layoutMarginsRelativeArrangement ? spacerViews[0] : self - + let edgeItem = layoutMarginsView ?? self + switch axis { case .Horizontal: if let firstView = firstView { - constraints.append(constraint(item: firstItem, attribute: .Leading, toItem: firstView)) + constraints.append(constraint(item: edgeItem, attribute: .Leading, toItem: firstView)) } if let lastView = lastView { - constraints.append(constraint(item: firstItem, attribute: .Trailing, toItem: lastView)) - } - - constraints.append(constraint(item: firstItem, attribute: .Top, toItem: topView)) - constraints.append(constraint(item: firstItem, attribute: .Bottom, toItem: bottomView)) - - if alignment == .Center { - constraints.append(constraint(item: firstItem, attribute: .CenterY, toItem: arrangedSubviews.first!)) + constraints.append(constraint(item: edgeItem, attribute: .Trailing, toItem: lastView)) } case .Vertical: if let firstView = firstView { - constraints.append(constraint(item: firstItem, attribute: .Top, toItem: firstView)) + constraints.append(constraint(item: edgeItem, attribute: .Top, toItem: firstView)) } if let lastView = lastView { - constraints.append(constraint(item: firstItem, attribute: .Bottom, toItem: lastView)) + constraints.append(constraint(item: edgeItem, attribute: .Bottom, toItem: lastView)) } + } - constraints.append(constraint(item: firstItem, attribute: .Leading, toItem: topView)) - constraints.append(constraint(item: firstItem, attribute: .Trailing, toItem: bottomView)) + let firstArrangedView = arrangedSubviews.first! + + let topView: UIView + let bottomView: UIView + var centerView: UIView? + + switch alignment { + case .Fill: + topView = firstArrangedView + bottomView = firstArrangedView + case .Center: + topView = alignmentSpanner! + bottomView = alignmentSpanner! + centerView = firstArrangedView + case .Leading, .Top: + topView = firstArrangedView + bottomView = alignmentSpanner! + case .Trailing, .Bottom: + topView = alignmentSpanner! + bottomView = firstArrangedView + case .FirstBaseline: + switch axis { + case .Horizontal: + topView = firstArrangedView + bottomView = alignmentSpanner! + case .Vertical: + topView = alignmentSpanner! + bottomView = alignmentSpanner! + } + } + + switch axis { + case .Horizontal: + constraints.append(constraint(item: edgeItem, attribute: .Top, toItem: topView)) + constraints.append(constraint(item: edgeItem, attribute: .Bottom, toItem: bottomView)) + + if let centerView = centerView { + constraints.append(constraint(item: edgeItem, attribute: .CenterY, toItem: centerView)) + } + case .Vertical: + constraints.append(constraint(item: edgeItem, attribute: .Leading, toItem: topView)) + constraints.append(constraint(item: edgeItem, attribute: .Trailing, toItem: bottomView)) - if alignment == .Center { - constraints.append(constraint(item: firstItem, attribute: .CenterX, toItem: arrangedSubviews.first!)) + if let centerView = centerView { + constraints.append(constraint(item: edgeItem, attribute: .CenterX, toItem: centerView)) } } diff --git a/TZStackViewTests/Array+Product.swift b/TZStackViewTests/Array+Product.swift new file mode 100644 index 0000000..e219adb --- /dev/null +++ b/TZStackViewTests/Array+Product.swift @@ -0,0 +1,21 @@ +// +// Array+Product.swift +// TZStackView +// +// Created by Pan Yusheng on 11/7/15. +// Copyright © 2015 Tom van Zummeren. All rights reserved. +// + +import Foundation + +func * (left: Array, right: Array) -> Array<(E1, E2)> { + var result = [(E1, E2)]() + + for e1 in left { + for e2 in right { + result.append((e1, e2)) + } + } + + return result +} diff --git a/TZStackViewTests/TZStackViewTestCase.swift b/TZStackViewTests/TZStackViewTestCase.swift index e0a4c02..b20da30 100644 --- a/TZStackViewTests/TZStackViewTestCase.swift +++ b/TZStackViewTests/TZStackViewTestCase.swift @@ -26,23 +26,36 @@ class TZStackViewTestCase: XCTestCase { override func setUp() { super.setUp() + recreateStackViews() + } + + override func tearDown() { + super.tearDown() + } + + func recreateStackViews() { + // clean old views otherwise some old spacer views and constraints are left + if uiStackView != nil { + uiStackView.removeFromSuperview() + } + + if tzStackView != nil { + tzStackView.removeFromSuperview() + } + // Create stack views with same views uiStackView = UIStackView(arrangedSubviews: createTestViews()) uiStackView.translatesAutoresizingMaskIntoConstraints = false tzStackView = TZStackView(arrangedSubviews: createTestViews()) tzStackView.translatesAutoresizingMaskIntoConstraints = false - + let window = UIApplication.sharedApplication().windows[0] window.addSubview(uiStackView) window.addSubview(tzStackView) - + configureStackViews(uiStackView, tzStackView) } - override func tearDown() { - super.tearDown() - } - func logAllConstraints() { print("================= UISTACKVIEW (\(uiStackView.constraints.count)) =================") print("subviews: \(uiStackView.subviews)") @@ -74,14 +87,16 @@ class TZStackViewTestCase: XCTestCase { func verifyConstraints(log log: Bool = false) { // Force constraints to be created + uiStackView.updateConstraintsIfNeeded() uiStackView.layoutIfNeeded() + tzStackView.updateConstraintsIfNeeded() tzStackView.layoutIfNeeded() if log { logAllConstraints() } // Assert same constraints are created - assertSameConstraints(uiStackView.constraints, tzStackView.constraints) + assertSameConstraints(nonMarginsLayoutConstraints(uiStackView), nonMarginsLayoutConstraints(tzStackView)) for (index, uiArrangedSubview) in uiStackView.arrangedSubviews.enumerate() { let tzArrangedSubview = tzStackView.arrangedSubviews[index] @@ -98,12 +113,44 @@ class TZStackViewTestCase: XCTestCase { return view.constraints.filter({ "\($0.dynamicType)" != "NSContentSizeLayoutConstraint" }) } + private func nonMarginsLayoutConstraints(view: UIView) -> [NSLayoutConstraint] { + return view.constraints.filter { aConstraint in + if let identifier = aConstraint.identifier { + return !identifier.hasSuffix("Margin-guide-constraint") + } else { + return true + } + } + } + func assertSameConstraints(uiConstraints: [NSLayoutConstraint], _ tzConstraints: [NSLayoutConstraint]) { XCTAssertEqual(uiConstraints.count, tzConstraints.count, "Number of constraints") if uiConstraints.count != tzConstraints.count { return } + func getGuides(constraints: [NSLayoutConstraint]) -> [NSObject] { + var result = Set() + + for aConstraint in constraints { + let firstItem = aConstraint.firstItem + if firstItem is TZSpacerView || firstItem is UILayoutGuide { + result.insert(firstItem as! NSObject) + } + + if let secondItem = aConstraint.secondItem where secondItem is TZSpacerView || secondItem is UILayoutGuide { + result.insert(secondItem as! NSObject) + } + } + + return Array(result) + } + + let uiGuides = getGuides(uiConstraints) + let tzGuides = getGuides(tzConstraints) + + XCTAssertEqual(uiGuides.count, tzGuides.count, "Number of layout guides") + for (index, uiConstraint) in uiConstraints.enumerate() { let tzConstraint = tzConstraints[index] @@ -182,15 +229,29 @@ class TZStackViewTestCase: XCTestCase { return true } // Wish I could assert more accurately than this - if object1 is UILayoutGuide && object2 is TZSpacerView { + if let object1 = object1 as? UILayoutGuide, object2 = object2 as? TZSpacerView + where isSameIdentifier(object1.identifier, object2.identifier) { return true } // Wish I could assert more accurately than this - if object1 is TZSpacerView && object2 is UILayoutGuide { + if let object1 = object1 as? TZSpacerView, object2 = object2 as? UILayoutGuide + where isSameIdentifier(object1.identifier, object2.identifier) { return true } return false } + + private func isSameIdentifier(identifier1: String, _ identifier2: String) -> Bool { + func hasPrefix(str: String) -> Bool { + return str.hasPrefix("UI") || str.hasPrefix("TZ") + } + + func dropPrefix(str: String) -> String { + return String(str.characters.dropFirst("UI".characters.count)) + } + + return identifier1 == identifier2 || (hasPrefix(identifier1) && hasPrefix(identifier2) && dropPrefix(identifier1) == dropPrefix(identifier2)) + } func assertSameOrder(uiTestViews: [TestView], _ tzTestViews: [TestView]) { for (index, uiTestView) in uiTestViews.enumerate() { diff --git a/TZStackViewTests/TZStackViewTests.swift b/TZStackViewTests/TZStackViewTests.swift index 0d099c8..9e2a267 100644 --- a/TZStackViewTests/TZStackViewTests.swift +++ b/TZStackViewTests/TZStackViewTests.swift @@ -23,43 +23,72 @@ class TZStackViewTests: TZStackViewTestCase { // views[2].hidden = true // views[3].hidden = true // views[4].hidden = true + return views } // Be careful to configure the same thing on the UIStackView as on the TZStackView, otherwise the test is unfair override func configureStackViews(uiStackView: UIStackView, _ tzStackView: TZStackView) { - uiStackView.layoutMarginsRelativeArrangement = false - tzStackView.layoutMarginsRelativeArrangement = false - } - - func testFillHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Fill - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - verifyConstraints() } - func testFillVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Fill - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() + func testSameConstraints() { + let margins = [false, true] + let axes = [ + (UILayoutConstraintAxis.Horizontal, "Horizontal"), + (.Vertical, "Vertical") + ] + let distributions = [ + (UIStackViewDistribution.Fill, TZStackViewDistribution.Fill, "Fill"), + (.FillEqually, .FillEqually, "FillEqually"), + (.FillProportionally, .FillProportionally, "FillProportionally"), + (.EqualSpacing, .EqualSpacing, "EqualSpacing"), + (.EqualCentering, .EqualCentering, "EqualCentering") + ] + let alignments = [ + (UIStackViewAlignment.Fill, TZStackViewAlignment.Fill, "Fill"), + (.Leading, .Leading, "Leading"), + (UIStackViewAlignment.Top, TZStackViewAlignment.Top, "Top"), + (.FirstBaseline, .FirstBaseline, "FirstBaseline"), + (.Center, .Center, "Center"), + (.Trailing, .Trailing, "Trailing"), + (UIStackViewAlignment.Bottom, TZStackViewAlignment.Bottom, "Bottom"), + // TODO: LastBaseline + ] + let spacings = [CGFloat(10)] + + let cases = margins * axes * distributions * alignments * spacings + + for aCase in cases { + let (tuple4, spacing) = aCase + let (tuple3, aligment) = tuple4 + let (tuple2, distribution) = tuple3 + let (tuple1, axis) = tuple2 + let margin = tuple1 + + print("Test for layoutMarginsRelativeArrangement=\(margin), axis=\(axis.1), distribution=\(distribution.2), aligment=\(aligment.2), spacing=\(spacing)\n") + + recreateStackViews() + + uiStackView.layoutMarginsRelativeArrangement = margin + tzStackView.layoutMarginsRelativeArrangement = margin + + uiStackView.axis = axis.0 + tzStackView.axis = axis.0 + + uiStackView.distribution = distribution.0 + tzStackView.distribution = distribution.1 + + uiStackView.alignment = aligment.0 + tzStackView.alignment = aligment.1 + + uiStackView.spacing = spacing + tzStackView.spacing = spacing + + verifyConstraints() + } } - + func testFillHorizontalFill() { uiStackView.axis = .Horizontal uiStackView.distribution = .Fill @@ -67,945 +96,6 @@ class TZStackViewTests: TZStackViewTestCase { tzStackView.axis = .Horizontal tzStackView.distribution = .Fill tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Fill - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Fill - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Fill - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Fill - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Fill - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Fill - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFillVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Fill - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Fill - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Center - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Center - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .Center - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Center - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Center - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterVetricalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Center - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Center - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Center - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Center - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testCenterVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Center - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Center - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Leading - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .Leading - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Leading - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Leading - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Leading - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Leading - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Leading - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Leading - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Leading - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testLeadingVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Leading - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Leading - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Top - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .Top - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Top - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Top - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Top - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopHVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Top - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Top - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Top - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Top - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTopVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Top - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Top - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Trailing - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .Trailing - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Trailing - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Trailing - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Trailing - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Trailing - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Trailing - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Trailing - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Trailing - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testTrailingVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Trailing - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Trailing - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Bottom - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .Bottom - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Bottom - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Bottom - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Bottom - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .Bottom - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .Bottom - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .Bottom - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .Bottom - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testBottomVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .Bottom - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .Bottom - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineHorizontalFillEqually() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillEqually - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillEqually - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineHorizontalFill() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .Fill - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Horizontal - tzStackView.distribution = .Fill - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineHorizontalFillProportionally() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Horizontal - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineHorizontalEqualSpacing() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineHorizontalEqualCentering() { - uiStackView.axis = .Horizontal - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Horizontal - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineVerticalFillEqually() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillEqually - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Vertical - tzStackView.distribution = .FillEqually - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - logAllConstraints() - } - - func testFirstBaselineVerticalFill() { - uiStackView.axis = .Vertical - uiStackView.distribution = .Fill - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Vertical - tzStackView.distribution = .Fill - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineVerticalFillProportionally() { - uiStackView.axis = .Vertical - uiStackView.distribution = .FillProportionally - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Vertical - tzStackView.distribution = .FillProportionally - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineVerticalEqualSpacing() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualSpacing - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualSpacing - tzStackView.alignment = .FirstBaseline - - uiStackView.spacing = 10 - tzStackView.spacing = 10 - - verifyConstraints() - } - - func testFirstBaselineVerticalEqualCentering() { - uiStackView.axis = .Vertical - uiStackView.distribution = .EqualCentering - uiStackView.alignment = .FirstBaseline - tzStackView.axis = .Vertical - tzStackView.distribution = .EqualCentering - tzStackView.alignment = .FirstBaseline uiStackView.spacing = 10 tzStackView.spacing = 10