From 803659e61e12294024f31c00de77f03364508144 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Mon, 6 Mar 2017 10:44:12 -0500 Subject: [PATCH 1/3] Implementation of layout.centers(of: UIView) and layout.centers() --- .gitignore | 63 +------ Gemfile | 5 + Keynote Layout presentation.key | Bin 612274 -> 675417 bytes MCSwiftLayout.xcodeproj/project.pbxproj | 83 +++++++++ MCSwiftLayout/Layout.swift | 164 +++++++++++------ MCSwiftLayoutSample/.swiftlint.yml | 34 ++++ .../project.pbxproj | 124 ++++++++++++- .../MCSwiftLayoutSample/AppDelegate.swift | 3 +- .../MCSwiftLayoutSample/BasicView.swift | 19 +- .../MCSwiftLayoutSample/Domain/Expect.swift | 16 ++ .../MarginsAndPaddingsLeftRightView.swift | 115 ++++++++---- .../MenuViewController.swift | 8 +- .../MultiRelativeView.swift | 2 +- .../BothEdgesSnappedView.swift | 167 ++++++++++++++++++ .../BothEdgesSnappedViewController.swift | 32 ++++ .../ValidateConflictsView.swift | 2 +- .../MCSwiftLayoutSampleTests.swift | 36 ---- MCSwiftLayoutSample/Podfile | 18 ++ MCSwiftLayoutSample/Podfile.lock | 21 +++ MCSwiftLayoutTests/BasicTests.swift | 119 +++++++++++++ MCSwiftLayoutTests/MCSwiftLayoutTests.swift | 21 ++- Podfile | 6 + Podfile.lock | 15 ++ scripts/synx.sh | 11 ++ 24 files changed, 886 insertions(+), 198 deletions(-) create mode 100644 Gemfile create mode 100644 MCSwiftLayoutSample/.swiftlint.yml create mode 100644 MCSwiftLayoutSample/MCSwiftLayoutSample/Domain/Expect.swift create mode 100644 MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift create mode 100644 MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedViewController.swift delete mode 100644 MCSwiftLayoutSample/MCSwiftLayoutSampleTests/MCSwiftLayoutSampleTests.swift create mode 100644 MCSwiftLayoutSample/Podfile create mode 100644 MCSwiftLayoutSample/Podfile.lock create mode 100644 MCSwiftLayoutTests/BasicTests.swift create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100755 scripts/synx.sh diff --git a/.gitignore b/.gitignore index 2c22487b..828c794e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,65 +1,10 @@ # Xcode # -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore -## Build generated build/ DerivedData/ - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata/ - -## Other -*.moved-aside -*.xcuserstate - -## Obj-C/Swift specific -*.hmap -*.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - +Pods/ Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output +MCSwiftLayoutSample/Pods +xcuserdata +*.xcworkspace \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..a74f243e --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +# Gemfile +source 'https://rubygems.org' + +gem 'cocoapods', '~>1.1.0' +gem 'synx', '~> 0.2.1' diff --git a/Keynote Layout presentation.key b/Keynote Layout presentation.key index c7d4b19a4a7b806a59c5f9465c547799f9cda035..268379080404368f453106d7dfb5610ec3d510b7 100644 GIT binary patch delta 199715 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�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 delta 136161 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�--^G*~#oRgJ>y#wv`1kgz~>3+n}aMj2f_RP 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 /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 249EFE751E64FB4C00165E39 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -210,6 +288,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 246D36481E6C46F50050F202 /* BasicTests.swift in Sources */, 249EFE891E64FB4C00165E39 /* MCSwiftLayoutTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -336,6 +415,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = MCSwiftLayout/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.mirego.MCSwiftLayout; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -357,6 +437,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = MCSwiftLayout/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.mirego.MCSwiftLayout; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -367,6 +448,7 @@ }; 249EFE921E64FB4C00165E39 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 657A2A825B5BD607ACB09F58 /* Pods-MCSwiftLayoutTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = 4Q596JWQC5; @@ -380,6 +462,7 @@ }; 249EFE931E64FB4C00165E39 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E8C9302287EF4331340F627C /* Pods-MCSwiftLayoutTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = 4Q596JWQC5; diff --git a/MCSwiftLayout/Layout.swift b/MCSwiftLayout/Layout.swift index e246cd2a..2ec6b424 100644 --- a/MCSwiftLayout/Layout.swift +++ b/MCSwiftLayout/Layout.swift @@ -14,6 +14,15 @@ import UIKit - Implement Layout + Layout operator + - layout.snapTopLeft(to: .bottomRight, of: view2) + - layout.snapTopLeft(to: .bottomRight, of: view2) + - layout.snapTopLeft(to: view2, .bottomRight) + - layout.topLeft(to: .bottomRight, of: view2) + - layout.topLeft(view2.bottomRight) -> Ne fonctionne pas si pas le même parent! + - layout.snapTop(to: .bottom, of: view2) + - layout.top(to: .bottom, of: view2) + + - Implement - marginHorizontal - marginVertical @@ -147,16 +156,16 @@ public extension UIView { return Layout(view: self) } -// func layout(_ positionning: Layout) { -// positionning.apply(onView: self) -// } + func layout(with layout: Layout) { + layout.apply(onView: self) + } } public class Layout { static var logConflicts = true - fileprivate let view: UIView? + fileprivate let view: UIView fileprivate var top: CGFloat? fileprivate var left: CGFloat? @@ -180,7 +189,7 @@ public class Layout { fileprivate var bottomInset: CGFloat? fileprivate var rightInset: CGFloat? - public init (view: UIView? = nil) { + public init (view: UIView/*? = nil*/) { self.view = view } @@ -219,92 +228,130 @@ public class Layout { @discardableResult public func topLeft(_ point: CGPoint) -> Layout { - return topLeft(x: point.x, y: point.y) + return setTopLeft(x: point.x, y: point.y, setterContext: "topLeft(CGPoint(\(point.x), \(point.y)))") } - @discardableResult - public func topLeft(x: CGFloat, y: CGFloat) -> Layout { - return setTopLeft(x: x, y: y, setterContext: "topLeft(\(x), \(y))") - } +// @discardableResult +// public func topLeft(x: CGFloat, y: CGFloat) -> Layout { +// return setTopLeft(x: x, y: y, setterContext: "topLeft(x: \(x), y:\(y))") +// } @discardableResult public func topCenter(_ point: CGPoint) -> Layout { - return topCenter(x: point.x, y: point.y) + return setTopCenter(x: point.x, y: point.y, setterContext: "topCenter(CGPoint(\(point.x), \(point.y)))") } +// @discardableResult +// public func topCenter(x: CGFloat, y: CGFloat) -> Layout { +// return setTopCenter(x: x, y: y, setterContext: "topCenter(x: \(x), y:\(y))") +// } + @discardableResult - public func topCenter(x: CGFloat, y: CGFloat) -> Layout { - return setTopCenter(x: x, y: y, setterContext: "topCenter(\(x), \(y))") + public func topRight(_ point: CGPoint) -> Layout { + return setTopRight(x: point.x, y: point.y, setterContext: "topRight(CGPoint(\(point.x), \(point.y)))") } +// @discardableResult +// public func topRight(x: CGFloat, y: CGFloat) -> Layout { +// return setTopRight(x: x, y: y, setterContext: "topRight(x: \(x), y:\(y))") +// } + @discardableResult - public func topRight(_ point: CGPoint) -> Layout { - return topRight(x: point.x, y: point.y) + public func leftCenter(_ point: CGPoint) -> Layout { + return setLeftCenter(x: point.x, y: point.y, setterContext: "leftCenter(CGPoint(\(point.x), \(point.y)))") } + +// @discardableResult +// public func leftCenter(x: CGFloat, y: CGFloat) -> Layout { +// return setLeftCenter(x: x, y: y, setterContext: "leftCenter(x: \(x), y:\(y))") +// } @discardableResult - public func topRight(x: CGFloat, y: CGFloat) -> Layout { - return setTopRight(x: x, y: y, setterContext: "topRight(\(x), \(y))") + public func centers(_ point: CGPoint) -> Layout { + return setCenters(x: point.x, y: point.y, setterContext: "centers(CGPoint(\(point.x), \(point.y)))") } @discardableResult - public func leftCenter(_ point: CGPoint) -> Layout { - return leftCenter(x: point.x, y: point.y) + public func centers(of relativeView: UIView) -> Layout { + if let layoutSuperview = validateLayoutSuperview(setterContext: "centers(of: \(view))") { + if let relativeSuperview = relativeView.superview { + let center: CGPoint + if layoutSuperview == relativeSuperview { + center = relativeView.centers // same parent => no coordinates conversion required. + } else { + center = relativeSuperview.convert(relativeView.centers, to: layoutSuperview) + } + setCenters(x: center.x, y: center.y, setterContext: "centers(of: \(view))") + } else { + warn("relative view's superview is nil", setterContext: "centers(of: \(view))") + } + } + return self } @discardableResult - public func leftCenter(x: CGFloat, y: CGFloat) -> Layout { - return setLeftCenter(x: x, y: y, setterContext: "leftCenter(\(x), \(y))") + public func centers() -> Layout { + if let layoutSuperview = validateLayoutSuperview(setterContext: "centers()") { + let center = layoutSuperview.center + setCenters(x: center.x, y: center.y, setterContext: "centers()") + } + return self + } + + fileprivate func validateLayoutSuperview(setterContext: @autoclosure () -> String) -> UIView? { + if let parentView = view.superview { + return parentView + } else { + warn("Layout's view must be added to a UIView before being layouted using this method.", setterContext: setterContext) + return nil + } } + - // TODO center!!! -// var centers: CGPoint { -// get { return CGPoint(x: hCenter, y: vCenter) } -// set { -// left = newValue.x - (width / 2) -// top = newValue.y - (width / 2) -// } +// @discardableResult +// public func centers(x: CGFloat, y: CGFloat) -> Layout { +// return setCenters(x: x, y: y, setterContext: "centers(x: \(x), y:\(y))") // } @discardableResult public func rightCenter(_ point: CGPoint) -> Layout { - return rightCenter(x: point.x, y: point.y) + return setRightCenter(x: point.x, y: point.y, setterContext: "rightCenter(CGPoint(\(point.x), \(point.y)))") } - @discardableResult - public func rightCenter(x: CGFloat, y: CGFloat) -> Layout { - return setRightCenter(x: x, y: y, setterContext: "rightCenter(\(x), \(y))") - } +// @discardableResult +// public func rightCenter(x: CGFloat, y: CGFloat) -> Layout { +// return setRightCenter(x: x, y: y, setterContext: "rightCenter(x: \(x), y:\(y))") +// } @discardableResult public func bottomLeft(_ point: CGPoint) -> Layout { - return bottomLeft(x: point.x, y: point.y) + return setBottomLeft(x: point.x, y: point.y, setterContext: "bottomLeft(CGPoint(\(point.x), \(point.y)))") } - @discardableResult - public func bottomLeft(x: CGFloat, y: CGFloat) -> Layout { - return setBottomLeft(x: x, y: y, setterContext: "bottomLeft(\(x), \(y))") - } +// @discardableResult +// public func bottomLeft(x: CGFloat, y: CGFloat) -> Layout { +// return setBottomLeft(x: x, y: y, setterContext: "bottomLeft(x: \(x), y:\(y))") +// } @discardableResult public func bottomCenter(_ point: CGPoint) -> Layout { - return bottomCenter(x: point.x, y: point.y) + return setBottomCenter(x: point.x, y: point.y, setterContext: "bottomCenter(CGPoint(\(point.x), \(point.y)))") } - @discardableResult - public func bottomCenter(x: CGFloat, y: CGFloat) -> Layout { - return setBottomCenter(x: x, y: y, setterContext: "bottomCenter(\(x), \(y))") - } +// @discardableResult +// public func bottomCenter(x: CGFloat, y: CGFloat) -> Layout { +// return setBottomCenter(x: x, y: y, setterContext: "bottomCenter(x: \(x), y:\(y))") +// } @discardableResult public func bottomRight(_ point: CGPoint) -> Layout { - return bottomRight(x: point.x, y: point.y) + return setBottomRight(x: point.x, y: point.y, setterContext: "bottomRight(CGPoint(\(point.x), \(point.y)))") } - @discardableResult - public func bottomRight(x: CGFloat, y: CGFloat) -> Layout { - return setBottomRight(x: x, y: y, setterContext: "bottomRight(\(x), \(y))") - } +// @discardableResult +// public func bottomRight(x: CGFloat, y: CGFloat) -> Layout { +// return setBottomRight(x: x, y: y, setterContext: "bottomRight(x: \(x), y:\(y))") +// } // RELATIVE POSITION public enum HorizontalAlignment { @@ -598,7 +645,7 @@ public class Layout { } fileprivate func apply() { - guard let view = view else { return } + //guard let view = view else { return } apply(onView: view) } @@ -623,7 +670,7 @@ public class Layout { } else if bottom != nil { // bottom is set => adjust the origin and the height newRect.origin.y = applyMarginsAndInsets(top: top) - newRect.size.height = applyTopBottomInsets(bottom! - top) + newRect.size.height = applyMarginsAndInsets(bottom: bottom! - newRect.origin.y) } else if height != nil { // height is set => adjust the origin and the height newRect.origin.y = applyMarginsAndInsets(top: top) @@ -676,7 +723,7 @@ public class Layout { } else if right != nil { // right is set => adjust the origin and the width newRect.origin.x = applyMarginsAndInsets(left: left) - newRect.size.width = right! - newRect.origin.x - (rightMargin ?? 0) - (rightInset ?? 0) + newRect.size.width = applyMarginsAndInsets(right: right!) - newRect.origin.x//! - newRect.origin.x - (rightMargin ?? 0) - (rightInset ?? 0) } else if width != nil { // width is set => adjust the origin and the height newRect.origin.x = applyMarginsAndInsets(left: left) @@ -825,6 +872,13 @@ extension Layout { return self } + @discardableResult + fileprivate func setCenters(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { + setHorizontalCenter(x, setterContext: setterContext) + setVerticalCenter(y, setterContext: setterContext) + return self + } + @discardableResult fileprivate func setRightCenter(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { setRightCoordinate(x, setterContext: setterContext) @@ -911,10 +965,18 @@ extension Layout { return top + (topMargin ?? 0) + (topInset ?? 0) } + fileprivate func applyMarginsAndInsets(bottom: CGFloat) -> CGFloat { + return bottom - (bottomMargin ?? 0) - (bottomInset ?? 0) + } + fileprivate func applyMarginsAndInsets(left: CGFloat) -> CGFloat { return left + (leftMargin ?? 0) + (leftInset ?? 0) } + fileprivate func applyMarginsAndInsets(right: CGFloat) -> CGFloat { + return right - (rightMargin ?? 0) - (rightInset ?? 0) + } + fileprivate func applyTopBottomInsets(_ height: CGFloat) -> CGFloat { return height - (topInset ?? 0) - (bottomInset ?? 0) } diff --git a/MCSwiftLayoutSample/.swiftlint.yml b/MCSwiftLayoutSample/.swiftlint.yml new file mode 100644 index 00000000..316f7348 --- /dev/null +++ b/MCSwiftLayoutSample/.swiftlint.yml @@ -0,0 +1,34 @@ +opt_in_rules: # some rules are only opt-in + - attributes + - closure_end_indentation + - closure_spacing + - empty_count + - explicit_init + - nimble_operator + - number_separator + - operator_usage_whitespace + - overridden_super_call + - private_outlet + - prohibited_super_call + - redundant_nil_coalescing + +disabled_rules: # rule identifiers to exclude from running +# - function_body_length + - trailing_whitespace + - force_cast + - type_name +# - todo +# - file_length +# - type_body_length +# - valid_docs +# - cyclomatic_complexity +# - nesting +# - function_parameter_count +# - large_tuple +# - variable_name +# - empty_parentheses_with_trailing_closure + - line_length + +excluded: # paths to ignore during linting. overridden by `included`. + - Pods + diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample.xcodeproj/project.pbxproj b/MCSwiftLayoutSample/MCSwiftLayoutSample.xcodeproj/project.pbxproj index 3f46d19b..be9e863e 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample.xcodeproj/project.pbxproj +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample.xcodeproj/project.pbxproj @@ -29,8 +29,11 @@ 249EFE431E64FAFE00165E39 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249EFE421E64FAFE00165E39 /* AppDelegate.swift */; }; 249EFE4A1E64FAFE00165E39 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 249EFE491E64FAFE00165E39 /* Assets.xcassets */; }; 249EFE4D1E64FAFE00165E39 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 249EFE4B1E64FAFE00165E39 /* LaunchScreen.storyboard */; }; - 249EFE581E64FAFE00165E39 /* MCSwiftLayoutSampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249EFE571E64FAFE00165E39 /* MCSwiftLayoutSampleTests.swift */; }; 249EFE631E64FAFE00165E39 /* MCSwiftLayoutSampleUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249EFE621E64FAFE00165E39 /* MCSwiftLayoutSampleUITests.swift */; }; + 24E6547A1E68F27D00A72A8B /* BothEdgesSnappedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24E654781E68F27D00A72A8B /* BothEdgesSnappedView.swift */; }; + 24E6547B1E68F27D00A72A8B /* BothEdgesSnappedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24E654791E68F27D00A72A8B /* BothEdgesSnappedViewController.swift */; }; + 24E654821E69041B00A72A8B /* Expect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24E654811E69041B00A72A8B /* Expect.swift */; }; + DE6C3D736B571B80E207DF6A /* Pods_MCSwiftLayoutSample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAD69688AA2A3F0994F3074E /* Pods_MCSwiftLayoutSample.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -110,11 +113,16 @@ 249EFE4C1E64FAFE00165E39 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 249EFE4E1E64FAFE00165E39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 249EFE531E64FAFE00165E39 /* MCSwiftLayoutSampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MCSwiftLayoutSampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 249EFE571E64FAFE00165E39 /* MCSwiftLayoutSampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCSwiftLayoutSampleTests.swift; sourceTree = ""; }; 249EFE591E64FAFE00165E39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 249EFE5E1E64FAFE00165E39 /* MCSwiftLayoutSampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MCSwiftLayoutSampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 249EFE621E64FAFE00165E39 /* MCSwiftLayoutSampleUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCSwiftLayoutSampleUITests.swift; sourceTree = ""; }; 249EFE641E64FAFE00165E39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 24E654781E68F27D00A72A8B /* BothEdgesSnappedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BothEdgesSnappedView.swift; path = Test/BothEdgesSnapped/BothEdgesSnappedView.swift; sourceTree = ""; }; + 24E654791E68F27D00A72A8B /* BothEdgesSnappedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BothEdgesSnappedViewController.swift; path = Test/BothEdgesSnapped/BothEdgesSnappedViewController.swift; sourceTree = ""; }; + 24E654811E69041B00A72A8B /* Expect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Expect.swift; path = Domain/Expect.swift; sourceTree = ""; }; + AAD69688AA2A3F0994F3074E /* Pods_MCSwiftLayoutSample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MCSwiftLayoutSample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F121E291CADD796B007C04BB /* Pods-MCSwiftLayoutSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MCSwiftLayoutSample.release.xcconfig"; path = "Pods/Target Support Files/Pods-MCSwiftLayoutSample/Pods-MCSwiftLayoutSample.release.xcconfig"; sourceTree = ""; }; + F1ACB0EACBD84B57B50D472D /* Pods-MCSwiftLayoutSample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MCSwiftLayoutSample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MCSwiftLayoutSample/Pods-MCSwiftLayoutSample.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -123,6 +131,7 @@ buildActionMask = 2147483647; files = ( 2439CC2B1E6658CC003326FB /* MCSwiftLayout.framework in Frameworks */, + DE6C3D736B571B80E207DF6A /* Pods_MCSwiftLayoutSample.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -143,6 +152,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 160FB83905049FCEDD18DC8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + AAD69688AA2A3F0994F3074E /* Pods_MCSwiftLayoutSample.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 2439CC1F1E665858003326FB /* Products */ = { isa = PBXGroup; children = ( @@ -165,6 +182,7 @@ 2439CC371E665C5E003326FB /* Test */ = { isa = PBXGroup; children = ( + 24E654761E68F20400A72A8B /* BothEdgesSnapped */, 2439CC601E665FDE003326FB /* ChainedLayoutView */, 2439CC621E666043003326FB /* MarginsAndPaddingsLeftWidthView */, 2439CC611E665FFD003326FB /* MarginsAndPaddingsLeftRightView */, @@ -274,6 +292,8 @@ 249EFE561E64FAFE00165E39 /* MCSwiftLayoutSampleTests */, 249EFE611E64FAFE00165E39 /* MCSwiftLayoutSampleUITests */, 249EFE401E64FAFE00165E39 /* Products */, + F143180314A617EFD07C5709 /* Pods */, + 160FB83905049FCEDD18DC8A /* Frameworks */, ); sourceTree = ""; }; @@ -290,6 +310,7 @@ 249EFE411E64FAFE00165E39 /* MCSwiftLayoutSample */ = { isa = PBXGroup; children = ( + 24E654801E69040000A72A8B /* Domain */, 249EFE421E64FAFE00165E39 /* AppDelegate.swift */, 2439CC321E665BE3003326FB /* UI */, 2439CC671E66614D003326FB /* Supporting Files */, @@ -300,7 +321,6 @@ 249EFE561E64FAFE00165E39 /* MCSwiftLayoutSampleTests */ = { isa = PBXGroup; children = ( - 249EFE571E64FAFE00165E39 /* MCSwiftLayoutSampleTests.swift */, 249EFE591E64FAFE00165E39 /* Info.plist */, ); path = MCSwiftLayoutSampleTests; @@ -315,6 +335,32 @@ path = MCSwiftLayoutSampleUITests; sourceTree = ""; }; + 24E654761E68F20400A72A8B /* BothEdgesSnapped */ = { + isa = PBXGroup; + children = ( + 24E654781E68F27D00A72A8B /* BothEdgesSnappedView.swift */, + 24E654791E68F27D00A72A8B /* BothEdgesSnappedViewController.swift */, + ); + name = BothEdgesSnapped; + sourceTree = ""; + }; + 24E654801E69040000A72A8B /* Domain */ = { + isa = PBXGroup; + children = ( + 24E654811E69041B00A72A8B /* Expect.swift */, + ); + name = Domain; + sourceTree = ""; + }; + F143180314A617EFD07C5709 /* Pods */ = { + isa = PBXGroup; + children = ( + F1ACB0EACBD84B57B50D472D /* Pods-MCSwiftLayoutSample.debug.xcconfig */, + F121E291CADD796B007C04BB /* Pods-MCSwiftLayoutSample.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -322,10 +368,14 @@ isa = PBXNativeTarget; buildConfigurationList = 249EFE671E64FAFE00165E39 /* Build configuration list for PBXNativeTarget "MCSwiftLayoutSample" */; buildPhases = ( + DDE1EE639E8C959FEBC41FDC /* [CP] Check Pods Manifest.lock */, 249EFE3B1E64FAFE00165E39 /* Sources */, 249EFE3C1E64FAFE00165E39 /* Frameworks */, 249EFE3D1E64FAFE00165E39 /* Resources */, 2460ACCE1E64FD9D000BCAC5 /* Embed Frameworks */, + 5D3C4568AFC08267110D9971 /* [CP] Embed Pods Frameworks */, + CCCCC7EE5AE16BA960D7DB4F /* [CP] Copy Pods Resources */, + 24E6547E1E68F88D00A72A8B /* Run Swiftlint */, ); buildRules = ( ); @@ -471,6 +521,68 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 24E6547E1E68F88D00A72A8B /* Run Swiftlint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Swiftlint"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = Pods/SwiftLint/swiftlint; + }; + 5D3C4568AFC08267110D9971 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MCSwiftLayoutSample/Pods-MCSwiftLayoutSample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + CCCCC7EE5AE16BA960D7DB4F /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MCSwiftLayoutSample/Pods-MCSwiftLayoutSample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + DDE1EE639E8C959FEBC41FDC /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 249EFE3B1E64FAFE00165E39 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -482,6 +594,7 @@ 2439CC551E665C6B003326FB /* RelativeViewController.swift in Sources */, 2439CC4E1E665C6B003326FB /* MarginsAndPaddingsLeftRightView.swift in Sources */, 2439CC351E665BF6003326FB /* MenuView.swift in Sources */, + 24E6547A1E68F27D00A72A8B /* BothEdgesSnappedView.swift in Sources */, 2439CC4F1E665C6B003326FB /* MarginsAndPaddingsLeftRightViewController.swift in Sources */, 2439CC4B1E665C6B003326FB /* BasicView.swift in Sources */, 2439CC561E665C6B003326FB /* ViewExtensionsPositionningView.swift in Sources */, @@ -489,7 +602,9 @@ 2439CC4C1E665C6B003326FB /* ChainedLayoutView.swift in Sources */, 2439CC501E665C6B003326FB /* MarginsAndPaddingsLeftWidthView.swift in Sources */, 2439CC361E665BF6003326FB /* MenuViewController.swift in Sources */, + 24E6547B1E68F27D00A72A8B /* BothEdgesSnappedViewController.swift in Sources */, 2439CC531E665C6B003326FB /* MultiRelativeViewController.swift in Sources */, + 24E654821E69041B00A72A8B /* Expect.swift in Sources */, 2439CC581E665C6B003326FB /* ValidateConflictsView.swift in Sources */, 2439CC4D1E665C6B003326FB /* ChainedLayoutViewController.swift in Sources */, 2439CC511E665C6B003326FB /* MarginsAndPaddingsLeftWidthViewController.swift in Sources */, @@ -501,7 +616,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 249EFE581E64FAFE00165E39 /* MCSwiftLayoutSampleTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -640,6 +754,7 @@ }; 249EFE681E64FAFE00165E39 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F1ACB0EACBD84B57B50D472D /* Pods-MCSwiftLayoutSample.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -654,6 +769,7 @@ }; 249EFE691E64FAFE00165E39 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F121E291CADD796B007C04BB /* Pods-MCSwiftLayoutSample.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/AppDelegate.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/AppDelegate.swift index 46a1ef39..b1deee38 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/AppDelegate.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/AppDelegate.swift @@ -19,8 +19,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { window!.backgroundColor = UIColor.white window!.rootViewController = UINavigationController(rootViewController: MenuViewController()) window!.makeKeyAndVisible() - + return true } } - diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/BasicView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/BasicView.swift index c5358da9..36862624 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/BasicView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/BasicView.swift @@ -7,17 +7,28 @@ // import UIKit -class BasicView: UILabel { +class BasicView: UIView { + fileprivate let label = UILabel() + init(text: String? = nil, color: UIColor) { super.init(frame: .zero) - self.text = text - font = UIFont.systemFont(ofSize: 7) - textColor = .white backgroundColor = color + + label.text = text + label.font = UIFont.systemFont(ofSize: 7) + label.textColor = .white + label.sizeToFit() + addSubview(label) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + override func layoutSubviews() { + super.layoutSubviews() + + label.layout.top(0).left(0) + } } diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/Domain/Expect.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/Domain/Expect.swift new file mode 100644 index 00000000..0a9dabf4 --- /dev/null +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/Domain/Expect.swift @@ -0,0 +1,16 @@ +// +// Expect.swift +// MCSwiftLayoutSample +// +// Created by DION, Luc (MTL) on 2017-03-02. +// Copyright © 2017 mcswiftlayyout.mirego.com. All rights reserved. +// + +import UIKit + +func expect(view: UIView, toMatchRect rect: CGRect) { + if view.frame != rect { + print("Doesn't match rect") + } +} + diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift index f30a2ea1..e9fa92d0 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift @@ -8,11 +8,12 @@ import UIKit class MarginsAndPaddingsLeftRightView: UIView { + fileprivate let viewHeight: CGFloat = 40 private let contentScrollView = UIScrollView() private let descriptionLabel = UILabel() - private let noMarginsNoPaddings = BasicView(text: "70x30", color: .black) + private let noMarginsNoPaddings = BasicView(text: "70x40", color: .black) private let noMarginsLeftInsetView = BasicView(text: "LI", color: UIColor.red.withAlphaComponent(1.0)) private let noMarginsRightInsetView = BasicView(text: "RI", color: UIColor.red.withAlphaComponent(0.8)) @@ -32,6 +33,14 @@ class MarginsAndPaddingsLeftRightView: UIView { private let leftRightMarginsLeftInsetView = BasicView(text: "LM-RM LI", color: UIColor.purple.withAlphaComponent(0.8)) private let leftRightMarginsRightInsetView = BasicView(text: "LM-RM RI", color: UIColor.purple.withAlphaComponent(0.6)) private let leftRightMarginsLeftRightInsetView = BasicView(text: "LM-RM LI-RI", color: UIColor.purple.withAlphaComponent(0.4)) + +// TODO + private let noMarginsNoPaddings2 = BasicView(text: "70x30", color: UIColor.black) + private let topMarginView = BasicView(text: "TM", color: UIColor.orange.withAlphaComponent(1)) + private let topMarginTopPaddingView = BasicView(text: "TM TP", color: UIColor.orange.withAlphaComponent(0.8)) + private let topMarginBottomPaddingView = BasicView(text: "TM BP", color: UIColor.orange.withAlphaComponent(0.6)) + private let topMarginTopBottomPaddingView = BasicView(text: "TM TP-BP", color: UIColor.orange.withAlphaComponent(0.4)) + init() { super.init(frame: .zero) @@ -52,7 +61,7 @@ class MarginsAndPaddingsLeftRightView: UIView { addView(noMarginsLeftInsetView) addView(noMarginsRightInsetView) addView(noMarginsLeftRightInsetView) - + // Left margin addView(leftMarginView) addView(leftMarginLeftInsetView) @@ -64,7 +73,7 @@ class MarginsAndPaddingsLeftRightView: UIView { addView(rigthMarginLeftInsetView) addView(rigthMarginRightInsetView) addView(rigthMarginLeftRightInsetView) - + // Left and right margins addView(leftRightMarginsView) addView(leftRightMarginsLeftInsetView) @@ -73,7 +82,7 @@ class MarginsAndPaddingsLeftRightView: UIView { } fileprivate func addView(_ view: BasicView) { - view.layout.height(30).width(70) + view.layout.height(viewHeight).width(70) contentScrollView.addSubview(view) } @@ -93,33 +102,79 @@ class MarginsAndPaddingsLeftRightView: UIView { // No margins let rightPosition: CGFloat = 70 - //var index = 0 - //var nextBottomPosition: CGFloat = descriptionLabel.bottom + 30 - noMarginsNoPaddings.layout.topLeft(descriptionLabel.bottomLeft).bottomRight(x: descriptionLabel.bottom + 30, y: rightPosition) + var topPosition = descriptionLabel.bottom + 10 - noMarginsLeftInsetView.layout.topLeft(noMarginsNoPaddings.bottomLeft).bottomRight(x: noMarginsNoPaddings.bottom + 30, y: rightPosition).leftInset(10) - noMarginsRightInsetView.layout.topLeft(noMarginsLeftInsetView.bottomLeft).bottomRight(x: noMarginsLeftInsetView.bottom + 30, y: rightPosition).rightInset(10) - noMarginsLeftRightInsetView.layout.topLeft(noMarginsRightInsetView.bottomLeft).bottomRight(x: noMarginsRightInsetView.bottom + 30, y: rightPosition).leftInset(10).rightInset(10) -// -// // Left margin -// leftMarginView.layout2.top(noMarginsLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10) -// leftMarginLeftPaddingView.layout2.top(leftMarginView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10) -// leftMarginRightInsetView.layout2.top(leftMarginLeftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).RightInset(10) -// leftMarginLeftRightInsetView.layout2.top(leftMarginRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10).RightInset(10) -// -// // Right margin -// rigthMarginView.layout2.top(leftMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).rightMargin(10) -// rigthMarginLeftInsetView.layout2.top(rigthMarginView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10) -// rigthMarginRightInsetView.layout2.top(rigthMarginleftInsetView.bottom).left(leftPosition).width(70).rightMargin(10).RightInset(10) -// rigthMarginLeftRightInsetView.layout2.top(rigthMarginRightInsetView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10).RightInset(10) -// -// // Left and right margins -// leftRightMarginsView.layout2.top(rigthMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10).rightMargin(10) -// leftRightMarginsleftInsetView.layout2.top(leftRightMarginsView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10) -// leftRightMarginsRightInsetView.layout2.top(leftRightMarginsleftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).RightInset(10) -// leftRightMarginsLeftRightInsetView.layout2.top(leftRightMarginsRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10).RightInset(10) - - contentScrollView.contentSize = CGSize(width: width, height: leftRightMarginsLeftRightInsetView.bottom) + noMarginsNoPaddings.layout.top(topPosition).left(0).bottom(topPosition + viewHeight).right(rightPosition) + expect(view: noMarginsNoPaddings, toMatchRect: CGRect(x: 0, y: 63, width: 70, height: 40)) + topPosition += viewHeight + + noMarginsLeftInsetView.layout.top(topPosition).left(0).bottom(topPosition + viewHeight).right(rightPosition).leftInset(10) + expect(view: noMarginsLeftInsetView, toMatchRect: CGRect(x: 10, y: 103, width: 60, height: 40)) + topPosition += viewHeight + + noMarginsRightInsetView.layout.top(topPosition).left(0).bottom(topPosition + viewHeight).right(rightPosition).rightInset(10) + expect(view: noMarginsRightInsetView, toMatchRect: CGRect(x: 0, y: 143, width: 60, height: 40)) + topPosition += viewHeight + + noMarginsLeftRightInsetView.layout.top(topPosition).left(0).bottom(topPosition + viewHeight).right(rightPosition).leftInset(10).rightInset(10) + expect(view: noMarginsLeftRightInsetView, toMatchRect: CGRect(x: 10, y: 183, width: 50, height: 40)) + topPosition += viewHeight + + // Left margin + topPosition += 5 + leftMarginView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10) + expect(view: leftMarginView, toMatchRect: CGRect(x: 10, y: 228, width: 60, height: 40)) + topPosition += viewHeight + + leftMarginLeftInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).leftInset(10) + expect(view: leftMarginLeftInsetView, toMatchRect: CGRect(x: 20, y: 268, width: 50, height: 40)) + topPosition += viewHeight + + leftMarginRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).rightInset(10) + expect(view: leftMarginRightInsetView, toMatchRect: CGRect(x: 10, y: 308, width: 50, height: 40)) + topPosition += viewHeight + + leftMarginLeftRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).leftInset(10).rightInset(10) + expect(view: leftMarginLeftRightInsetView, toMatchRect: CGRect(x: 20, y: 348, width: 40, height: 40)) + topPosition += viewHeight + + // Right margin + topPosition += 5 + rigthMarginView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).rightMargin(10) + expect(view: rigthMarginView, toMatchRect: CGRect(x: 0, y: 393, width: 60, height: 40)) + topPosition += viewHeight + + rigthMarginLeftInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).rightMargin(10).leftInset(10) + expect(view: rigthMarginLeftInsetView, toMatchRect: CGRect(x: 10, y: 433, width: 50, height: 40)) + topPosition += viewHeight + + rigthMarginRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).rightMargin(10).rightInset(10) + expect(view: rigthMarginRightInsetView, toMatchRect: CGRect(x: 0, y: 473, width: 50, height: 40)) + topPosition += viewHeight + + rigthMarginLeftRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).rightMargin(10).leftInset(10).rightInset(10) + expect(view: rigthMarginLeftRightInsetView, toMatchRect: CGRect(x: 10, y: 513, width: 40, height: 40)) + topPosition += viewHeight + + // Left and right margins + topPosition += 5 + leftRightMarginsView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).rightMargin(10) + expect(view: leftRightMarginsView, toMatchRect: CGRect(x: 10, y: 558, width: 50, height: 40)) + topPosition += viewHeight + + leftRightMarginsLeftInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).rightMargin(10).leftInset(10) + expect(view: leftRightMarginsLeftInsetView, toMatchRect: CGRect(x: 20, y: 598, width: 40, height: 40)) + topPosition += viewHeight + + leftRightMarginsRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).rightMargin(10).rightInset(10) + expect(view: leftRightMarginsRightInsetView, toMatchRect: CGRect(x: 10, y: 638, width: 40, height: 40)) + topPosition += viewHeight + + leftRightMarginsLeftRightInsetView.layout.top(topPosition).left(leftPosition).bottom(topPosition + viewHeight).right(rightPosition).leftMargin(10).rightMargin(10).leftInset(10).rightInset(10) + expect(view: leftRightMarginsLeftRightInsetView, toMatchRect: CGRect(x: 20, y: 678, width: 30, height: 40)) + topPosition += viewHeight + + contentScrollView.contentSize = CGSize(width: width, height: topPosition) contentScrollView.contentInset = UIEdgeInsets.zero } } diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift index 4dcc1c89..258d0497 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift @@ -15,6 +15,7 @@ enum Page: Int { case chainedLayout + case bothEdgesSnapped case marginsAndPaddingLeftWidth case marginsAndPaddingLeftRight @@ -27,8 +28,9 @@ enum Page: Int { case .relativePositions: return "Test Relative" case .multiRelativePositions: return "Test Multiple Relatives" case .chainedLayout: return "Chained Layout" - case .marginsAndPaddingLeftWidth: return "Test margings and paddings - Left+Width" - case .marginsAndPaddingLeftRight: return "Test margings and paddings - Left+Right" + case .bothEdgesSnapped: return "NOT USED YET" + case .marginsAndPaddingLeftWidth: return "topLeft & width - Test margings and paddings" + case .marginsAndPaddingLeftRight: return "topLeft & bottomRight - Test margings and paddings" case .validateConflicts: return "Validate properties conflicts" case .count: return "Unknown" } @@ -68,6 +70,8 @@ extension MenuViewController: MenuViewDelegate { controller = MultiRelativeViewController() case .chainedLayout: controller = ChainedLayoutViewController() + case .bothEdgesSnapped: + controller = BothEdgesSnappedViewController() case .marginsAndPaddingLeftWidth: controller = MarginsAndPaddingsLeftWidthViewController() case .marginsAndPaddingLeftRight: diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MultiRelativeView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MultiRelativeView.swift index cab31b31..8fbdf63c 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MultiRelativeView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MultiRelativeView.swift @@ -32,7 +32,7 @@ class MultiRelativeView: UIView { override func layoutSubviews() { super.layoutSubviews() - view1.layout.topLeft(x: 10, y: 64).width(100).height(100) + view1.layout.top(64).left(10).width(100).height(100) view2.layout.right(of: view1, aligned: .top).leftMargin(150).width(100).height(100) view.layout.right(of: view1, aligned: .top).left(of: view2).height(75).leftInset(10).rightInset(10) diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift new file mode 100644 index 00000000..b38dd79e --- /dev/null +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift @@ -0,0 +1,167 @@ +// +// BothEdgesSnappedView.swift +// MCLayoutExample +// +// Created by DION, Luc (MTL) on 2017-02-21. +// Copyright (c) 2017 Mirego. All rights reserved. +// +import UIKit + +class BothEdgesSnappedView: UIView { + private let contentScrollView = UIScrollView() + + private let descriptionLabel = UILabel() + + private let noMarginsNoPaddings = BasicView(text: "70x30", color: .black) + +// private let noMarginsLeftInsetView = BasicView(text: "LI", color: UIColor.red.withAlphaComponent(1.0)) +// private let noMarginsRightInsetView = BasicView(text: "RI", color: UIColor.red.withAlphaComponent(0.8)) +// private let noMarginsLeftRightInsetView = BasicView(text: "LI-RI", color: UIColor.red.withAlphaComponent(0.6)) +// +// private let leftMarginView = BasicView(text: "LM", color: UIColor.blue.withAlphaComponent(1.0)) +// private let leftMarginLeftInsetView = BasicView(text: "LM LI", color: UIColor.blue.withAlphaComponent(0.8)) +// private let leftMarginRightInsetView = BasicView(text: "LM RI", color: UIColor.blue.withAlphaComponent(0.6)) +// private let leftMarginLeftRightInsetView = BasicView(text: "LM LI-RI", color: UIColor.blue.withAlphaComponent(0.4)) +// +// private let rigthMarginView = BasicView(text: "RM", color: UIColor.green.withAlphaComponent(1)) +// private let rigthMarginLeftInsetView = BasicView(text: "RM LI", color: UIColor.green.withAlphaComponent(0.8)) +// private let rigthMarginRightInsetView = BasicView(text: "RM RI", color: UIColor.green.withAlphaComponent(0.6)) +// private let rigthMarginLeftRightInsetView = BasicView(text: "RM LI-RI", color: UIColor.green.withAlphaComponent(0.4)) +// +// private let leftRightMarginsView = BasicView(text: "LM-RM", color: UIColor.purple.withAlphaComponent(1)) +// private let leftRightMarginsLeftInsetView = BasicView(text: "LM-RM LI", color: UIColor.purple.withAlphaComponent(0.8)) +// private let leftRightMarginsRightInsetView = BasicView(text: "LM-RM RI", color: UIColor.purple.withAlphaComponent(0.6)) +// private let leftRightMarginsLeftRightInsetView = BasicView(text: "LM-RM LI-RI", color: UIColor.purple.withAlphaComponent(0.4)) + + var childLevel1: UIView! + var anotherChildLevel1: UIView! + var childLevel2: UIView! + var anotherChildLevel2: UIView! + + init() { + super.init(frame: .zero) + + backgroundColor = .white + + childLevel1 = UIView() + childLevel1.backgroundColor = UIColor.red.withAlphaComponent(0.5) + addSubview(childLevel1) + + anotherChildLevel1 = UIView() + anotherChildLevel1.backgroundColor = UIColor.blue.withAlphaComponent(0.5) + addSubview(anotherChildLevel1) + + childLevel2 = UIView() + childLevel1.backgroundColor = UIColor.green.withAlphaComponent(0.5) + childLevel1.addSubview(childLevel2) + + anotherChildLevel2 = UIView() + anotherChildLevel2.backgroundColor = UIColor.yellow.withAlphaComponent(0.5) + anotherChildLevel1.addSubview(anotherChildLevel2) + +// contentScrollView.backgroundColor = .yellow +// addSubview(contentScrollView) +// +// descriptionLabel.text = "In this test the topLeft coordinates and the bottomRight have been set.\nMargins and Insets always have a value of 10\nL=Left, R=Right, M=Margin, I=Inset" +// descriptionLabel.numberOfLines = 0 +// descriptionLabel.font = UIFont.systemFont(ofSize: 12) +// contentScrollView.addSubview(descriptionLabel) +// +// addView(noMarginsNoPaddings) +// +// // No margins +// addView(noMarginsLeftInsetView) +// addView(noMarginsRightInsetView) +// addView(noMarginsLeftRightInsetView) +// +// // Left margin +// addView(leftMarginView) +// addView(leftMarginLeftInsetView) +// addView(leftMarginRightInsetView) +// addView(leftMarginLeftRightInsetView) +// +// // Right margin +// addView(rigthMarginView) +// addView(rigthMarginLeftInsetView) +// addView(rigthMarginRightInsetView) +// addView(rigthMarginLeftRightInsetView) +// +// // Left and right margins +// addView(leftRightMarginsView) +// addView(leftRightMarginsLeftInsetView) +// addView(leftRightMarginsRightInsetView) +// addView(leftRightMarginsLeftRightInsetView) + } + + fileprivate func addView(_ view: BasicView) { + view.layout.height(30).width(70) + contentScrollView.addSubview(view) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + override func layoutSubviews() { + super.layoutSubviews() + +// childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) +// childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) +// anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) +// childLevel2.layout.centers(of: anotherChildLevel1) + +// childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) +// childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) +// anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) +// +// anotherChildLevel1.layout.centers(of: childLevel2) + + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + childLevel2.frame = CGRect(x: 10, y: 20, width: 30, height: 40) + anotherChildLevel1.frame = CGRect(x: 10, y: 80, width: 30, height: 50) + anotherChildLevel2.frame = CGRect(x: 0, y: 0, width: 20, height: 10) + + + anotherChildLevel2.layout.centers(of: childLevel2) + + print(anotherChildLevel2.frame) + +// let leftPosition: CGFloat = 0 +// +// contentScrollView.layout.topLeft(CGPoint(x: 0, y: 0)).width(width).height(height).topInset(64) +// +// descriptionLabel.size = descriptionLabel.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude)) +// descriptionLabel.layout.topLeft(CGPoint(x: leftPosition, y: 10)) +// +// // No margins +// let rightPosition: CGFloat = 70 +// //var index = 0 +// //var nextBottomPosition: CGFloat = descriptionLabel.bottom + 30 +// noMarginsNoPaddings.layout.topLeft(descriptionLabel.bottomLeft).bottomRight(x: descriptionLabel.bottom + 30, y: rightPosition) +// +// noMarginsLeftInsetView.layout.topLeft(noMarginsNoPaddings.bottomLeft).bottomRight(x: noMarginsNoPaddings.bottom + 30, y: rightPosition).leftInset(10) +// noMarginsRightInsetView.layout.topLeft(noMarginsLeftInsetView.bottomLeft).bottomRight(x: noMarginsLeftInsetView.bottom + 30, y: rightPosition).rightInset(10) +// noMarginsLeftRightInsetView.layout.topLeft(noMarginsRightInsetView.bottomLeft).bottomRight(x: noMarginsRightInsetView.bottom + 30, y: rightPosition).leftInset(10).rightInset(10) +// +// // Left margin +// leftMarginView.layout2.top(noMarginsLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10) +// leftMarginLeftPaddingView.layout2.top(leftMarginView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10) +// leftMarginRightInsetView.layout2.top(leftMarginLeftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).RightInset(10) +// leftMarginLeftRightInsetView.layout2.top(leftMarginRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10).RightInset(10) +// +// // Right margin +// rigthMarginView.layout2.top(leftMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).rightMargin(10) +// rigthMarginLeftInsetView.layout2.top(rigthMarginView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10) +// rigthMarginRightInsetView.layout2.top(rigthMarginleftInsetView.bottom).left(leftPosition).width(70).rightMargin(10).RightInset(10) +// rigthMarginLeftRightInsetView.layout2.top(rigthMarginRightInsetView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10).RightInset(10) +// +// // Left and right margins +// leftRightMarginsView.layout2.top(rigthMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10).rightMargin(10) +// leftRightMarginsleftInsetView.layout2.top(leftRightMarginsView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10) +// leftRightMarginsRightInsetView.layout2.top(leftRightMarginsleftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).RightInset(10) +// leftRightMarginsLeftRightInsetView.layout2.top(leftRightMarginsRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10).RightInset(10) + +// contentScrollView.contentSize = CGSize(width: width, height: leftRightMarginsLeftRightInsetView.bottom) +// contentScrollView.contentInset = UIEdgeInsets.zero + } +} diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedViewController.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedViewController.swift new file mode 100644 index 00000000..4fef2825 --- /dev/null +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedViewController.swift @@ -0,0 +1,32 @@ +// +// BothEdgesSnappedViewController.swift +// MCLayoutExample +// +// Created by DION, Luc (MTL) on 2017-02-21. +// Copyright (c) 2017 Mirego. All rights reserved. +// +import UIKit + +class BothEdgesSnappedViewController: UIViewController { + fileprivate var mainView: BothEdgesSnappedView { + return self.view as! BothEdgesSnappedView + } + + init() { + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + view = BothEdgesSnappedView() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(true) + + navigationController?.isNavigationBarHidden = true + } +} diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/ValidateConflictsView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/ValidateConflictsView.swift index 2a9688be..3f38be5e 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/ValidateConflictsView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/ValidateConflictsView.swift @@ -32,6 +32,6 @@ class ValidateConflictsView: UIView { override func layoutSubviews() { super.layoutSubviews() - topLeftView.layout.right(10).width(20).topLeft(x: 10, y: 10).left(10) + topLeftView.layout.right(10).width(20).top(10).left(10).left(10) } } diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSampleTests/MCSwiftLayoutSampleTests.swift b/MCSwiftLayoutSample/MCSwiftLayoutSampleTests/MCSwiftLayoutSampleTests.swift deleted file mode 100644 index b902d786..00000000 --- a/MCSwiftLayoutSample/MCSwiftLayoutSampleTests/MCSwiftLayoutSampleTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// MCSwiftLayoutSampleTests.swift -// MCSwiftLayoutSampleTests -// -// Created by DION, Luc (MTL) on 2017-02-27. -// Copyright © 2017 mcswiftlayyout.mirego.com. All rights reserved. -// - -import XCTest -@testable import MCSwiftLayoutSample - -class MCSwiftLayoutSampleTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/MCSwiftLayoutSample/Podfile b/MCSwiftLayoutSample/Podfile new file mode 100644 index 00000000..2879cfc3 --- /dev/null +++ b/MCSwiftLayoutSample/Podfile @@ -0,0 +1,18 @@ +use_frameworks! + +workspace 'path/to/Workspace.xcworkspace' + +target 'MCSwiftLayoutSample' do + project 'MCSwiftLayoutSample.xcodeproj' + #pod 'YogaKit', '~> 1.1' + + # Debug only + pod 'Reveal-SDK', :configurations => ['Debug'] + pod 'SwiftLint' +end + +target 'MCSwiftLayoutTests' do + project '../MCSwiftLayout.xcodeproj' + pod 'Quick' + pod 'Nimble' +end diff --git a/MCSwiftLayoutSample/Podfile.lock b/MCSwiftLayoutSample/Podfile.lock new file mode 100644 index 00000000..fad2da64 --- /dev/null +++ b/MCSwiftLayoutSample/Podfile.lock @@ -0,0 +1,21 @@ +PODS: + - Nimble (6.0.1) + - Quick (1.1.0) + - Reveal-SDK (7) + - SwiftLint (0.16.1) + +DEPENDENCIES: + - Nimble + - Quick + - Reveal-SDK + - SwiftLint + +SPEC CHECKSUMS: + Nimble: 1527fd1bd2b4cf0636251a36bc8ab37e81da8347 + Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d + Reveal-SDK: 564657bc66c93d2718b1c0121cdebe99d354ddab + SwiftLint: b8b683208cc09640898f16318a7a452274e91f61 + +PODFILE CHECKSUM: 2def317a86457403b59cecf0cfc91047198c8e4d + +COCOAPODS: 1.1.1 diff --git a/MCSwiftLayoutTests/BasicTests.swift b/MCSwiftLayoutTests/BasicTests.swift new file mode 100644 index 00000000..93dc2aa7 --- /dev/null +++ b/MCSwiftLayoutTests/BasicTests.swift @@ -0,0 +1,119 @@ +// +// BasicTests.swift +// MCSwiftLayout +// +// Created by DION, Luc (MTL) on 2017-03-05. +// Copyright © 2017 mcswiftlayyout.mirego.com. All rights reserved. +// +import Quick +import Nimble + +class BasicTestsSpec: QuickSpec { + override func spec() { + var viewController: UIViewController! + var rootView: UIView! + + var childLevel1: UIView! + var childLevel2: UIView! + + var anotherChildLevel1: UIView! + var anotherChildLevel2: UIView! + + /* + root + | + - childLevel1 + | | + | - childLevel2 + | + - anotherChildLevel1 + | + - anotherChildLevel2 + */ + + beforeEach { + viewController = UIViewController() + + rootView = UIView() + rootView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) + viewController.view.addSubview(rootView) + + childLevel1 = UIView() + rootView.addSubview(childLevel1) + + childLevel2 = UIView() + childLevel1.addSubview(childLevel2) + + anotherChildLevel1 = UIView() + rootView.addSubview(anotherChildLevel1) + + anotherChildLevel2 = UIView() + anotherChildLevel1.addSubview(anotherChildLevel2) + } + + describe("the result of the centers(of: UIView) method") { + it("should warns that the view is not added to any view") { + let unAttachedView = UIView(frame: CGRect(x: 10, y: 10, width: 10, height: 10)) + unAttachedView.layout.centers(of: rootView) + + expect(unAttachedView.frame).to(equal(CGRect(x: 10, y: 10, width: 10, height: 10))) + } + + it("should centers the childLevel1 in the center of its parent") { + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + childLevel1.layout.centers(of: rootView) + + expect(childLevel1.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) + } + + it("should centers the childLevel1 in the center of its sibling anotherChildLevel1") { + anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) + + childLevel1.frame = CGRect(x: 10, y: 10, width: 40, height: 60) + childLevel1.layout.centers(of: anotherChildLevel1) + + expect(childLevel1.frame).to(equal(CGRect(x: 5, y: 5, width: 40, height: 60))) + } + + it("should centers the anotherChildLevel1 in the center of its sibling (childLevel1) sub child (childLevel2)") { + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) + anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) + + anotherChildLevel1.layout.centers(of: childLevel2) + + expect(anotherChildLevel1.frame).to(equal(CGRect(x: 15, y: 35, width: 30, height: 50))) + } + + it("should centers the childLevel2 in the center of anotherChildLevel1") { + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) + anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) + + childLevel2.layout.centers(of: anotherChildLevel1) + + expect(childLevel2.frame).to(equal(CGRect(x: 5, y: -5, width: 20, height: 40))) + } + + it("should centers the anotherChildLevel2 in the center of its parent's sibling (childLevel1) sub child (childLevel2)") { + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + childLevel2.frame = CGRect(x: 10, y: 20, width: 30, height: 40) + anotherChildLevel1.frame = CGRect(x: 10, y: 80, width: 30, height: 50) + anotherChildLevel2.frame = CGRect(x: 0, y: 0, width: 20, height: 10) + + anotherChildLevel2.layout.centers(of: childLevel2) + expect(anotherChildLevel2.frame).to(equal(CGRect(x: 15, y: -25, width: 20, height: 10))) + } + } + + describe("the result of the centers() method") { + it("should centers the childLevel1 in the center of its parent") { + childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + + childLevel1.layout.centers() + + expect(childLevel1.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) + } + } + } +} diff --git a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift index ccebb160..5d8231e9 100644 --- a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift +++ b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift @@ -10,20 +10,25 @@ import XCTest @testable import MCSwiftLayout class MCSwiftLayoutTests: XCTestCase { + var viewController: UIViewController! + var rootView: UIView! override func setUp() { super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() + + viewController = UIViewController() + + rootView = UIView() + rootView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) + viewController.view.addSubview(rootView) } func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. + let child1 = UIView() + rootView.addSubview(child1) + + child1.layout.centers(of: rootView) + print("child1.frame: \(child1.frame)") } func testPerformanceExample() { diff --git a/Podfile b/Podfile new file mode 100644 index 00000000..8adc1b88 --- /dev/null +++ b/Podfile @@ -0,0 +1,6 @@ +use_frameworks! + +target 'MCSwiftLayoutTests' do + pod 'Quick' + pod 'Nimble' +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 00000000..badf7522 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,15 @@ +PODS: + - Nimble (6.0.1) + - Quick (1.1.0) + +DEPENDENCIES: + - Nimble + - Quick + +SPEC CHECKSUMS: + Nimble: 1527fd1bd2b4cf0636251a36bc8ab37e81da8347 + Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d + +PODFILE CHECKSUM: bf792fd392130a7a74fbcd6812b5af2131610dbd + +COCOAPODS: 1.1.1 diff --git a/scripts/synx.sh b/scripts/synx.sh new file mode 100755 index 00000000..20625b76 --- /dev/null +++ b/scripts/synx.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +synx --no-sort-by-name PAP.xcodeproj + +echo +echo +echo ===================================================== +echo List of empty forlders +echo ===================================================== +find ./PAP -depth -type d -empty +echo end \ No newline at end of file From 90872ad517439db16000bf81ba24b28d9a1eb571 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Sat, 11 Mar 2017 07:24:40 -0500 Subject: [PATCH 2/3] =?UTF-8?q?Implementation=20center(pin,=20of:UIView)?= =?UTF-8?q?=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MCSwiftLayout/Layout.swift | 683 +++++++++++++----- .../MarginsAndPaddingsLeftRightView.swift | 11 +- .../MenuViewController.swift | 5 + .../BothEdgesSnappedView.swift | 180 +++-- MCSwiftLayoutTests/BasicTests.swift | 142 ++-- MCSwiftLayoutTests/MCSwiftLayoutTests.swift | 2 +- 6 files changed, 691 insertions(+), 332 deletions(-) diff --git a/MCSwiftLayout/Layout.swift b/MCSwiftLayout/Layout.swift index 2ec6b424..f9e0ade6 100644 --- a/MCSwiftLayout/Layout.swift +++ b/MCSwiftLayout/Layout.swift @@ -8,29 +8,48 @@ import UIKit /* + + QUESTIONS: + =============================================== + - Names: + - layout.topLeft(.bottomRight, of: backgroundView) + - layout.topLeft(to: .bottomRight, of: backgroundView) + - layout.topLeft(of: backgroundView, .bottomRight) + - layout.topLeft(backgroundView, .bottomRight) + - layout.topLeft(equal: backgroundView, .bottomRight) + + - layout.snapTopLeft(.bottomRight, of: backgroundView) + - layout.snapTopLeft(to: .bottomRight, of: backgroundView) + - layout.snapTopLeft(to: backgroundView, .bottomRight) + - layout.snapTop(to: .bottom, of: backgroundView) + + - layout.pinTopLeft(to: backgroundView, .bottomRight) + + - layout.top(to: .bottom, of: backgroundView) + + - position related to superview + - layout.bottomLeft().margin(10) + - layout.bottomLeftOfSuperview().margin(10) + + - enum Snap ou Pin ou Point? + + TODO: + =============================================== - implement sizeThatFits - - Insets should be applied to width and height before calling view.sizeThatFits() + - Insets should be applied to width and height before calling view.sizeThatFits() - Implement Layout + Layout operator - - layout.snapTopLeft(to: .bottomRight, of: view2) - - layout.snapTopLeft(to: .bottomRight, of: view2) - - layout.snapTopLeft(to: view2, .bottomRight) - - layout.topLeft(to: .bottomRight, of: view2) - - layout.topLeft(view2.bottomRight) -> Ne fonctionne pas si pas le même parent! - - layout.snapTop(to: .bottom, of: view2) - - layout.top(to: .bottom, of: view2) - - - Implement - - marginHorizontal - - marginVertical - - insetHorizontal - - insetVertical - - inset(t:? = nil l:? = nil b:? = nil r:? = nil ) ?? - - margin(t:? = nil l:? = nil b:? = nil r:? = nil ) ?? + - marginHorizontal + - marginVertical + - insetHorizontal + - insetVertical + - inset(t:? = nil l:? = nil b:? = nil r:? = nil ) ?? + - margin(t:? = nil l:? = nil b:? = nil r:? = nil ) ?? */ +fileprivate typealias Context = () -> String public extension UIView { public var top: CGFloat { @@ -161,9 +180,31 @@ public extension UIView { } } +public enum Pin: String { + case topLeft + case topCenter + case topRight + case leftCenter + case center + case rightCenter + case bottomLeft + case bottomCenter + case bottomRight +} + +public enum VerticalEdge: String { + case top + case bottom +} + +public enum HorizontalEdge: String { + case left + case right +} public class Layout { static var logConflicts = true + //static var useBottomRightCssStyle = false fileprivate let view: UIView @@ -202,157 +243,367 @@ public class Layout { // @discardableResult public func top(_ value: CGFloat) -> Layout { - setTopCoordinate(value, setterContext: "top(\(value))") + setTop(value, context: { return "top(\(value))" }) return self } + // TODO: IMplementent this + @discardableResult + public func top(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { + return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + } + @discardableResult public func left(_ value: CGFloat) -> Layout { - setLeftCoordinate(value, setterContext: "left(\(value))") + setLeft(value, context: { return "left(\(value))" }) return self } + // TODO: IMplementent this + @discardableResult + public func left(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { + return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + } + @discardableResult public func bottom(_ value: CGFloat) -> Layout { - setBottomCoordinate(value, setterContext: "bottom(\(value))") + setBottom(value, context: { return "bottom(\(value))" }) return self } + // TODO: IMplementent this + @discardableResult + public func bottom(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { + return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + } @discardableResult public func right(_ value: CGFloat) -> Layout { - setRightCoordinate(value, setterContext: "right(\(value))") + setRight(value, context: { return "right(\(value))" }) return self } + // TODO: IMplementent this + @discardableResult + public func right(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { + return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + } + //TODO: Add hCenter and vCenter @discardableResult public func topLeft(_ point: CGPoint) -> Layout { - return setTopLeft(x: point.x, y: point.y, setterContext: "topLeft(CGPoint(\(point.x), \(point.y)))") + return setTopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func topLeft(x: CGFloat, y: CGFloat) -> Layout { -// return setTopLeft(x: x, y: y, setterContext: "topLeft(x: \(x), y:\(y))") -// } + /// Position the topLeft on the specified view's pin. + @discardableResult + public func topLeft(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "topLeft(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setTopLeft(coordinates, context: context) + } + return self + } + + /// Position on the topLeft corner of the specified view. + @discardableResult + public func topLeft(of relativeView: UIView) -> Layout { + func context() -> String { return "topLeft(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .topLeft, of: relativeView, context: context) { + setTopLeft(coordinates, context: context) + } + return self + } + + /// Position on the topLeft corner of its parent. + @discardableResult + public func topLeft() -> Layout { + func context() -> String { return "topLeft()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setTopLeft(layoutSuperview.topLeft, context: context) + } + return self + } @discardableResult public func topCenter(_ point: CGPoint) -> Layout { - return setTopCenter(x: point.x, y: point.y, setterContext: "topCenter(CGPoint(\(point.x), \(point.y)))") + return setTopCenter(point, context: { return "topCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func topCenter(x: CGFloat, y: CGFloat) -> Layout { -// return setTopCenter(x: x, y: y, setterContext: "topCenter(x: \(x), y:\(y))") -// } + /// Position the topCenter on the specified view's pin. + @discardableResult + public func topCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "topCenter(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setTopCenter(coordinates, context: context) + } + return self + } + + /// Position on the topCenter corner of the specified view. + @discardableResult + public func topCenter(of relativeView: UIView) -> Layout { + func context() -> String { return "topCenter(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .topCenter, of: relativeView, context: context) { + setTopCenter(coordinates, context: context) + } + return self + } + + /// Position on the topCenter corner of its parent. + @discardableResult + public func topCenter() -> Layout { + func context() -> String { return "topCenter()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setTopCenter(layoutSuperview.topCenter, context: context) + } + return self + } + @discardableResult public func topRight(_ point: CGPoint) -> Layout { - return setTopRight(x: point.x, y: point.y, setterContext: "topRight(CGPoint(\(point.x), \(point.y)))") + return setTopRight(point, context: { return "topRight(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func topRight(x: CGFloat, y: CGFloat) -> Layout { -// return setTopRight(x: x, y: y, setterContext: "topRight(x: \(x), y:\(y))") -// } + /// Position the topRight on the specified view's pin. + @discardableResult + public func topRight(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "topRight(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setTopRight(coordinates, context: context) + } + return self + } + + /// Position on the topRight corner of the specified view. + @discardableResult + public func topRight(of relativeView: UIView) -> Layout { + func context() -> String { return "topRight(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .topRight, of: relativeView, context: context) { + setTopRight(coordinates, context: context) + } + return self + } + + /// Position on the topRight corner of its parent. + @discardableResult + public func topRight() -> Layout { + func context() -> String { return "topRight()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setTopRight(layoutSuperview.topRight, context: context) + } + return self + } @discardableResult public func leftCenter(_ point: CGPoint) -> Layout { - return setLeftCenter(x: point.x, y: point.y, setterContext: "leftCenter(CGPoint(\(point.x), \(point.y)))") + return setLeftCenter(point, context: { return "leftCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } - -// @discardableResult -// public func leftCenter(x: CGFloat, y: CGFloat) -> Layout { -// return setLeftCenter(x: x, y: y, setterContext: "leftCenter(x: \(x), y:\(y))") -// } + /// Position the leftCenter on the specified view's pin. @discardableResult - public func centers(_ point: CGPoint) -> Layout { - return setCenters(x: point.x, y: point.y, setterContext: "centers(CGPoint(\(point.x), \(point.y)))") + public func leftCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "leftCenter(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setLeftCenter(coordinates, context: context) + } + return self } + /// Position on the leftCenter corner of the specified view. @discardableResult - public func centers(of relativeView: UIView) -> Layout { - if let layoutSuperview = validateLayoutSuperview(setterContext: "centers(of: \(view))") { - if let relativeSuperview = relativeView.superview { - let center: CGPoint - if layoutSuperview == relativeSuperview { - center = relativeView.centers // same parent => no coordinates conversion required. - } else { - center = relativeSuperview.convert(relativeView.centers, to: layoutSuperview) - } - setCenters(x: center.x, y: center.y, setterContext: "centers(of: \(view))") - } else { - warn("relative view's superview is nil", setterContext: "centers(of: \(view))") - } + public func leftCenter(of relativeView: UIView) -> Layout { + func context() -> String { return "leftCenter(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .leftCenter, of: relativeView, context: context) { + setLeftCenter(coordinates, context: context) + } + return self + } + + /// Position on the leftCenter corner of its parent. + @discardableResult + public func leftCenter() -> Layout { + func context() -> String { return "leftCenter()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setLeftCenter(layoutSuperview.leftCenter, context: context) } return self } @discardableResult - public func centers() -> Layout { - if let layoutSuperview = validateLayoutSuperview(setterContext: "centers()") { - let center = layoutSuperview.center - setCenters(x: center.x, y: center.y, setterContext: "centers()") + public func center(_ point: CGPoint) -> Layout { + return setCenter(point, context: { return "centers(CGPoint(x: \(point.x), y: \(point.y)))" }) + } + + /// Position the centers on the specified view's pin. + @discardableResult + public func center(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "centers(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setCenter(coordinates, context: context) } return self } - fileprivate func validateLayoutSuperview(setterContext: @autoclosure () -> String) -> UIView? { - if let parentView = view.superview { - return parentView - } else { - warn("Layout's view must be added to a UIView before being layouted using this method.", setterContext: setterContext) - return nil + @discardableResult + public func center(of relativeView: UIView) -> Layout { + func context() -> String { return "centers(of: \(view))" } + if let coordinates = computeCoordinates(forPin: Pin.center, of: relativeView, context: context) { + setCenter(coordinates, context: context) } + return self + } + + @discardableResult + public func center() -> Layout { + func context() -> String { return "center()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setCenter(layoutSuperview.center, context: context) + } + return self } - -// @discardableResult -// public func centers(x: CGFloat, y: CGFloat) -> Layout { -// return setCenters(x: x, y: y, setterContext: "centers(x: \(x), y:\(y))") -// } - @discardableResult public func rightCenter(_ point: CGPoint) -> Layout { - return setRightCenter(x: point.x, y: point.y, setterContext: "rightCenter(CGPoint(\(point.x), \(point.y)))") + return setRightCenter(point, context: { return "rightCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func rightCenter(x: CGFloat, y: CGFloat) -> Layout { -// return setRightCenter(x: x, y: y, setterContext: "rightCenter(x: \(x), y:\(y))") -// } + /// Position the rightCenter on the specified view's pin. + @discardableResult + public func rightCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "rightCenter(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setRightCenter(coordinates, context: context) + } + return self + } + + /// Position on the rightCenter corner of the specified view. + @discardableResult + public func rightCenter(of relativeView: UIView) -> Layout { + func context() -> String { return "rightCenter(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .rightCenter, of: relativeView, context: context) { + setRightCenter(coordinates, context: context) + } + return self + } + + /// Position on the rightCenter corner of its parent. + @discardableResult + public func rightCenter() -> Layout { + func context() -> String { return "rightCenter()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setRightCenter(layoutSuperview.rightCenter, context: context) + } + return self + } @discardableResult public func bottomLeft(_ point: CGPoint) -> Layout { - return setBottomLeft(x: point.x, y: point.y, setterContext: "bottomLeft(CGPoint(\(point.x), \(point.y)))") + return setBottomLeft(point, context: { return "bottomLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func bottomLeft(x: CGFloat, y: CGFloat) -> Layout { -// return setBottomLeft(x: x, y: y, setterContext: "bottomLeft(x: \(x), y:\(y))") -// } + /// Position the bottomLeft on the specified view's pin. + @discardableResult + public func bottomLeft(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "bottomLeft(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setBottomLeft(coordinates, context: context) + } + return self + } + + /// Position on the bottomLeft corner of the specified view. + @discardableResult + public func bottomLeft(of relativeView: UIView) -> Layout { + func context() -> String { return "bottomLeft(of: \(view))" } + if let coordinates = computeCoordinates(forPin: Pin.bottomLeft, of: relativeView, context: context) { + setBottomLeft(coordinates, context: context) + } + return self + } + + /// Position on the bottomLeft corner of its parent. + @discardableResult + public func bottomLeft() -> Layout { + func context() -> String { return "bottomLeft()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setBottomLeft(layoutSuperview.bottomLeft, context: context) + } + return self + } @discardableResult public func bottomCenter(_ point: CGPoint) -> Layout { - return setBottomCenter(x: point.x, y: point.y, setterContext: "bottomCenter(CGPoint(\(point.x), \(point.y)))") + return setBottomCenter(point, context: { return "bottomCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func bottomCenter(x: CGFloat, y: CGFloat) -> Layout { -// return setBottomCenter(x: x, y: y, setterContext: "bottomCenter(x: \(x), y:\(y))") -// } + /// Position the bottomCenter on the specified view's pin. + @discardableResult + public func bottomCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "bottomCenter(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setBottomCenter(coordinates, context: context) + } + return self + } + /// Position on the bottomCenter corner of the specified view. + @discardableResult + public func bottomCenter(of relativeView: UIView) -> Layout { + func context() -> String { return "bottomCenter(of: \(view))" } + if let coordinates = computeCoordinates(forPin: Pin.bottomCenter, of: relativeView, context: context) { + setBottomCenter(coordinates, context: context) + } + return self + } + + /// Position on the bottomCenter corner of its parent. + @discardableResult + public func bottomCenter() -> Layout { + func context() -> String { return "bottomCenter()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setBottomCenter(layoutSuperview.bottomCenter, context: context) + } + return self + } + @discardableResult public func bottomRight(_ point: CGPoint) -> Layout { - return setBottomRight(x: point.x, y: point.y, setterContext: "bottomRight(CGPoint(\(point.x), \(point.y)))") + return setBottomRight(point, context: { return "bottomRight(CGPoint(x: \(point.x), y: \(point.y)))" }) } -// @discardableResult -// public func bottomRight(x: CGFloat, y: CGFloat) -> Layout { -// return setBottomRight(x: x, y: y, setterContext: "bottomRight(x: \(x), y:\(y))") -// } + /// Position the bottomRight on the specified view's pin. + @discardableResult + public func bottomRight(_ pin: Pin, of relativeView: UIView) -> Layout { + func context() -> String { return "bottomRight(\(pin.rawValue), of: \(view))" } + if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { + setBottomRight(coordinates, context: context) + } + return self + } + + /// Position on the bottomRight corner of the specified view. + @discardableResult + public func bottomRight(of relativeView: UIView) -> Layout { + func context() -> String { return "bottomRight(of: \(view))" } + if let coordinates = computeCoordinates(forPin: .bottomRight, of: relativeView, context: context) { + setBottomRight(coordinates, context: context) + } + return self + } + /// Position on the bottomRight corner of its parent. + @discardableResult + public func bottomRight() -> Layout { + func context() -> String { return "bottomRight()" } + if let layoutSuperview = validateLayoutSuperview(context: context) { + setBottomRight(layoutSuperview.bottomRight, context: context) + } + return self + } + // RELATIVE POSITION public enum HorizontalAlignment { case left @@ -368,60 +619,60 @@ public class Layout { @discardableResult public func above(of view: UIView) -> Layout { - setBottomCoordinate(view.top, setterContext: "above(of: \(view))") + setBottom(view.top, context: { return "above(of: \(view))" }) return self } @discardableResult public func above(of view: UIView, aligned: HorizontalAlignment) -> Layout { switch aligned { - case .left: return setBottomLeft(x: view.topLeft.x, y: view.topLeft.y, setterContext: "above(of: \(view), aligned: .left)") - case .center: return setBottomCenter(x: view.topCenter.x, y: view.topCenter.y, setterContext: "above(of: \(view), aligned: .center)") - case .right: return setBottomRight(x: view.topRight.x, y: view.topRight.y, setterContext: "above(of: \(view), aligned: .right)") + case .left: return setBottomLeft(view.topLeft, context: { return "above(of: \(view), aligned: .left)" }) + case .center: return setBottomCenter(view.topCenter, context: { return "above(of: \(view), aligned: .center)" }) + case .right: return setBottomRight(view.topRight, context: { return "above(of: \(view), aligned: .right)" }) } } @discardableResult public func below(of view: UIView) -> Layout { - setTopCoordinate(view.bottom, setterContext: "below(of: \(view))") + setTop(view.bottom, context: { return "below(of: \(view))" }) return self } @discardableResult public func below(of view: UIView, aligned: HorizontalAlignment) -> Layout { switch aligned { - case .left: return setTopLeft(x: view.bottomLeft.x, y: view.bottomLeft.y, setterContext: "below(of: \(view), aligned: .left)") - case .center: return setTopCenter(x: view.bottomCenter.x, y: view.bottomCenter.y, setterContext: "below(of: \(view), aligned: .center)") - case .right: return setTopRight(x: view.bottomRight.x, y: view.bottomRight.y, setterContext: "below(of: \(view), aligned: .right)") + case .left: return setTopLeft(view.bottomLeft, context: { return "below(of: \(view), aligned: .left)" }) + case .center: return setTopCenter(view.bottomCenter, context: { return "below(of: \(view), aligned: .center)" }) + case .right: return setTopRight(view.bottomRight, context: { return "below(of: \(view), aligned: .right)" }) } } @discardableResult public func left(of view: UIView) -> Layout { - setRightCoordinate(view.left, setterContext: "left(of: \(view))") + setRight(view.left, context: { return "left(of: \(view))" }) return self } @discardableResult public func left(of view: UIView, aligned: VerticalAlignment) -> Layout { switch aligned { - case .top: return setTopRight(x: view.topLeft.x, y: view.topLeft.y, setterContext: "left(of: \(view), aligned: .top)") - case .center: return setRightCenter(x: view.leftCenter.x, y: view.leftCenter.y, setterContext: "left(of: \(view), aligned: .center)") - case .bottom: return setBottomRight(x: view.bottomLeft.x, y: view.bottomLeft.y, setterContext: "left(of: \(view), aligned: .bottom)") + case .top: return setTopRight(view.topLeft, context: { return "left(of: \(view), aligned: .top)" }) + case .center: return setRightCenter(view.leftCenter, context: { return "left(of: \(view), aligned: .center)" }) + case .bottom: return setBottomRight(view.bottomLeft, context: { return "left(of: \(view), aligned: .bottom)" }) } } @discardableResult public func right(of view: UIView) -> Layout { - setLeftCoordinate(view.right, setterContext: "right(of: \(view))") + setLeft(view.right, context: { return "right(of: \(view))" }) return self } @discardableResult public func right(of view: UIView, aligned: VerticalAlignment) -> Layout { switch aligned { - case .top: return setTopLeft(x: view.topRight.x, y: view.topRight.y, setterContext: "right(of: \(view), aligned: .top)") - case .center: return setLeftCenter(x: view.rightCenter.x, y: view.rightCenter.y, setterContext: "right(of: \(view), aligned: .center)") - case .bottom: return setBottomLeft(x: view.bottomRight.x, y: view.bottomRight.y, setterContext: "right(of: \(view), aligned: .bottom)") + case .top: return setTopLeft(view.topRight, context: { return "right(of: \(view), aligned: .top)" }) + case .center: return setLeftCenter(view.rightCenter, context: { return "right(of: \(view), aligned: .center)" }) + case .bottom: return setBottomLeft(view.bottomRight, context: { return "right(of: \(view), aligned: .bottom)" }) } } @@ -430,27 +681,27 @@ public class Layout { // @discardableResult public func width(_ width: CGFloat) -> Layout { - return setWidth(width, setterContext: "width(\(width))") + return setWidth(width, context: { return "width(\(width))" }) } @discardableResult public func width(of view: UIView) -> Layout { - return setWidth(view.width, setterContext: "width(of: \(view))") + return setWidth(view.width, context: { return "width(of: \(view))" }) } @discardableResult public func height(_ height: CGFloat) -> Layout { - return setHeight(height, setterContext: "height(\(height))") + return setHeight(height, context: { return "height(\(height))" }) } @discardableResult public func height(of view: UIView) -> Layout { - return setHeight(view.height, setterContext: "height(of: \(view))") + return setHeight(view.height, context: { return "height(of: \(view))" }) } @discardableResult public func size(_ size: CGSize) -> Layout { - if isSizeNotSet(setterContext: "size(CGSize(width: \(size.width), height: \(size.height)))") { + if isSizeNotSet(context: { return "size(CGSize(width: \(size.width), height: \(size.height)))" }) { width(size.width) height(size.height) } @@ -459,18 +710,19 @@ public class Layout { @discardableResult public func size(of view: UIView) -> Layout { + func context() -> String { return "size(of \(view))" } let viewSize = view.frame.size - if isSizeNotSet(setterContext: "size(of \(viewSize))") { - setWidth(viewSize.width) - setHeight(view.height) + if isSizeNotSet(context: context) { + setWidth(viewSize.width, context: context) + setHeight(view.height, context: context) } return self } @discardableResult public func sizeThatFits(size: CGSize) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFits(CGSize(width: \(size.width), height: \(size.height)))") { + if isSizeNotSet(context: { return "sizeThatFits(CGSize(width: \(size.width), height: \(size.height)))" }) { fitSize = size } return self @@ -478,7 +730,7 @@ public class Layout { @discardableResult public func sizeThatFits(sizeOf view: UIView) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFitsViewSize(\(view))") { + if isSizeNotSet(context: { return "sizeThatFitsViewSize(\(view))" }) { fitSize = view.size } return self @@ -486,7 +738,7 @@ public class Layout { @discardableResult public func sizeThatFits(width: CGFloat) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFitsWidth(\(width))") { + if isSizeNotSet(context: { return "sizeThatFitsWidth(\(width))" }) { if fitSize == nil { fitSize = CGSize(width: width, height: .greatestFiniteMagnitude) } else { @@ -498,7 +750,7 @@ public class Layout { @discardableResult public func sizeThatFits(widthOf view: UIView) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFitsWidth(of: \(view))") { + if isSizeNotSet(context: { return "sizeThatFitsWidth(of: \(view))" }) { sizeThatFits(width: view.size.width) } return self @@ -506,7 +758,7 @@ public class Layout { @discardableResult public func sizeThatFits(height: CGFloat) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFitsHeight(\(height))") { + if isSizeNotSet(context: { return "sizeThatFitsHeight(\(height))" }) { if fitSize == nil { fitSize = CGSize(width: .greatestFiniteMagnitude, height: height) } else { @@ -518,7 +770,7 @@ public class Layout { @discardableResult public func sizeThatFits(heightOf view: UIView) -> Layout { - if isSizeNotSet(setterContext: "sizeThatFitsHeightof: \(view))") { + if isSizeNotSet(context: { return "sizeThatFitsHeightof: \(view))" }) { sizeThatFits(height: view.size.height) } return self @@ -773,152 +1025,153 @@ public class Layout { // MARK: Private methods extension Layout { - fileprivate func setTopCoordinate(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setTop(_ value: CGFloat, context: Context) { if bottom != nil && height != nil { - warnConflict(setterContext, ["bottom": bottom!, "height": height!]) + warnConflict(context, ["bottom": bottom!, "height": height!]) } else if vCenter != nil { - warnConflict(setterContext, ["Vertical Center": vCenter!]) + warnConflict(context, ["Vertical Center": vCenter!]) } else if top != nil { - warnPropertyAlreadySet("top", propertyValue: top!, setterContext: setterContext) + warnPropertyAlreadySet("top", propertyValue: top!, context: context) } else { top = value } } - fileprivate func setLeftCoordinate(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setLeft(_ value: CGFloat, context: Context) { if right != nil && width != nil { - warnConflict(setterContext, ["right": right!, "width": width!]) + warnConflict(context, ["right": right!, "width": width!]) } else if hCenter != nil { - warnConflict(setterContext, ["Horizontal Center": hCenter!]) + warnConflict(context, ["Horizontal Center": hCenter!]) } else if left != nil { - warnPropertyAlreadySet("left", propertyValue: left!, setterContext: setterContext) + warnPropertyAlreadySet("left", propertyValue: left!, context: context) } else { left = value } } - fileprivate func setRightCoordinate(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setRight(_ value: CGFloat, context: Context) { if left != nil && width != nil { - warnConflict(setterContext, ["left": left!, "width": width!]) + warnConflict(context, ["left": left!, "width": width!]) } else if hCenter != nil { - warnConflict(setterContext, ["Horizontal Center": hCenter!]) + warnConflict(context, ["Horizontal Center": hCenter!]) } else if right != nil { - warnPropertyAlreadySet("right", propertyValue: right!, setterContext: setterContext) + warnPropertyAlreadySet("right", propertyValue: right!, context: context) } else { right = value } } - fileprivate func setBottomCoordinate(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setBottom(_ value: CGFloat, context: Context) { if top != nil && height != nil { - warnConflict(setterContext, ["top": top!, "height": height!]) + warnConflict(context, ["top": top!, "height": height!]) } else if vCenter != nil { - warnConflict(setterContext, ["Vertical Center": vCenter!]) + warnConflict(context, ["Vertical Center": vCenter!]) } else if bottom != nil { - warnPropertyAlreadySet("bottom", propertyValue: bottom!, setterContext: setterContext) + warnPropertyAlreadySet("bottom", propertyValue: bottom!, context: context) } else { bottom = value } } - fileprivate func setHorizontalCenter(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setHorizontalCenter(_ value: CGFloat, context: Context) { if left != nil { - warnConflict(setterContext, ["left": left!]) + warnConflict(context, ["left": left!]) } else if right != nil { - warnConflict(setterContext, ["right": right!]) + warnConflict(context, ["right": right!]) } else if hCenter != nil { - warnPropertyAlreadySet("hCenter", propertyValue: hCenter!, setterContext: setterContext) + warnPropertyAlreadySet("hCenter", propertyValue: hCenter!, context: context) } else { hCenter = value } } - fileprivate func setVerticalCenter(_ value: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func setVerticalCenter(_ value: CGFloat, context: Context) { if top != nil { - warnConflict(setterContext, ["top": top!]) + warnConflict(context, ["top": top!]) } else if bottom != nil { - warnConflict(setterContext, ["bottom": bottom!]) + warnConflict(context, ["bottom": bottom!]) } else if vCenter != nil { - warnPropertyAlreadySet("vCenter", propertyValue: vCenter!, setterContext: setterContext) + warnPropertyAlreadySet("vCenter", propertyValue: vCenter!, context: context) } else { vCenter = value } } - fileprivate func setTopLeft(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setLeftCoordinate(x, setterContext: setterContext) - setTopCoordinate(y, setterContext: setterContext) + @discardableResult + fileprivate func setTopLeft(_ point: CGPoint, context: Context) -> Layout { + setLeft(point.x, context: context) + setTop(point.y, context: context) return self } @discardableResult - fileprivate func setTopCenter(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setHorizontalCenter(x, setterContext: setterContext) - setTopCoordinate(y, setterContext: setterContext) + fileprivate func setTopCenter(_ point: CGPoint, context: Context) -> Layout { + setHorizontalCenter(point.x, context: context) + setTop(point.y, context: context) return self } @discardableResult - fileprivate func setTopRight(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setRightCoordinate(x, setterContext: setterContext) - setTopCoordinate(y, setterContext: setterContext) + fileprivate func setTopRight(_ point: CGPoint, context: Context) -> Layout { + setRight(point.x, context: context) + setTop(point.y, context: context) return self } @discardableResult - fileprivate func setLeftCenter(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setLeftCoordinate(x, setterContext: setterContext) - setVerticalCenter(y, setterContext: setterContext) + fileprivate func setLeftCenter(_ point: CGPoint, context: Context) -> Layout { + setLeft(point.x, context: context) + setVerticalCenter(point.y, context: context) return self } @discardableResult - fileprivate func setCenters(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setHorizontalCenter(x, setterContext: setterContext) - setVerticalCenter(y, setterContext: setterContext) + fileprivate func setCenter(_ point: CGPoint, context: Context) -> Layout { + setHorizontalCenter(point.x, context: context) + setVerticalCenter(point.y, context: context) return self } @discardableResult - fileprivate func setRightCenter(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setRightCoordinate(x, setterContext: setterContext) - setVerticalCenter(y, setterContext: setterContext) + fileprivate func setRightCenter(_ point: CGPoint, context: Context) -> Layout { + setRight(point.x, context: context) + setVerticalCenter(point.y, context: context) return self } @discardableResult - fileprivate func setBottomLeft(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setLeftCoordinate(x, setterContext: setterContext) - setBottomCoordinate(y, setterContext: setterContext) + fileprivate func setBottomLeft(_ point: CGPoint, context: Context) -> Layout { + setLeft(point.x, context: context) + setBottom(point.y, context: context) return self } @discardableResult - fileprivate func setBottomCenter(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setHorizontalCenter(x, setterContext: setterContext) - setBottomCoordinate(y, setterContext: setterContext) + fileprivate func setBottomCenter(_ point: CGPoint, context: Context) -> Layout { + setHorizontalCenter(point.x, context: context) + setBottom(point.y, context: context) return self } @discardableResult - fileprivate func setBottomRight(x: CGFloat, y: CGFloat, setterContext: @autoclosure () -> String) -> Layout { - setRightCoordinate(x, setterContext: setterContext) - setBottomCoordinate(y, setterContext: setterContext) + fileprivate func setBottomRight(_ point: CGPoint, context: Context) -> Layout { + setRight(point.x, context: context) + setBottom(point.y, context: context) return self } @discardableResult - fileprivate func setWidth(_ value: CGFloat, setterContext: @autoclosure () -> String = "") -> Layout { + fileprivate func setWidth(_ value: CGFloat, context: Context) -> Layout { guard value >= 0 else { - warn("The width (\(value)) must be greater or equal to 0.", setterContext: setterContext); return self + warn("The width (\(value)) must be greater or equal to 0.", context: context); return self } if left != nil && right != nil { - warnConflict(setterContext, ["left": left!, "right": right!]) + warnConflict(context, ["left": left!, "right": right!]) } else if fitSize != nil { - warnConflict(setterContext, ["fitSize.width": fitSize!.width, "fitSize.height": fitSize!.height]) + warnConflict(context, ["fitSize.width": fitSize!.width, "fitSize.height": fitSize!.height]) } else if width != nil { - warnPropertyAlreadySet("width", propertyValue: width!, setterContext: setterContext) + warnPropertyAlreadySet("width", propertyValue: width!, context: context) } else { width = value } @@ -926,41 +1179,79 @@ extension Layout { } @discardableResult - fileprivate func setHeight(_ value: CGFloat, setterContext: @autoclosure () -> String = "") -> Layout { + fileprivate func setHeight(_ value: CGFloat, context: Context) -> Layout { guard value >= 0 else { - warn("The height (\(value)) must be greater or equal to 0.", setterContext: setterContext); return self + warn("The height (\(value)) must be greater or equal to 0.", context: context); return self } if top != nil && bottom != nil { - warnConflict(setterContext, ["top": top!, "bottom": bottom!]) + warnConflict(context, ["top": top!, "bottom": bottom!]) } else if fitSize != nil { - warnConflict(setterContext, ["fitSize.width": fitSize!.width, "fitSize.height": fitSize!.height]) + warnConflict(context, ["fitSize.width": fitSize!.width, "fitSize.height": fitSize!.height]) } else if height != nil { - warnPropertyAlreadySet("height", propertyValue: height!, setterContext: setterContext) + warnPropertyAlreadySet("height", propertyValue: height!, context: context) } else { height = value } return self } - fileprivate func isSizeNotSet(setterContext: String) -> Bool { + fileprivate func isSizeNotSet(context: Context) -> Bool { if top != nil && bottom != nil { - warnConflict(setterContext, ["top": top!, "bottom": bottom!]) + warnConflict(context, ["top": top!, "bottom": bottom!]) return false } else if height != nil { - warnConflict(setterContext, ["height": height!]) + warnConflict(context, ["height": height!]) return false } else if width != nil { - warnConflict(setterContext, ["width": width!]) + warnConflict(context, ["width": width!]) return false } else if fitSize != nil { - warnPropertyAlreadySet("fitSize", propertyValue: fitSize!, setterContext: setterContext) + warnPropertyAlreadySet("fitSize", propertyValue: fitSize!, context: context) return false } else { return true } } + fileprivate func computeCoordinates(forPin pin: Pin, of relativeView: UIView, context: Context) -> CGPoint? { + guard let layoutSuperview = validateLayoutSuperview(context: context) else { return nil } + guard let relativeSuperview = relativeView.superview else { warn("relative view's superview is nil", context: context); return nil } + + return computeCoordinates(point: pointForPin(pin, of: relativeView), layoutSuperview, relativeView, relativeSuperview) + } + + fileprivate func computeCoordinates(point: CGPoint, _ layoutSuperview: UIView, _ relativeView: UIView, _ relativeSuperview: UIView) -> CGPoint { + if layoutSuperview == relativeSuperview { + return point // same parent => no coordinates conversion required. + } else { + return relativeSuperview.convert(point, to: layoutSuperview) + } + } + + fileprivate func validateLayoutSuperview(context: Context) -> UIView? { + if let parentView = view.superview { + return parentView + } else { + warn("Layout's view must be added to a UIView before being layouted using this method.", context: context) + return nil + } + } + + fileprivate func pointForPin(_ pin: Pin, of view: UIView) -> CGPoint { + switch pin { + case .topLeft: return view.topLeft + case .topCenter: return view.topCenter + case .topRight: return view.topRight + case .leftCenter: return view.leftCenter + case .center: return view.center + case .rightCenter: return view.rightCenter + case .bottomLeft: return view.bottomLeft + case .bottomCenter: return view.bottomCenter + case .bottomRight: return view.bottomRight + } + } + fileprivate func applyMarginsAndInsets(top: CGFloat) -> CGFloat { return top + (topMargin ?? 0) + (topInset ?? 0) } @@ -985,23 +1276,23 @@ extension Layout { return width - (leftInset ?? 0) - (rightInset ?? 0) } - fileprivate func warn(_ text: String, setterContext: @autoclosure () -> String) { + fileprivate func warn(_ text: String, context: Context) { guard Layout.logConflicts else { return } - print("\n\(text)(\(setterContext()))\n") + print("\n\(text)(\(context()))\n") } - fileprivate func warnPropertyAlreadySet(_ propertyName: String, propertyValue: CGFloat, setterContext: @autoclosure () -> String) { + fileprivate func warnPropertyAlreadySet(_ propertyName: String, propertyValue: CGFloat, context: Context) { guard Layout.logConflicts else { return } - print("\nLayou2: The \(propertyName) property has already been set to \(propertyValue). (\(setterContext()))\n") + print("\nLayou2: The \(propertyName) property has already been set to \(propertyValue). (\(context()))\n") } - fileprivate func warnPropertyAlreadySet(_ propertyName: String, propertyValue: CGSize, setterContext: @autoclosure () -> String) { - print("\nLayou2: The \(propertyName) property has already been set to CGSize(width: \(propertyValue.width), height: \(propertyValue.height)). (\(setterContext()))\n") + fileprivate func warnPropertyAlreadySet(_ propertyName: String, propertyValue: CGSize, context: Context) { + print("\nLayou2: The \(propertyName) property has already been set to CGSize(width: \(propertyValue.width), height: \(propertyValue.height)). (\(context()))\n") } - fileprivate func warnConflict(_ setterContext: @autoclosure () -> String, _ properties: [String: CGFloat]) { + fileprivate func warnConflict(_ context: Context, _ properties: [String: CGFloat]) { guard Layout.logConflicts else { return } - var warning = "\nLayout Conflict: '\(setterContext())' won't be applied since it conflicts with the following already set properties:\n" + var warning = "\nLayout Conflict: '\(context())' won't be applied since it conflicts with the following already set properties:\n" properties.forEach { (key, value) in warning += " \(key): \(value)\n" } diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift index e9fa92d0..40818f6e 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift @@ -35,13 +35,12 @@ class MarginsAndPaddingsLeftRightView: UIView { private let leftRightMarginsLeftRightInsetView = BasicView(text: "LM-RM LI-RI", color: UIColor.purple.withAlphaComponent(0.4)) // TODO - private let noMarginsNoPaddings2 = BasicView(text: "70x30", color: UIColor.black) - private let topMarginView = BasicView(text: "TM", color: UIColor.orange.withAlphaComponent(1)) - private let topMarginTopPaddingView = BasicView(text: "TM TP", color: UIColor.orange.withAlphaComponent(0.8)) - private let topMarginBottomPaddingView = BasicView(text: "TM BP", color: UIColor.orange.withAlphaComponent(0.6)) - private let topMarginTopBottomPaddingView = BasicView(text: "TM TP-BP", color: UIColor.orange.withAlphaComponent(0.4)) + private let noMarginsNoPaddings2 = BasicView(text: "70x30", color: UIColor.black) + private let topMarginView = BasicView(text: "TM", color: UIColor.orange.withAlphaComponent(1)) + private let topMarginTopPaddingView = BasicView(text: "TM TP", color: UIColor.orange.withAlphaComponent(0.8)) + private let topMarginBottomPaddingView = BasicView(text: "TM BP", color: UIColor.orange.withAlphaComponent(0.6)) + private let topMarginTopBottomPaddingView = BasicView(text: "TM TP-BP", color: UIColor.orange.withAlphaComponent(0.4)) - init() { super.init(frame: .zero) diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift index 258d0497..39307b77 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MenuViewController.swift @@ -54,6 +54,11 @@ class MenuViewController: UIViewController { view = MenuView() mainView.delegate = self } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(true) + didSelect(page: .bothEdgesSnapped) + } } // MARK: MenuViewDelegate diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift index b38dd79e..b738338c 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift @@ -6,6 +6,7 @@ // Copyright (c) 2017 Mirego. All rights reserved. // import UIKit +import MCSwiftLayout class BothEdgesSnappedView: UIView { private let contentScrollView = UIScrollView() @@ -33,31 +34,37 @@ class BothEdgesSnappedView: UIView { // private let leftRightMarginsRightInsetView = BasicView(text: "LM-RM RI", color: UIColor.purple.withAlphaComponent(0.6)) // private let leftRightMarginsLeftRightInsetView = BasicView(text: "LM-RM LI-RI", color: UIColor.purple.withAlphaComponent(0.4)) - var childLevel1: UIView! - var anotherChildLevel1: UIView! - var childLevel2: UIView! - var anotherChildLevel2: UIView! + var rootView: UILabel! + var aView: UILabel! + var aViewChild: UILabel! + + var bView: UILabel! + var bViewChild: UILabel! init() { super.init(frame: .zero) - backgroundColor = .white + backgroundColor = .black + + rootView = UILabel() + setup(rootView, color: .white, text: "") + addSubview(rootView) - childLevel1 = UIView() - childLevel1.backgroundColor = UIColor.red.withAlphaComponent(0.5) - addSubview(childLevel1) + aView = UILabel() + setup(aView, color: UIColor.red.withAlphaComponent(0.5), text: "View A") + rootView.addSubview(aView) - anotherChildLevel1 = UIView() - anotherChildLevel1.backgroundColor = UIColor.blue.withAlphaComponent(0.5) - addSubview(anotherChildLevel1) + aViewChild = UILabel() + setup(aViewChild, color: UIColor.red.withAlphaComponent(1), text: "View A Child") + aView.addSubview(aViewChild) - childLevel2 = UIView() - childLevel1.backgroundColor = UIColor.green.withAlphaComponent(0.5) - childLevel1.addSubview(childLevel2) + bView = UILabel() + setup(bView, color: UIColor.blue.withAlphaComponent(0.5), text: "View B") + rootView.addSubview(bView) - anotherChildLevel2 = UIView() - anotherChildLevel2.backgroundColor = UIColor.yellow.withAlphaComponent(0.5) - anotherChildLevel1.addSubview(anotherChildLevel2) + bViewChild = UILabel() + setup(bViewChild, color: UIColor.blue.withAlphaComponent(0.7), text: "View B Child") + bView.addSubview(bViewChild) // contentScrollView.backgroundColor = .yellow // addSubview(contentScrollView) @@ -105,63 +112,96 @@ class BothEdgesSnappedView: UIView { override func layoutSubviews() { super.layoutSubviews() -// childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) -// childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) -// anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) -// childLevel2.layout.centers(of: anotherChildLevel1) + print("\n") -// childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) -// childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) -// anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) -// -// anotherChildLevel1.layout.centers(of: childLevel2) - - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - childLevel2.frame = CGRect(x: 10, y: 20, width: 30, height: 40) - anotherChildLevel1.frame = CGRect(x: 10, y: 80, width: 30, height: 50) - anotherChildLevel2.frame = CGRect(x: 0, y: 0, width: 20, height: 10) + rootView.frame = CGRect(x: 0, y: 0, width: 400, height: 400) + aView.frame = CGRect(x: 140, y: 100, width: 100, height: 60) + aViewChild.frame = CGRect(x: 10, y: 20, width: 50, height: 30) - anotherChildLevel2.layout.centers(of: childLevel2) - - print(anotherChildLevel2.frame) + bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) + bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) -// let leftPosition: CGFloat = 0 -// -// contentScrollView.layout.topLeft(CGPoint(x: 0, y: 0)).width(width).height(height).topInset(64) -// -// descriptionLabel.size = descriptionLabel.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude)) -// descriptionLabel.layout.topLeft(CGPoint(x: leftPosition, y: 10)) -// -// // No margins -// let rightPosition: CGFloat = 70 -// //var index = 0 -// //var nextBottomPosition: CGFloat = descriptionLabel.bottom + 30 -// noMarginsNoPaddings.layout.topLeft(descriptionLabel.bottomLeft).bottomRight(x: descriptionLabel.bottom + 30, y: rightPosition) -// -// noMarginsLeftInsetView.layout.topLeft(noMarginsNoPaddings.bottomLeft).bottomRight(x: noMarginsNoPaddings.bottom + 30, y: rightPosition).leftInset(10) -// noMarginsRightInsetView.layout.topLeft(noMarginsLeftInsetView.bottomLeft).bottomRight(x: noMarginsLeftInsetView.bottom + 30, y: rightPosition).rightInset(10) -// noMarginsLeftRightInsetView.layout.topLeft(noMarginsRightInsetView.bottomLeft).bottomRight(x: noMarginsRightInsetView.bottom + 30, y: rightPosition).leftInset(10).rightInset(10) -// -// // Left margin -// leftMarginView.layout2.top(noMarginsLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10) -// leftMarginLeftPaddingView.layout2.top(leftMarginView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10) -// leftMarginRightInsetView.layout2.top(leftMarginLeftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).RightInset(10) -// leftMarginLeftRightInsetView.layout2.top(leftMarginRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).leftInset(10).RightInset(10) -// -// // Right margin -// rigthMarginView.layout2.top(leftMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).rightMargin(10) -// rigthMarginLeftInsetView.layout2.top(rigthMarginView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10) -// rigthMarginRightInsetView.layout2.top(rigthMarginleftInsetView.bottom).left(leftPosition).width(70).rightMargin(10).RightInset(10) -// rigthMarginLeftRightInsetView.layout2.top(rigthMarginRightInsetView.bottom).left(leftPosition).width(70).rightMargin(10).leftInset(10).RightInset(10) -// -// // Left and right margins -// leftRightMarginsView.layout2.top(rigthMarginLeftRightInsetView.bottom + 5).left(leftPosition).width(70).leftMargin(10).rightMargin(10) -// leftRightMarginsleftInsetView.layout2.top(leftRightMarginsView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10) -// leftRightMarginsRightInsetView.layout2.top(leftRightMarginsleftInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).RightInset(10) -// leftRightMarginsLeftRightInsetView.layout2.top(leftRightMarginsRightInsetView.bottom).left(leftPosition).width(70).leftMargin(10).rightMargin(10).leftInset(10).RightInset(10) + // topLeft +// aView.layout.topLeft() // CGRect(x: 0.0, y: 0.0, width: 100.0, height: 60.0) + aViewChild.layout.topLeft(.topLeft, of: aView) //(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) + aViewChild.layout.topLeft(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) +// aView.layout.topLe +// aViewChild.layout.topLeft(of: bView) // CGRect(x: 20.0, y: 100.0, width: 50.0, height: 30.0) +// bView.layout.topLeft(of: aViewChild) // CGRect(x: 150.0, y: 120.0, width: 110.0, height: 80.0) +// bViewChild.layout.topLeft(of: aViewChild) // CGRect(x: -10.0, y: -80.0, width: 60.0, height: 20.0) -// contentScrollView.contentSize = CGSize(width: width, height: leftRightMarginsLeftRightInsetView.bottom) -// contentScrollView.contentInset = UIEdgeInsets.zero + // topCenter +// aView.layout.topCenter() // CGRect(x: 150.0, y: 0.0, width: 100.0, height: 60.0) +// aViewChild.layout.topCenter(of: aView) //CGRect(x: 25.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.topCenter(of: bView) //CGRect(x: 50.0, y: 100.0, width: 50.0, height: 30.0) +// bView.layout.topCenter(of: aViewChild) //CGRect(x: 120.0, y: 120.0, width: 110.0, height: 80.0) +// bViewChild.layout.topCenter(of: aViewChild) //CGRect(x: -15.0, y: -80.0, width: 60.0, height: 20.0) + + // topRight +// aView.layout.topRight() //CGRect(x: 300.0, y: 0.0, width: 100.0, height: 60.0) +// aViewChild.layout.topRight(of: aView) //GRect(x: 50.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.topRight(of: bView) //CGRect(x: 80.0, y: 100.0, width: 50.0, height: 30.0) +// bView.layout.topRight(of: aViewChild) //CGRect(x: 90.0, y: 120.0, width: 110.0, height: 80.0) +// bViewChild.layout.topRight(of: aViewChild) //CGRect(x: -20.0, y: -80.0, width: 60.0, height: 20.0) + + // leftCenter +// aView.layout.leftCenter() //CGRect(x: 0.0, y: 170.0, width: 100.0, height: 60.0) +// aViewChild.layout.leftCenter(of: aView) //CGRect(x: 0.0, y: 15.0, width: 50.0, height: 30.0) +// aViewChild.layout.leftCenter(of: bView) //CGRect(x: 20.0, y: 125.0, width: 50.0, height: 30.0) +// bView.layout.leftCenter(of: aViewChild) //CGRect(x: 150.0, y: 95.0, width: 110.0, height: 80.0) +// bViewChild.layout.leftCenter(of: aViewChild) //CGRect(x: -10.0, y: -75.0, width: 60.0, height: 20.0) + + // Centers +// aView.layout.centers() //CGRect(x: 150.0, y: 170.0, width: 100.0, height: 60.0) +// aViewChild.layout.centers(of: aView) //CGRect(x: 25.0, y: 15.0, width: 50.0, height: 30.0) +// aViewChild.layout.centers(of: bView) //CGRect(x: 50.0, y: 125.0, width: 50.0, height: 30.0) +// bView.layout.centers(of: aViewChild) //CGRect(x: 120.0, y: 95.0, width: 110.0, height: 80.0) +// bViewChild.layout.centers(of: aViewChild) //CGRect(x: -15.0, y: -75.0, width: 60.0, height: 20.0) + + // rightCenter +// aView.layout.rightCenter() //CGRect(x: 300.0, y: 170.0, width: 100.0, height: 60.0) +// aViewChild.layout.rightCenter(of: aView) //CGRect(x: 50.0, y: 15.0, width: 50.0, height: 30.0) +// aViewChild.layout.rightCenter(of: bView) //CGRect(x: 80.0, y: 125.0, width: 50.0, height: 30.0) +// bView.layout.rightCenter(of: aViewChild) //CGRect(x: 90.0, y: 95.0, width: 110.0, height: 80.0) +// bViewChild.layout.rightCenter(of: aViewChild) //CGRect(x: -20.0, y: -75.0, width: 60.0, height: 20.0) + + // bottomLeft +// aView.layout.bottomLeft() //CGRect(x: 0.0, y: 340.0, width: 100.0, height: 60.0) +// aViewChild.layout.bottomLeft(of: aView) //CGRect(x: 0.0, y: 30.0, width: 50.0, height: 30.0) +// aViewChild.layout.bottomLeft(of: bView) //CGRect(x: 20.0, y: 150.0, width: 50.0, height: 30.0) +// bView.layout.bottomLeft(of: aViewChild) //CGRect(x: 150.0, y: 70.0, width: 110.0, height: 80.0) +// bViewChild.layout.bottomLeft(of: aViewChild) //CGRect(x: -10.0, y: -70.0, width: 60.0, height: 20.0) + + // bottomCenter +// aView.layout.bottomCenter() //CGRect(x: 150.0, y: 340.0, width: 100.0, height: 60.0) +// aViewChild.layout.bottomCenter(of: aView) //CGRect(x: 25.0, y: 30.0, width: 50.0, height: 30.0) +// aViewChild.layout.bottomCenter(of: bView) //CGRect(x: 50.0, y: 150.0, width: 50.0, height: 30.0) +// bView.layout.bottomCenter(of: aViewChild) //CGRect(x: 120.0, y: 70.0, width: 110.0, height: 80.0) +// bViewChild.layout.bottomCenter(of: aViewChild) //CGRect(x: -15.0, y: -70.0, width: 60.0, height: 20.0) + + // bottomRight +// aView.layout.bottomRight() //CGRect(x: 300.0, y: 340.0, width: 100.0, height: 60.0) +// aViewChild.layout.bottomRight(of: aView) //CGRect(x: 50.0, y: 30.0, width: 50.0, height: 30.0) +// aViewChild.layout.bottomRight(of: bView) //CGRect(x: 80.0, y: 150.0, width: 50.0, height: 30.0) +// bView.layout.bottomRight(of: aViewChild) //CGRect(x: 90.0, y: 70.0, width: 110.0, height: 80.0) +// bViewChild.layout.bottomRight(of: aViewChild) //CGRect(x: -20.0, y: -70.0, width: 60.0, height: 20.0) + + printViewFrame(aView, name: "aView") + printViewFrame(aViewChild, name: "aViewChild") + printViewFrame(bView, name: "bView") + printViewFrame(bViewChild, name: "bViewChild") + } + + fileprivate func setup(_ view: UILabel, color: UIColor, text: String) { + view.text = text + view.font = UIFont.systemFont(ofSize: 6) + view.backgroundColor = color + view.layer.borderWidth = 1 + view.layer.borderColor = UIColor.lightGray.cgColor + } + + fileprivate func printViewFrame(_ view: UIView, name: String) { + print("\(name): CGRect(x: \(view.frame.origin.x), y: \(view.frame.origin.y), width: \(view.frame.size.width), height: \(view.frame.size.height))") } } diff --git a/MCSwiftLayoutTests/BasicTests.swift b/MCSwiftLayoutTests/BasicTests.swift index 93dc2aa7..464753f0 100644 --- a/MCSwiftLayoutTests/BasicTests.swift +++ b/MCSwiftLayoutTests/BasicTests.swift @@ -7,113 +7,137 @@ // import Quick import Nimble +import MCSwiftLayout class BasicTestsSpec: QuickSpec { override func spec() { var viewController: UIViewController! var rootView: UIView! - var childLevel1: UIView! - var childLevel2: UIView! + var aView: UIView! + var aViewChild: UIView! - var anotherChildLevel1: UIView! - var anotherChildLevel2: UIView! + var bView: UIView! + var bViewChild: UIView! /* root | - childLevel1 | | - | - childLevel2 + | - aViewChild | - - anotherChildLevel1 + - bView | - - anotherChildLevel2 + - bViewChild */ beforeEach { viewController = UIViewController() rootView = UIView() - rootView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) + rootView.frame = CGRect(x: 0, y: 0, width: 400, height: 400) viewController.view.addSubview(rootView) - childLevel1 = UIView() - rootView.addSubview(childLevel1) + aView = UIView() + aView.frame = CGRect(x: 140, y: 100, width: 100, height: 60) + rootView.addSubview(aView) - childLevel2 = UIView() - childLevel1.addSubview(childLevel2) + aViewChild = UIView() + aViewChild.frame = CGRect(x: 10, y: 20, width: 50, height: 30) + aView.addSubview(aViewChild) - anotherChildLevel1 = UIView() - rootView.addSubview(anotherChildLevel1) + bView = UIView() + bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) + rootView.addSubview(bView) - anotherChildLevel2 = UIView() - anotherChildLevel1.addSubview(anotherChildLevel2) + bViewChild = UIView() + bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) + bView.addSubview(bViewChild) } - + describe("the result of the centers(of: UIView) method") { it("should warns that the view is not added to any view") { let unAttachedView = UIView(frame: CGRect(x: 10, y: 10, width: 10, height: 10)) - unAttachedView.layout.centers(of: rootView) + unAttachedView.layout.center(of: rootView) expect(unAttachedView.frame).to(equal(CGRect(x: 10, y: 10, width: 10, height: 10))) } + } + + // + // topLeft + // + describe("the result of the topLeft() and topLeft(of: UIView) methods") { - it("should centers the childLevel1 in the center of its parent") { - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - childLevel1.layout.centers(of: rootView) - - expect(childLevel1.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) +// TODO: Tester topLeft(CGPoint())!!! + + it("should position the aView's topLeft corner on its parent's topLeft corner") { + aView.layout.topLeft() + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 0.0, width: 100.0, height: 60.0))) } - it("should centers the childLevel1 in the center of its sibling anotherChildLevel1") { - anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) - - childLevel1.frame = CGRect(x: 10, y: 10, width: 40, height: 60) - childLevel1.layout.centers(of: anotherChildLevel1) - - expect(childLevel1.frame).to(equal(CGRect(x: 5, y: 5, width: 40, height: 60))) + it("should position the aViewChild's topLeft corner on the specified view's topLeft corner") { +// aViewChild.layout.topLeft(of: aView) +// aViewChild.layout.topLeft(Snap.topLeft, of: aView) + aViewChild.layout.topLeft(Pin.topLeft, of: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's topLeft corner on its parent sibling (bView)'s topLeft corner") { + aViewChild.layout.topLeft(of: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 20.0, y: 100.0, width: 50.0, height: 30.0))) } - it("should centers the anotherChildLevel1 in the center of its sibling (childLevel1) sub child (childLevel2)") { - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) - anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) + it("should position the bView's topLeft corner on its sibling's (aView) children (aViewChild)'s topLeft corner") { + bView.layout.topLeft(of: aViewChild) + expect(bView.frame).to(equal(CGRect(x: 150.0, y: 120.0, width: 110.0, height: 80.0))) + } + + it("should position the bViewChild's topLeft corner on its parent sibling's (aView) children (aViewChild)'s topLeft corner") { + bViewChild.layout.topLeft(of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: -10.0, y: -80.0, width: 60.0, height: 20.0))) + } + + /*it("should centers the bView in the center of its sibling (aView) sub child (aViewChild)") { + aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + aViewChild.frame = CGRect(x: 10, y: 20, width: 20, height: 40) + bView.frame = CGRect(x: 10, y: 10, width: 30, height: 50) - anotherChildLevel1.layout.centers(of: childLevel2) + bView.layout.centers(of: aViewChild) - expect(anotherChildLevel1.frame).to(equal(CGRect(x: 15, y: 35, width: 30, height: 50))) + expect(bView.frame).to(equal(CGRect(x: 15, y: 35, width: 30, height: 50))) } - it("should centers the childLevel2 in the center of anotherChildLevel1") { - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - childLevel2.frame = CGRect(x: 10, y: 20, width: 20, height: 40) - anotherChildLevel1.frame = CGRect(x: 10, y: 10, width: 30, height: 50) + it("should centers the aViewChild in the center of bView") { + aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + aViewChild.frame = CGRect(x: 10, y: 20, width: 20, height: 40) + bView.frame = CGRect(x: 10, y: 10, width: 30, height: 50) - childLevel2.layout.centers(of: anotherChildLevel1) + aViewChild.layout.centers(of: bView) - expect(childLevel2.frame).to(equal(CGRect(x: 5, y: -5, width: 20, height: 40))) + expect(aViewChild.frame).to(equal(CGRect(x: 5, y: -5, width: 20, height: 40))) } - it("should centers the anotherChildLevel2 in the center of its parent's sibling (childLevel1) sub child (childLevel2)") { - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - childLevel2.frame = CGRect(x: 10, y: 20, width: 30, height: 40) - anotherChildLevel1.frame = CGRect(x: 10, y: 80, width: 30, height: 50) - anotherChildLevel2.frame = CGRect(x: 0, y: 0, width: 20, height: 10) + it("should centers the bViewChild in the center of its parent's sibling (aView) sub child (aViewChild)") { + aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) + aViewChild.frame = CGRect(x: 10, y: 20, width: 30, height: 40) + bView.frame = CGRect(x: 10, y: 80, width: 30, height: 50) + bViewChild.frame = CGRect(x: 0, y: 0, width: 20, height: 10) - anotherChildLevel2.layout.centers(of: childLevel2) - expect(anotherChildLevel2.frame).to(equal(CGRect(x: 15, y: -25, width: 20, height: 10))) - } + bViewChild.layout.centers(of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: 15, y: -25, width: 20, height: 10))) + }*/ } - describe("the result of the centers() method") { - it("should centers the childLevel1 in the center of its parent") { - childLevel1.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - - childLevel1.layout.centers() - - expect(childLevel1.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) - } - } +// describe("the result of the centers() method") { +// it("should centers the aView in the center of its parent") { +// aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) +// +// aView.layout.centers() +// +// expect(aView.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) +// } +// } } } diff --git a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift index 5d8231e9..b1150691 100644 --- a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift +++ b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift @@ -27,7 +27,7 @@ class MCSwiftLayoutTests: XCTestCase { let child1 = UIView() rootView.addSubview(child1) - child1.layout.centers(of: rootView) + child1.layout.center(of: rootView) print("child1.frame: \(child1.frame)") } From 831fe10e92d287634bfb12c2b9581eef049a682a Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Sun, 12 Mar 2017 08:08:16 -0400 Subject: [PATCH 3/3] rename topLeft(pin: Pin, of view: UIView) to pinTopLeft(pin: Pin, of view:UIView) --- MCSwiftLayout.xcodeproj/project.pbxproj | 12 +- MCSwiftLayout/Layout.swift | 258 ++++++++++++------ .../ChainedLayoutView.swift | 12 +- .../MarginsAndPaddingsLeftRightView.swift | 4 +- .../MarginsAndPaddingsLeftWidthView.swift | 6 +- .../MCSwiftLayoutSample/RelativeView.swift | 2 +- .../BothEdgesSnappedView.swift | 65 ++++- MCSwiftLayoutTests/MCSwiftLayoutTests.swift | 4 +- .../PinEdgeCoordinateSpec.swift | 157 +++++++++++ ...ts.swift => PinPointCoordinatesSpec.swift} | 94 ++++--- 10 files changed, 451 insertions(+), 163 deletions(-) create mode 100644 MCSwiftLayoutTests/PinEdgeCoordinateSpec.swift rename MCSwiftLayoutTests/{BasicTests.swift => PinPointCoordinatesSpec.swift} (55%) diff --git a/MCSwiftLayout.xcodeproj/project.pbxproj b/MCSwiftLayout.xcodeproj/project.pbxproj index 97987461..81827fed 100644 --- a/MCSwiftLayout.xcodeproj/project.pbxproj +++ b/MCSwiftLayout.xcodeproj/project.pbxproj @@ -8,7 +8,8 @@ /* Begin PBXBuildFile section */ 2439CC311E6659FA003326FB /* Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2439CC301E6659FA003326FB /* Layout.swift */; }; - 246D36481E6C46F50050F202 /* BasicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246D36471E6C46F50050F202 /* BasicTests.swift */; }; + 2469C4FC1E74855D00073BEE /* PinEdgeCoordinateSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2469C4FB1E74855D00073BEE /* PinEdgeCoordinateSpec.swift */; }; + 246D36481E6C46F50050F202 /* PinPointCoordinatesSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 246D36471E6C46F50050F202 /* PinPointCoordinatesSpec.swift */; }; 249EFE841E64FB4C00165E39 /* MCSwiftLayout.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249EFE7A1E64FB4C00165E39 /* MCSwiftLayout.framework */; }; 249EFE891E64FB4C00165E39 /* MCSwiftLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249EFE881E64FB4C00165E39 /* MCSwiftLayoutTests.swift */; }; 249EFE8B1E64FB4C00165E39 /* MCSwiftLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 249EFE7D1E64FB4C00165E39 /* MCSwiftLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -27,7 +28,8 @@ /* Begin PBXFileReference section */ 2439CC301E6659FA003326FB /* Layout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Layout.swift; sourceTree = ""; }; - 246D36471E6C46F50050F202 /* BasicTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicTests.swift; sourceTree = ""; }; + 2469C4FB1E74855D00073BEE /* PinEdgeCoordinateSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinEdgeCoordinateSpec.swift; sourceTree = ""; }; + 246D36471E6C46F50050F202 /* PinPointCoordinatesSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinPointCoordinatesSpec.swift; sourceTree = ""; }; 249EFE7A1E64FB4C00165E39 /* MCSwiftLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MCSwiftLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 249EFE7D1E64FB4C00165E39 /* MCSwiftLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCSwiftLayout.h; sourceTree = ""; }; 249EFE7E1E64FB4C00165E39 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -101,7 +103,8 @@ isa = PBXGroup; children = ( 249EFE881E64FB4C00165E39 /* MCSwiftLayoutTests.swift */, - 246D36471E6C46F50050F202 /* BasicTests.swift */, + 246D36471E6C46F50050F202 /* PinPointCoordinatesSpec.swift */, + 2469C4FB1E74855D00073BEE /* PinEdgeCoordinateSpec.swift */, 249EFE8A1E64FB4C00165E39 /* Info.plist */, ); path = MCSwiftLayoutTests; @@ -288,7 +291,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 246D36481E6C46F50050F202 /* BasicTests.swift in Sources */, + 2469C4FC1E74855D00073BEE /* PinEdgeCoordinateSpec.swift in Sources */, + 246D36481E6C46F50050F202 /* PinPointCoordinatesSpec.swift in Sources */, 249EFE891E64FB4C00165E39 /* MCSwiftLayoutTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MCSwiftLayout/Layout.swift b/MCSwiftLayout/Layout.swift index f9e0ade6..c1fe725f 100644 --- a/MCSwiftLayout/Layout.swift +++ b/MCSwiftLayout/Layout.swift @@ -11,19 +11,23 @@ import UIKit QUESTIONS: =============================================== - - Names: - - layout.topLeft(.bottomRight, of: backgroundView) - - layout.topLeft(to: .bottomRight, of: backgroundView) - - layout.topLeft(of: backgroundView, .bottomRight) - - layout.topLeft(backgroundView, .bottomRight) - - layout.topLeft(equal: backgroundView, .bottomRight) - - layout.snapTopLeft(.bottomRight, of: backgroundView) - - layout.snapTopLeft(to: .bottomRight, of: backgroundView) - - layout.snapTopLeft(to: backgroundView, .bottomRight) - - layout.snapTop(to: .bottom, of: backgroundView) + - Names: + - view.layout.pinTopLeft(.bottomRight, of: backgroundView).margin(10) + - view.layout.pinTopLeft(to: .bottomRight, of: backgroundView).margin(10) + - view.layout.pinTopLeft(to: backgroundView, .bottomRight).margin(10) + - view.layout.pinTopLeft(backgroundView, .bottomRight).margin(10) + - view.layout.pinTopLeft(equal: backgroundView, .bottomRight).margin(10) + + - view.pin.topLeft(to: .bottomRight, of: backgroundView).margin(10) + - view.pin.topLeft(.bottomRight, of: backgroundView).margin(10) + + - view.layout.snapTopLeft(.bottomRight, of: backgroundView) + - view.layout.snapTopLeft(to: .bottomRight, of: backgroundView).margin(10) + - view.layout.snapTopLeft(to: backgroundView, .bottomRight).margin(10) + - view.layout.snapTop(to: .bottom, of: backgroundView).margin(10) - - layout.pinTopLeft(to: backgroundView, .bottomRight) + - layout.snapTopLeft(to: backgroundView, .bottomRight) - layout.top(to: .bottom, of: backgroundView) @@ -41,6 +45,11 @@ import UIKit - Implement Layout + Layout operator + - left(of), above(of), below(of), ... devrait fonctionner même si les des view n'ont pas le même parent! + comme pour pinTopLeft(of), ... + + - width(percentage: CGFloat, of view: UIView) + - maxWidth(), minWidth(), maxHeight(), minHeight() - marginHorizontal - marginVertical @@ -230,7 +239,7 @@ public class Layout { fileprivate var bottomInset: CGFloat? fileprivate var rightInset: CGFloat? - public init (view: UIView/*? = nil*/) { + public init (view: UIView) { self.view = view } @@ -239,7 +248,7 @@ public class Layout { } // - // top, left, bottom, right, topLeft, topCenter, topRight, ... + // top, left, bottom, right // @discardableResult public func top(_ value: CGFloat) -> Layout { @@ -247,57 +256,79 @@ public class Layout { return self } - // TODO: IMplementent this @discardableResult - public func top(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { - return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + public func left(_ value: CGFloat) -> Layout { + setLeft(value, context: { return "left(\(value))" }) + return self } @discardableResult - public func left(_ value: CGFloat) -> Layout { - setLeft(value, context: { return "left(\(value))" }) + public func bottom(_ value: CGFloat) -> Layout { + setBottom(value, context: { return "bottom(\(value))" }) return self } - // TODO: IMplementent this @discardableResult - public func left(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { - return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + public func right(_ value: CGFloat) -> Layout { + setRight(value, context: { return "right(\(value))" }) + return self } + + // + // pinTop, pinLeft, pinBottom, pinRight + // @discardableResult - public func bottom(_ value: CGFloat) -> Layout { - setBottom(value, context: { return "bottom(\(value))" }) + public func pinTop(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { + func context() -> String { return "pinTop(\(edge.rawValue), of: \(view))" } + if let coordinate = computeCoordinates(forEdge: edge, of: relativeView, context: context) { + setTop(coordinate, context: context) + } return self } - // TODO: IMplementent this @discardableResult - public func bottom(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { - return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + public func pinLeft(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { + func context() -> String { return "pinLeft(\(edge.rawValue), of: \(view))" } + if let coordinate = computeCoordinates(forEdge: edge, of: relativeView, context: context) { + setLeft(coordinate, context: context) + } + return self } + @discardableResult - public func right(_ value: CGFloat) -> Layout { - setRight(value, context: { return "right(\(value))" }) + public func pinBottom(_ edge: VerticalEdge, of relativeView: UIView) -> Layout { + func context() -> String { return "pinBottom(\(edge.rawValue), of: \(view))" } + if let coordinate = computeCoordinates(forEdge: edge, of: relativeView, context: context) { + setBottom(coordinate, context: context) + } return self } - // TODO: IMplementent this @discardableResult - public func right(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { - return self// setLeftCoordinate(point.x, context: context) setTop TopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) + public func pinRight(_ edge: HorizontalEdge, of relativeView: UIView) -> Layout { + func context() -> String { return "pinRight(\(edge.rawValue), of: \(view))" } + if let coordinate = computeCoordinates(forEdge: edge, of: relativeView, context: context) { + setRight(coordinate, context: context) + } + return self } //TODO: Add hCenter and vCenter + // + // pinTopLeft, pinTopCenter, pinTopRight, + // pinLeftCenter, pinCenter, pinRightCenter, + // pinBottomLeft, pinBottomCenter, pinBottomRight, + // @discardableResult - public func topLeft(_ point: CGPoint) -> Layout { + public func pinTopLeft(to point: CGPoint) -> Layout { return setTopLeft(point, context: { return "topLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the topLeft on the specified view's pin. @discardableResult - public func topLeft(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinTopLeft(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "topLeft(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setTopLeft(coordinates, context: context) @@ -307,7 +338,7 @@ public class Layout { /// Position on the topLeft corner of the specified view. @discardableResult - public func topLeft(of relativeView: UIView) -> Layout { + public func pinTopLeft(to relativeView: UIView) -> Layout { func context() -> String { return "topLeft(of: \(view))" } if let coordinates = computeCoordinates(forPin: .topLeft, of: relativeView, context: context) { setTopLeft(coordinates, context: context) @@ -317,22 +348,24 @@ public class Layout { /// Position on the topLeft corner of its parent. @discardableResult - public func topLeft() -> Layout { + public func pinTopLeft() -> Layout { func context() -> String { return "topLeft()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setTopLeft(layoutSuperview.topLeft, context: context) + if let coordinates = computeCoordinates(forPin: .topLeft, of: layoutSuperview, context: context) { + setTopLeft(coordinates, context: context) + } } return self } @discardableResult - public func topCenter(_ point: CGPoint) -> Layout { + public func pinTopCenter(to point: CGPoint) -> Layout { return setTopCenter(point, context: { return "topCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the topCenter on the specified view's pin. @discardableResult - public func topCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinTopCenter(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "topCenter(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setTopCenter(coordinates, context: context) @@ -342,7 +375,7 @@ public class Layout { /// Position on the topCenter corner of the specified view. @discardableResult - public func topCenter(of relativeView: UIView) -> Layout { + public func pinTopCenter(to relativeView: UIView) -> Layout { func context() -> String { return "topCenter(of: \(view))" } if let coordinates = computeCoordinates(forPin: .topCenter, of: relativeView, context: context) { setTopCenter(coordinates, context: context) @@ -352,23 +385,24 @@ public class Layout { /// Position on the topCenter corner of its parent. @discardableResult - public func topCenter() -> Layout { + public func pinTopCenter() -> Layout { func context() -> String { return "topCenter()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setTopCenter(layoutSuperview.topCenter, context: context) + if let coordinates = computeCoordinates(forPin: .topCenter, of: layoutSuperview, context: context) { + setTopCenter(coordinates, context: context) + } } return self } - @discardableResult - public func topRight(_ point: CGPoint) -> Layout { + public func pinTopRight(to point: CGPoint) -> Layout { return setTopRight(point, context: { return "topRight(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the topRight on the specified view's pin. @discardableResult - public func topRight(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinTopRight(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "topRight(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setTopRight(coordinates, context: context) @@ -378,7 +412,7 @@ public class Layout { /// Position on the topRight corner of the specified view. @discardableResult - public func topRight(of relativeView: UIView) -> Layout { + public func pinTopRight(to relativeView: UIView) -> Layout { func context() -> String { return "topRight(of: \(view))" } if let coordinates = computeCoordinates(forPin: .topRight, of: relativeView, context: context) { setTopRight(coordinates, context: context) @@ -388,22 +422,24 @@ public class Layout { /// Position on the topRight corner of its parent. @discardableResult - public func topRight() -> Layout { + public func pinTopRight() -> Layout { func context() -> String { return "topRight()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setTopRight(layoutSuperview.topRight, context: context) + if let coordinates = computeCoordinates(forPin: .topRight, of: layoutSuperview, context: context) { + setTopRight(coordinates, context: context) + } } return self } @discardableResult - public func leftCenter(_ point: CGPoint) -> Layout { + public func pinLeftCenter(to point: CGPoint) -> Layout { return setLeftCenter(point, context: { return "leftCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the leftCenter on the specified view's pin. @discardableResult - public func leftCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinLeftCenter(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "leftCenter(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setLeftCenter(coordinates, context: context) @@ -413,7 +449,7 @@ public class Layout { /// Position on the leftCenter corner of the specified view. @discardableResult - public func leftCenter(of relativeView: UIView) -> Layout { + public func pinLeftCenter(to relativeView: UIView) -> Layout { func context() -> String { return "leftCenter(of: \(view))" } if let coordinates = computeCoordinates(forPin: .leftCenter, of: relativeView, context: context) { setLeftCenter(coordinates, context: context) @@ -423,22 +459,24 @@ public class Layout { /// Position on the leftCenter corner of its parent. @discardableResult - public func leftCenter() -> Layout { + public func pinLeftCenter() -> Layout { func context() -> String { return "leftCenter()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setLeftCenter(layoutSuperview.leftCenter, context: context) + if let coordinates = computeCoordinates(forPin: .leftCenter, of: layoutSuperview, context: context) { + setLeftCenter(coordinates, context: context) + } } return self } @discardableResult - public func center(_ point: CGPoint) -> Layout { + public func pinCenter(to point: CGPoint) -> Layout { return setCenter(point, context: { return "centers(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the centers on the specified view's pin. @discardableResult - public func center(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinCenter(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "centers(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setCenter(coordinates, context: context) @@ -447,7 +485,7 @@ public class Layout { } @discardableResult - public func center(of relativeView: UIView) -> Layout { + public func pinCenter(to relativeView: UIView) -> Layout { func context() -> String { return "centers(of: \(view))" } if let coordinates = computeCoordinates(forPin: Pin.center, of: relativeView, context: context) { setCenter(coordinates, context: context) @@ -456,22 +494,24 @@ public class Layout { } @discardableResult - public func center() -> Layout { + public func pinCenter() -> Layout { func context() -> String { return "center()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setCenter(layoutSuperview.center, context: context) + if let coordinates = computeCoordinates(forPin: .center, of: layoutSuperview, context: context) { + setCenter(coordinates, context: context) + } } return self } @discardableResult - public func rightCenter(_ point: CGPoint) -> Layout { + public func pinRightCenter(to point: CGPoint) -> Layout { return setRightCenter(point, context: { return "rightCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the rightCenter on the specified view's pin. @discardableResult - public func rightCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinRightCenter(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "rightCenter(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setRightCenter(coordinates, context: context) @@ -481,7 +521,7 @@ public class Layout { /// Position on the rightCenter corner of the specified view. @discardableResult - public func rightCenter(of relativeView: UIView) -> Layout { + public func pinRightCenter(to relativeView: UIView) -> Layout { func context() -> String { return "rightCenter(of: \(view))" } if let coordinates = computeCoordinates(forPin: .rightCenter, of: relativeView, context: context) { setRightCenter(coordinates, context: context) @@ -491,22 +531,24 @@ public class Layout { /// Position on the rightCenter corner of its parent. @discardableResult - public func rightCenter() -> Layout { + public func pinRightCenter() -> Layout { func context() -> String { return "rightCenter()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setRightCenter(layoutSuperview.rightCenter, context: context) + if let coordinates = computeCoordinates(forPin: .rightCenter, of: layoutSuperview, context: context) { + setRightCenter(coordinates, context: context) + } } return self } @discardableResult - public func bottomLeft(_ point: CGPoint) -> Layout { + public func pinBottomLeft(to point: CGPoint) -> Layout { return setBottomLeft(point, context: { return "bottomLeft(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the bottomLeft on the specified view's pin. @discardableResult - public func bottomLeft(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinBottomLeft(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "bottomLeft(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setBottomLeft(coordinates, context: context) @@ -516,7 +558,7 @@ public class Layout { /// Position on the bottomLeft corner of the specified view. @discardableResult - public func bottomLeft(of relativeView: UIView) -> Layout { + public func pinBottomLeft(to relativeView: UIView) -> Layout { func context() -> String { return "bottomLeft(of: \(view))" } if let coordinates = computeCoordinates(forPin: Pin.bottomLeft, of: relativeView, context: context) { setBottomLeft(coordinates, context: context) @@ -526,22 +568,24 @@ public class Layout { /// Position on the bottomLeft corner of its parent. @discardableResult - public func bottomLeft() -> Layout { + public func pinBottomLeft() -> Layout { func context() -> String { return "bottomLeft()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setBottomLeft(layoutSuperview.bottomLeft, context: context) + if let coordinates = computeCoordinates(forPin: .bottomLeft, of: layoutSuperview, context: context) { + setBottomLeft(coordinates, context: context) + } } return self } @discardableResult - public func bottomCenter(_ point: CGPoint) -> Layout { + public func pinBottomCenter(to point: CGPoint) -> Layout { return setBottomCenter(point, context: { return "bottomCenter(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the bottomCenter on the specified view's pin. @discardableResult - public func bottomCenter(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinBottomCenter(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "bottomCenter(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setBottomCenter(coordinates, context: context) @@ -551,7 +595,7 @@ public class Layout { /// Position on the bottomCenter corner of the specified view. @discardableResult - public func bottomCenter(of relativeView: UIView) -> Layout { + public func pinBottomCenter(to relativeView: UIView) -> Layout { func context() -> String { return "bottomCenter(of: \(view))" } if let coordinates = computeCoordinates(forPin: Pin.bottomCenter, of: relativeView, context: context) { setBottomCenter(coordinates, context: context) @@ -561,22 +605,24 @@ public class Layout { /// Position on the bottomCenter corner of its parent. @discardableResult - public func bottomCenter() -> Layout { + public func pinBottomCenter() -> Layout { func context() -> String { return "bottomCenter()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setBottomCenter(layoutSuperview.bottomCenter, context: context) + if let coordinates = computeCoordinates(forPin: .bottomCenter, of: layoutSuperview, context: context) { + setBottomCenter(coordinates, context: context) + } } return self } @discardableResult - public func bottomRight(_ point: CGPoint) -> Layout { + public func pinBottomRight(to point: CGPoint) -> Layout { return setBottomRight(point, context: { return "bottomRight(CGPoint(x: \(point.x), y: \(point.y)))" }) } /// Position the bottomRight on the specified view's pin. @discardableResult - public func bottomRight(_ pin: Pin, of relativeView: UIView) -> Layout { + public func pinBottomRight(_ pin: Pin, of relativeView: UIView) -> Layout { func context() -> String { return "bottomRight(\(pin.rawValue), of: \(view))" } if let coordinates = computeCoordinates(forPin: pin, of: relativeView, context: context) { setBottomRight(coordinates, context: context) @@ -586,7 +632,7 @@ public class Layout { /// Position on the bottomRight corner of the specified view. @discardableResult - public func bottomRight(of relativeView: UIView) -> Layout { + public func pinBottomRight(to relativeView: UIView) -> Layout { func context() -> String { return "bottomRight(of: \(view))" } if let coordinates = computeCoordinates(forPin: .bottomRight, of: relativeView, context: context) { setBottomRight(coordinates, context: context) @@ -596,10 +642,12 @@ public class Layout { /// Position on the bottomRight corner of its parent. @discardableResult - public func bottomRight() -> Layout { + public func pinBottomRight() -> Layout { func context() -> String { return "bottomRight()" } if let layoutSuperview = validateLayoutSuperview(context: context) { - setBottomRight(layoutSuperview.bottomRight, context: context) + if let coordinates = computeCoordinates(forPin: .bottomRight, of: layoutSuperview, context: context) { + setBottomRight(coordinates, context: context) + } } return self } @@ -617,6 +665,7 @@ public class Layout { case bottom } + /// Set the view's bottom coordinate above of the specified view. @discardableResult public func above(of view: UIView) -> Layout { setBottom(view.top, context: { return "above(of: \(view))" }) @@ -631,6 +680,7 @@ public class Layout { } } + /// Set the view's top coordinate below of the specified view. @discardableResult public func below(of view: UIView) -> Layout { setTop(view.bottom, context: { return "below(of: \(view))" }) @@ -646,6 +696,7 @@ public class Layout { } } + /// Set the view's right coordinate left of the specified view. @discardableResult public func left(of view: UIView) -> Layout { setRight(view.left, context: { return "left(of: \(view))" }) @@ -661,6 +712,7 @@ public class Layout { } } + /// Set the view's left coordinate right of the specified view. @discardableResult public func right(of view: UIView) -> Layout { setLeft(view.right, context: { return "right(of: \(view))" }) @@ -1218,10 +1270,10 @@ extension Layout { guard let layoutSuperview = validateLayoutSuperview(context: context) else { return nil } guard let relativeSuperview = relativeView.superview else { warn("relative view's superview is nil", context: context); return nil } - return computeCoordinates(point: pointForPin(pin, of: relativeView), layoutSuperview, relativeView, relativeSuperview) + return computeCoordinates(point(forPin: pin, of: relativeView), layoutSuperview, relativeView, relativeSuperview) } - fileprivate func computeCoordinates(point: CGPoint, _ layoutSuperview: UIView, _ relativeView: UIView, _ relativeSuperview: UIView) -> CGPoint { + fileprivate func computeCoordinates(_ point: CGPoint, _ layoutSuperview: UIView, _ relativeView: UIView, _ relativeSuperview: UIView) -> CGPoint { if layoutSuperview == relativeSuperview { return point // same parent => no coordinates conversion required. } else { @@ -1229,16 +1281,7 @@ extension Layout { } } - fileprivate func validateLayoutSuperview(context: Context) -> UIView? { - if let parentView = view.superview { - return parentView - } else { - warn("Layout's view must be added to a UIView before being layouted using this method.", context: context) - return nil - } - } - - fileprivate func pointForPin(_ pin: Pin, of view: UIView) -> CGPoint { + fileprivate func point(forPin pin: Pin, of view: UIView) -> CGPoint { switch pin { case .topLeft: return view.topLeft case .topCenter: return view.topCenter @@ -1252,6 +1295,43 @@ extension Layout { } } + fileprivate func computeCoordinates(forEdge edge: VerticalEdge, of relativeView: UIView, context: Context) -> CGFloat? { + guard let layoutSuperview = validateLayoutSuperview(context: context) else { return nil } + guard let relativeSuperview = relativeView.superview else { warn("relative view's superview is nil", context: context); return nil } + + return computeCoordinates(coordinate(forEdge: edge, of: relativeView), layoutSuperview, relativeView, relativeSuperview).y + } + + fileprivate func coordinate(forEdge edge: VerticalEdge, of view: UIView) -> CGPoint { + switch edge { + case .top: return CGPoint(x: 0, y: view.top) + case .bottom: return CGPoint(x: 0, y: view.bottom) + } + } + + fileprivate func computeCoordinates(forEdge edge: HorizontalEdge, of relativeView: UIView, context: Context) -> CGFloat? { + guard let layoutSuperview = validateLayoutSuperview(context: context) else { return nil } + guard let relativeSuperview = relativeView.superview else { warn("relative view's superview is nil", context: context); return nil } + + return computeCoordinates(coordinate(forEdge: edge, of: relativeView), layoutSuperview, relativeView, relativeSuperview).x + } + + fileprivate func coordinate(forEdge edge: HorizontalEdge, of view: UIView) -> CGPoint { + switch edge { + case .left: return CGPoint(x: view.left, y: 0) + case .right: return CGPoint(x: view.right, y: 0) + } + } + + fileprivate func validateLayoutSuperview(context: Context) -> UIView? { + if let parentView = view.superview { + return parentView + } else { + warn("Layout's view must be added to a UIView before being layouted using this method.", context: context) + return nil + } + } + fileprivate func applyMarginsAndInsets(top: CGFloat) -> CGFloat { return top + (topMargin ?? 0) + (topInset ?? 0) } diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/ChainedLayoutView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/ChainedLayoutView.swift index e211db32..38928b22 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/ChainedLayoutView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/ChainedLayoutView.swift @@ -75,13 +75,13 @@ class ChainedLayoutView: UIView { // topRightView.bottomRight = centerView.topRight //bottomLeftView.layout2.topLeft(centerView.bottomLeft).margins(10) - bottomLeftView.layout.topLeft(centerView.bottomLeft).height(50).topMargin(10).bottomMargin(10) - bottomCenterView.layout.topCenter(centerView.bottomCenter).height(50).topMargin(10).bottomMargin(10) - bottomRightView.layout.topRight(centerView.bottomRight).height(50).topMargin(10).bottomMargin(10) + bottomLeftView.layout.pinTopLeft(to: centerView.bottomLeft).height(50).topMargin(10).bottomMargin(10) + bottomCenterView.layout.pinCenter(to: centerView.bottomCenter).height(50).topMargin(10).bottomMargin(10) + bottomRightView.layout.pinTopRight(to: centerView.bottomRight).height(50).topMargin(10).bottomMargin(10) - rightTopView.layout.topLeft(centerView.topRight).width(50).leftMargin(10).rightMargin(10) - rightCenterView.layout.leftCenter(centerView.rightCenter).height(50).leftMargin(10).rightMargin(10) - rightBottomView.layout.bottomLeft(centerView.bottomRight).height(50).leftMargin(10).rightMargin(10) + rightTopView.layout.pinTopLeft(to: centerView.topRight).width(50).leftMargin(10).rightMargin(10) + rightCenterView.layout.pinLeftCenter(to: centerView.rightCenter).height(50).leftMargin(10).rightMargin(10) + rightBottomView.layout.pinBottomLeft(to: centerView.bottomRight).height(50).leftMargin(10).rightMargin(10) // // leftTopView.topRight = centerView.topLeft diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift index 40818f6e..7ff022fc 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftRightView.swift @@ -94,10 +94,10 @@ class MarginsAndPaddingsLeftRightView: UIView { let leftPosition: CGFloat = 0 - contentScrollView.layout.topLeft(CGPoint(x: 0, y: 0)).width(width).height(height).topInset(64) + contentScrollView.layout.pinTopLeft().width(width).height(height).topInset(64) descriptionLabel.size = descriptionLabel.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude)) - descriptionLabel.layout.topLeft(CGPoint(x: leftPosition, y: 10)) + descriptionLabel.layout.pinTopLeft(to: CGPoint(x: leftPosition, y: 10)) // No margins let rightPosition: CGFloat = 70 diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftWidthView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftWidthView.swift index 9dd278ae..826c6223 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftWidthView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/MarginsAndPaddingsLeftWidthView.swift @@ -103,13 +103,13 @@ class MarginsAndPaddingsLeftWidthView: UIView { let leftPosition: CGFloat = 0 - contentScrollView.layout.topLeft(CGPoint(x: 0, y: 0)).width(width).height(height).topInset(64) + contentScrollView.layout.pinTopLeft().width(width).height(height).topInset(64) descriptionLabel.size = descriptionLabel.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude)) - descriptionLabel.layout.topLeft(CGPoint(x: leftPosition, y: 10)) + descriptionLabel.layout.pinTopLeft(to: CGPoint(x: leftPosition, y: 10)) // No margins - noMarginsNoPaddings.layout.topLeft(descriptionLabel.bottomLeft).topMargin(5) + noMarginsNoPaddings.layout.pinTopLeft(to: descriptionLabel.bottomLeft).topMargin(5) noMarginsLeftInsetView.layout.top(noMarginsNoPaddings.bottom).left(leftPosition).width(70).leftInset(10) noMarginsRightInsetView.layout.top(noMarginsLeftInsetView.bottom).left(leftPosition).width(70).rightInset(10) noMarginsLeftRightInsetView.layout.top(noMarginsRightInsetView.bottom).left(leftPosition).width(70).leftInset(10).rightInset(10) diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/RelativeView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/RelativeView.swift index 74fc844e..c58836d9 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/RelativeView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/RelativeView.swift @@ -69,7 +69,7 @@ class RelativeView: UIView { override func layoutSubviews() { super.layoutSubviews() - belowNavBarView.layout.topLeft(.zero).size(size).topInset(64) + belowNavBarView.layout.pinTopLeft().size(size).topInset(64) centerView.width = 200 centerView.height = 200 diff --git a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift index b738338c..44be6146 100644 --- a/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift +++ b/MCSwiftLayoutSample/MCSwiftLayoutSample/Test/BothEdgesSnapped/BothEdgesSnappedView.swift @@ -122,21 +122,64 @@ class BothEdgesSnappedView: UIView { bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) + // + // pin coordinate + // +// aViewChild.layout.pinTop(.top, of: aView) //CGRect(x: 10.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinTop(.top, of: bView) // CGRect(x: 10.0, y: 100.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinTop(.top, of: aViewChild) //CGRect(x: 40.0, y: -80.0, width: 60.0, height: 20.0) + +// aViewChild.layout.pinTop(.bottom, of: aView) //CGRect(x: 10.0, y: 60.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinTop(.bottom, of: bView) //CGRect(x: 10.0, y: 180.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinTop(.bottom, of: aViewChild) //CGRect(x: 40.0, y: -50.0, width: 60.0, height: 20.0) + +// aViewChild.layout.pinBottom(.top, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) +// aViewChild.layout.pinBottom(.top, of: bView) //CGRect(x: 10.0, y: 70.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinBottom(.top, of: aViewChild) //CGRect(x: 40.0, y: -100.0, width: 60.0, height: 20.0) +// +// aViewChild.layout.pinBottom(.bottom, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) +// aViewChild.layout.pinBottom(.bottom, of: bView) //CGRect(x: 10.0, y: 150.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinBottom(.bottom, of: aViewChild) //CGRect(x: 40.0, y: -70.0, width: 60.0, height: 20.0) + +// aViewChild.layout.pinLeft(.left, of: aView) //CGRect(x: 0.0, y: 20.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinLeft(.left, of: bView) //CGRect(x: 20.0, y: 20.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinLeft(.left, of: aViewChild) //CGRect(x: -10.0, y: 10.0, width: 60.0, height: 20.0) +// +// aViewChild.layout.pinLeft(.right, of: aView) //CGRect(x: 100.0, y: 20.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinLeft(.right, of: bView) //CGRect(x: 130.0, y: 20.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinLeft(.right, of: aViewChild) //CGRect(x: 40.0, y: 10.0, width: 60.0, height: 20.0) + +// aViewChild.layout.pinRight(.left, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) +// aViewChild.layout.pinRight(.left, of: bView) //CGRect(x: -30.0, y: 20.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinRight(.left, of: aViewChild) //CGRect(x: -70.0, y: 10.0, width: 60.0, height: 20.0) +// +// aViewChild.layout.pinRight(.right, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) +// aViewChild.layout.pinRight(.right, of: bView) //CGRect(x: 80.0, y: 20.0, width: 50.0, height: 30.0) +// bViewChild.layout.pinRight(.right, of: aViewChild) //CGRect(x: -20.0, y: 10.0, width: 60.0, height: 20.0) + + // + // pin point + // + // topLeft // aView.layout.topLeft() // CGRect(x: 0.0, y: 0.0, width: 100.0, height: 60.0) - aViewChild.layout.topLeft(.topLeft, of: aView) //(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) - aViewChild.layout.topLeft(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) -// aView.layout.topLe +// aViewChild.layout.pinTopLeft(.topLeft, of: aView) //(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinTopLeft(of: aView) // CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinTopLeft(of: aView).pinBottomRight() // aViewChild.layout.topLeft(of: bView) // CGRect(x: 20.0, y: 100.0, width: 50.0, height: 30.0) // bView.layout.topLeft(of: aViewChild) // CGRect(x: 150.0, y: 120.0, width: 110.0, height: 80.0) -// bViewChild.layout.topLeft(of: aViewChild) // CGRect(x: -10.0, y: -80.0, width: 60.0, height: 20.0) - - // topCenter -// aView.layout.topCenter() // CGRect(x: 150.0, y: 0.0, width: 100.0, height: 60.0) -// aViewChild.layout.topCenter(of: aView) //CGRect(x: 25.0, y: 0.0, width: 50.0, height: 30.0) -// aViewChild.layout.topCenter(of: bView) //CGRect(x: 50.0, y: 100.0, width: 50.0, height: 30.0) -// bView.layout.topCenter(of: aViewChild) //CGRect(x: 120.0, y: 120.0, width: 110.0, height: 80.0) -// bViewChild.layout.topCenter(of: aViewChild) //CGRect(x: -15.0, y: -80.0, width: 60.0, height: 20.0) +// bViewChild.layout.pinTopLeft(to: aViewChild)< // CGRect(x: -10.0, y: -80.0, width: 60.0, height: 20.0) + + +// bView.layout.pinBottomRight().pinTopLeft(to: .zero).below(of: bViewChild) + + + // pinTopCenter +// aView.layout.pinTopCenter() // CGRect(x: 150.0, y: 0.0, width: 100.0, height: 60.0) +// aViewChild.layout.pinTopCenter(of: aView) //CGRect(x: 25.0, y: 0.0, width: 50.0, height: 30.0) +// aViewChild.layout.pinTopCenter(of: bView) //CGRect(x: 50.0, y: 100.0, width: 50.0, height: 30.0) +// bView.layout.pinTopCenter(of: aViewChild) //CGRect(x: 120.0, y: 120.0, width: 110.0, height: 80.0) +// bViewChild.layout.pinTopCenter(of: aViewChild) //CGRect(x: -15.0, y: -80.0, width: 60.0, height: 20.0) // topRight // aView.layout.topRight() //CGRect(x: 300.0, y: 0.0, width: 100.0, height: 60.0) diff --git a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift index b1150691..340761b2 100644 --- a/MCSwiftLayoutTests/MCSwiftLayoutTests.swift +++ b/MCSwiftLayoutTests/MCSwiftLayoutTests.swift @@ -27,8 +27,8 @@ class MCSwiftLayoutTests: XCTestCase { let child1 = UIView() rootView.addSubview(child1) - child1.layout.center(of: rootView) - print("child1.frame: \(child1.frame)") +// child1.layout.pinCenter(of: rootView) +// print("child1.frame: \(child1.frame)") } func testPerformanceExample() { diff --git a/MCSwiftLayoutTests/PinEdgeCoordinateSpec.swift b/MCSwiftLayoutTests/PinEdgeCoordinateSpec.swift new file mode 100644 index 00000000..e2a462bc --- /dev/null +++ b/MCSwiftLayoutTests/PinEdgeCoordinateSpec.swift @@ -0,0 +1,157 @@ +// +// BasicTests.swift +// MCSwiftLayout +// +// Created by DION, Luc (MTL) on 2017-03-05. +// Copyright © 2017 mcswiftlayyout.mirego.com. All rights reserved. +// +import Quick +import Nimble +import MCSwiftLayout + +class PinEdgeCoordinateSpec: QuickSpec { + override func spec() { + var viewController: UIViewController! + var rootView: UIView! + + var aView: UIView! + var aViewChild: UIView! + + var bView: UIView! + var bViewChild: UIView! + + /* + root + | + - childLevel1 + | | + | - aViewChild + | + - bView + | + - bViewChild + */ + + beforeEach { + viewController = UIViewController() + + rootView = UIView() + rootView.frame = CGRect(x: 0, y: 0, width: 400, height: 400) + viewController.view.addSubview(rootView) + + aView = UIView() + aView.frame = CGRect(x: 140, y: 100, width: 100, height: 60) + rootView.addSubview(aView) + + aViewChild = UIView() + aViewChild.frame = CGRect(x: 10, y: 20, width: 50, height: 30) + aView.addSubview(aViewChild) + + bView = UIView() + bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) + rootView.addSubview(bView) + + bViewChild = UIView() + bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) + bView.addSubview(bViewChild) + } + + describe("the result of the pinTop(edge: VerticalEdge, of: UIView) method") { + it("should warns that the view is not added to any view") { + let unAttachedView = UIView(frame: CGRect(x: 10, y: 10, width: 10, height: 10)) + unAttachedView.layout.pinTop(.top, of: aView) + + expect(unAttachedView.frame).to(equal(CGRect(x: 10, y: 10, width: 10, height: 10))) + } + } + + + // aViewChild.layout.pinBottom(.top, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) + // aViewChild.layout.pinBottom(.top, of: bView) //CGRect(x: 10.0, y: 70.0, width: 50.0, height: 30.0) + // bViewChild.layout.pinBottom(.top, of: aViewChild) //CGRect(x: 40.0, y: -100.0, width: 60.0, height: 20.0) + // + // aViewChild.layout.pinBottom(.bottom, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) + // aViewChild.layout.pinBottom(.bottom, of: bView) //CGRect(x: 10.0, y: 150.0, width: 50.0, height: 30.0) + // bViewChild.layout.pinBottom(.bottom, of: aViewChild) //CGRect(x: 40.0, y: -70.0, width: 60.0, height: 20.0) + + // aViewChild.layout.pinRight(.left, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) + // aViewChild.layout.pinRight(.left, of: bView) //CGRect(x: -30.0, y: 20.0, width: 50.0, height: 30.0) + // bViewChild.layout.pinRight(.left, of: aViewChild) //CGRect(x: -70.0, y: 10.0, width: 60.0, height: 20.0) + // + // aViewChild.layout.pinRight(.right, of: aView) //CGRect(x: 140.0, y: 100.0, width: 100.0, height: 60.0) + // aViewChild.layout.pinRight(.right, of: bView) //CGRect(x: 80.0, y: 20.0, width: 50.0, height: 30.0) + // bViewChild.layout.pinRight(.right, of: aViewChild) //CGRect(x: -20.0, y: 10.0, width: 60.0, height: 20.0) + + // + // pinTop + // + describe("the result of the pinTop(edge: VerticalEdge, of: UIView)") { + + it("should position the aViewChild's top edge on its parent's top edge") { + aViewChild.layout.pinTop(.top, of: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 10.0, y: 0.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's top edge on its parent sibling (bView)'s top edge") { + aViewChild.layout.pinTop(.top, of: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 10.0, y: 100.0, width: 50.0, height: 30.0))) + } + + it("should position the bViewChild's top edge on its sibling's children (aViewChild)'s top edge") { + bViewChild.layout.pinTop(.top, of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: 40.0, y: -80.0, width: 60.0, height: 20.0))) + } + + it("should position the aViewChild's top edge on its parent's bottom edge") { + aViewChild.layout.pinTop(.bottom, of: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 10.0, y: 60.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's top edge on its parent sibling (bView)'s bottom edge") { + aViewChild.layout.pinTop(.bottom, of: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 10.0, y: 180.0, width: 50.0, height: 30.0))) + } + + it("should position the bViewChild's top edge on its sibling's children (aViewChild)'s bottom edge") { + bViewChild.layout.pinTop(.bottom, of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: 40.0, y: -50.0, width: 60.0, height: 20.0))) + } + } + + // + // pinLeft + // + describe("the result of the pinLeft(edge: VerticalEdge, of: UIView)") { + + it("should position the aViewChild's left edge on its parent's left edge") { + aViewChild.layout.pinLeft(.left, of: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 0.0, y: 20.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's left edge on its parent sibling (bView)'s left edge") { + aViewChild.layout.pinLeft(.left, of: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 20.0, y: 20.0, width: 50.0, height: 30.0))) + } + + it("should position the bViewChild's left edge on its sibling's children (aViewChild)'s left edge") { + bViewChild.layout.pinLeft(.left, of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: -10.0, y: 10.0, width: 60.0, height: 20.0))) + } + + it("should position the aViewChild's left edge on its parent's right edge") { + aViewChild.layout.pinLeft(.right, of: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 100.0, y: 20.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's left edge on its parent sibling (bView)'s right edge") { + aViewChild.layout.pinLeft(.right, of: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 130.0, y: 20.0, width: 50.0, height: 30.0))) + } + + it("should position the bViewChild's left edge on its sibling's children (aViewChild)'s right edge") { + bViewChild.layout.pinLeft(.right, of: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: 40.0, y: 10.0, width: 60.0, height: 20.0))) + } + } + } +} diff --git a/MCSwiftLayoutTests/BasicTests.swift b/MCSwiftLayoutTests/PinPointCoordinatesSpec.swift similarity index 55% rename from MCSwiftLayoutTests/BasicTests.swift rename to MCSwiftLayoutTests/PinPointCoordinatesSpec.swift index 464753f0..cadae115 100644 --- a/MCSwiftLayoutTests/BasicTests.swift +++ b/MCSwiftLayoutTests/PinPointCoordinatesSpec.swift @@ -9,7 +9,7 @@ import Quick import Nimble import MCSwiftLayout -class BasicTestsSpec: QuickSpec { +class PinPointCoordinatesSpec: QuickSpec { override func spec() { var viewController: UIViewController! var rootView: UIView! @@ -59,7 +59,7 @@ class BasicTestsSpec: QuickSpec { describe("the result of the centers(of: UIView) method") { it("should warns that the view is not added to any view") { let unAttachedView = UIView(frame: CGRect(x: 10, y: 10, width: 10, height: 10)) - unAttachedView.layout.center(of: rootView) + unAttachedView.layout.pinCenter(to: rootView) expect(unAttachedView.frame).to(equal(CGRect(x: 10, y: 10, width: 10, height: 10))) } @@ -70,74 +70,78 @@ class BasicTestsSpec: QuickSpec { // describe("the result of the topLeft() and topLeft(of: UIView) methods") { -// TODO: Tester topLeft(CGPoint())!!! + it("should position the aView's topLeft corner at the specified position") { + aView.layout.pinTopLeft(to: CGPoint(x: 25, y: 25)) + expect(aView.frame).to(equal(CGRect(x: 25.0, y: 25.0, width: 100.0, height: 60.0))) + } it("should position the aView's topLeft corner on its parent's topLeft corner") { - aView.layout.topLeft() + aView.layout.pinTopLeft() expect(aView.frame).to(equal(CGRect(x: 0.0, y: 0.0, width: 100.0, height: 60.0))) } it("should position the aViewChild's topLeft corner on the specified view's topLeft corner") { -// aViewChild.layout.topLeft(of: aView) -// aViewChild.layout.topLeft(Snap.topLeft, of: aView) - aViewChild.layout.topLeft(Pin.topLeft, of: aView) + aViewChild.layout.pinTopLeft(Pin.topLeft, of: aView) expect(aViewChild.frame).to(equal(CGRect(x: 0.0, y: 0.0, width: 50.0, height: 30.0))) } it("should position the aViewChild's topLeft corner on its parent sibling (bView)'s topLeft corner") { - aViewChild.layout.topLeft(of: bView) + aViewChild.layout.pinTopLeft(to: bView) expect(aViewChild.frame).to(equal(CGRect(x: 20.0, y: 100.0, width: 50.0, height: 30.0))) } it("should position the bView's topLeft corner on its sibling's (aView) children (aViewChild)'s topLeft corner") { - bView.layout.topLeft(of: aViewChild) + bView.layout.pinTopLeft(to: aViewChild) expect(bView.frame).to(equal(CGRect(x: 150.0, y: 120.0, width: 110.0, height: 80.0))) } it("should position the bViewChild's topLeft corner on its parent sibling's (aView) children (aViewChild)'s topLeft corner") { - bViewChild.layout.topLeft(of: aViewChild) + bViewChild.layout.pinTopLeft(to: aViewChild) expect(bViewChild.frame).to(equal(CGRect(x: -10.0, y: -80.0, width: 60.0, height: 20.0))) } + } + + // + // // + // // + // // + // // + // // + + // + // topCenter + // + describe("the result of the topCenter() and topCenter(of: UIView) methods") { - /*it("should centers the bView in the center of its sibling (aView) sub child (aViewChild)") { - aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - aViewChild.frame = CGRect(x: 10, y: 20, width: 20, height: 40) - bView.frame = CGRect(x: 10, y: 10, width: 30, height: 50) - - bView.layout.centers(of: aViewChild) - - expect(bView.frame).to(equal(CGRect(x: 15, y: 35, width: 30, height: 50))) + it("should position the aView's topCenter corner at the specified position") { + aView.layout.pinTopCenter(to: CGPoint(x: 100, y: 100)) + expect(aView.frame).to(equal(CGRect(x: 50.0, y: 100.0, width: 100.0, height: 60.0))) } - it("should centers the aViewChild in the center of bView") { - aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - aViewChild.frame = CGRect(x: 10, y: 20, width: 20, height: 40) - bView.frame = CGRect(x: 10, y: 10, width: 30, height: 50) - - aViewChild.layout.centers(of: bView) - - expect(aViewChild.frame).to(equal(CGRect(x: 5, y: -5, width: 20, height: 40))) + it("should position the aView's topCenter corner on its parent's topCenter corner") { + aView.layout.pinTopCenter() + expect(aView.frame).to(equal(CGRect(x: 150.0, y: 0.0, width: 100.0, height: 60.0))) } - it("should centers the bViewChild in the center of its parent's sibling (aView) sub child (aViewChild)") { - aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) - aViewChild.frame = CGRect(x: 10, y: 20, width: 30, height: 40) - bView.frame = CGRect(x: 10, y: 80, width: 30, height: 50) - bViewChild.frame = CGRect(x: 0, y: 0, width: 20, height: 10) - - bViewChild.layout.centers(of: aViewChild) - expect(bViewChild.frame).to(equal(CGRect(x: 15, y: -25, width: 20, height: 10))) - }*/ + it("should position the aViewChild's topCenter corner on the specified view's topCenter corner") { + aViewChild.layout.pinTopCenter(to: aView) + expect(aViewChild.frame).to(equal(CGRect(x: 25.0, y: 0.0, width: 50.0, height: 30.0))) + } + + it("should position the aViewChild's topCenter corner on its parent sibling (bView)'s topCenter corner") { + aViewChild.layout.pinTopCenter(to: bView) + expect(aViewChild.frame).to(equal(CGRect(x: 50.0, y: 100.0, width: 50.0, height: 30.0))) + } + + it("should position the bView's topCenter corner on its sibling's (aView) children (aViewChild)'s topCenter corner") { + bView.layout.pinTopCenter(to: aViewChild) + expect(bView.frame).to(equal(CGRect(x: 120.0, y: 120.0, width: 110.0, height: 80.0))) + } + + it("should position the bViewChild's topCenter corner on its parent sibling's (aView) children (aViewChild)'s topCenter corner") { + bViewChild.layout.pinTopCenter(to: aViewChild) + expect(bViewChild.frame).to(equal(CGRect(x: -15.0, y: -80.0, width: 60.0, height: 20.0))) + } } - -// describe("the result of the centers() method") { -// it("should centers the aView in the center of its parent") { -// aView.frame = CGRect(x: 10, y: 20, width: 40, height: 60) -// -// aView.layout.centers() -// -// expect(aView.frame).to(equal(CGRect(x: 30, y: 20, width: 40, height: 60))) -// } -// } } }