From 3a49bff32e46d4ef78ef36f5b401e9869ce4e0ce Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Wed, 15 Nov 2017 19:31:52 -0500 Subject: [PATCH 1/8] Add methods fitWidth(), fitHeight(), fitWidthHard(), fitHeightHard(), fitSizeHard() * **`fitWidth()`** The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: * The resulting width will never be bigger than the reference width, but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. * If margin rules applies, margins will be applied when determining the reference width. * **`fitWidthHard()`** Similar to `fitWidth()`, except that the resulting width will **always match the reference width**. * **`fitHeight()`** The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: * The resulting height will always match the reference height. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. * If margin rules applies, margins will be applied when determining the reference height. * **`fitHeightHard()`** Similar to `fitHeight()`, except that the resulting height will **always match the reference width**. * **`fitSize()`** The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. If the **width** has been pinned => the method **adjust the view's height** based on this width. If the **height** has been pinned => the method **adjust the view's width** based on this height. If the **width and the height** have been pinned => the method **adjust the view's size** based on both values. Notes: * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. * If margin rules applies, margins will be applied when determining the reference width/height. * **`fitSizeHard()`** Similar to `fitSize()`, except that the resulting width/height will **always match the pinned width/height**.. --- .gitignore | 4 +- .../AdjustToContainerView.swift | 6 +- .../CollectionViewExample/HouseCell.swift | 7 +- .../UI/Examples/Intro/IntroView.swift | 2 +- .../IntroObjectiveC/IntroObjectiveCView.m | 2 +- .../UI/Examples/IntroRTL/IntroRTLView.swift | 2 +- .../TableViewExample/Cells/MethodCell.swift | 4 +- .../Cells/MethodGroupHeader.swift | 2 +- Gemfile | 4 +- Gemfile.lock | 33 ++-- PinLayout.xcodeproj/project.pbxproj | 4 - README.md | 70 ++++++-- Sources/ObjectiveC/PinLayoutObjC.swift | 5 + Sources/ObjectiveC/PinLayoutObjCImpl.swift | 25 +++ Sources/PinLayout.swift | 131 ++++++++++++++- Sources/PinLayoutImpl.swift | 124 ++++++++++---- Sources/TypesImpl.swift | 16 ++ Tests/AccurencyTests.swift | 154 ------------------ Tests/AdjustSizeSpec.swift | 138 +++++++++++++++- Tests/AspectRatioTests.swift | 2 +- Tests/MinMaxWidthHeightSpec.swift | 24 +++ fastlane/Fastfile | 4 + 22 files changed, 520 insertions(+), 243 deletions(-) delete mode 100644 Tests/AccurencyTests.swift diff --git a/.gitignore b/.gitignore index 11839257..1019931c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ build/ xcuserdata data/ -Pods/ \ No newline at end of file +Pods/ + +docs/1.2 \ No newline at end of file diff --git a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift index 862164f5..9042f267 100644 --- a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift +++ b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift @@ -46,8 +46,8 @@ class AdjustToContainerView: BaseView { // Layout the contentView using the view's safeArea. contentView.pin.all().margin(safeArea) - languageSelectorView.pin.top().left().right().fitSize() - swiftOpinionSelectorView.pin.below(of: languageSelectorView, aligned: .left).right().marginTop(10).fitSize() - swiftUsageSelectorView.pin.below(of: swiftOpinionSelectorView, aligned: .left).right().marginTop(10).fitSize() + languageSelectorView.pin.top().left().right().fitWidth() + swiftOpinionSelectorView.pin.below(of: languageSelectorView, aligned: .left).right().marginTop(10).fitWidth() + swiftUsageSelectorView.pin.below(of: swiftOpinionSelectorView, aligned: .left).right().marginTop(10).fitWidth() } } diff --git a/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift b/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift index 32a07f06..e9b6fdda 100644 --- a/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift +++ b/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift @@ -65,6 +65,7 @@ class HouseCell: UICollectionViewCell { nameLabel.text = house.name priceLabel.text = house.price distanceLabel.text = "\(house.distance) KM" + distanceLabel.textAlignment = .right mainImage.download(url: house.mainImageURL) mainImage.contentMode = .scaleAspectFill @@ -79,13 +80,13 @@ class HouseCell: UICollectionViewCell { private func layout() { headerView.pin.top().horizontally().height(100) - nameLabel.pin.top().horizontally().margin(padding).fitSize() + nameLabel.pin.top().horizontally().margin(padding).fitWidth() mainImage.pin.below(of: nameLabel).horizontally().height(300).marginTop(padding) footerView.pin.below(of: mainImage).horizontally() - priceLabel.pin.top().horizontally().fitSize().margin(6, padding) - distanceLabel.pin.top().after(of: priceLabel).right().fitSize().justify(.right).margin(6, padding) + priceLabel.pin.top().horizontally().margin(6, padding).fitWidth() + distanceLabel.pin.top().after(of: priceLabel).right().margin(6, padding).fitWidthHard() footerView.pin.height(max(priceLabel.frame.maxY, distanceLabel.frame.maxY) + 6) contentView.pin.height(footerView.frame.maxY) diff --git a/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift b/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift index a67b0234..f9035186 100644 --- a/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift +++ b/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift @@ -64,7 +64,7 @@ class IntroView: BaseView { logo.pin.top().left().size(100).aspectRatio().marginTop(10) segmented.pin.after(of: logo, aligned: .top).right().marginLeft(10) - textLabel.pin.below(of: segmented, aligned: .left).width(of: segmented).pinEdges().marginTop(10).fitSize() + textLabel.pin.below(of: segmented, aligned: .left).width(of: segmented).pinEdges().marginTop(10).fitWidth() separatorView.pin.below(of: [logo, textLabel], aligned: .left).right(to: segmented.edge.right).marginTop(10) } } diff --git a/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m b/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m index af55f042..79ca9479 100644 --- a/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m +++ b/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m @@ -61,7 +61,7 @@ - (void) layoutSubviews { [[[[[[logo.pinObjc top] left] width:100] aspectRatio] marginWithTop:topLayoutGuide + 10 horizontal:10 bottom:10] layout]; [[[[segmented.pinObjc rightOf:logo aligned:VerticalAlignTop] right] marginHorizontal:10] layout]; - [[[[[[textLabel.pinObjc belowOf:segmented aligned:HorizontalAlignLeft] widthOf:segmented] pinEdges] marginTop:10] fitSize] layout]; + [[[[[[textLabel.pinObjc belowOf:segmented aligned:HorizontalAlignLeft] widthOf:segmented] pinEdges] marginTop:10] fitWidth] layout]; [[[[[separatorView.pinObjc belowOfViews:@[logo, textLabel] aligned:HorizontalAlignLeft] rightTo:segmented.edge.right] height:1] marginTop:10] layout]; } diff --git a/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift b/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift index 8238b435..fc9b9986 100644 --- a/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift +++ b/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift @@ -69,7 +69,7 @@ class IntroRTLView: BaseView { logo.pin.top().start().size(100).aspectRatio().marginTop(10) segmented.pin.after(of: logo, aligned: .top).end().marginStart(10) - textLabel.pin.below(of: segmented, aligned: .start).width(of: segmented).pinEdges().marginTop(10).fitSize() + textLabel.pin.below(of: segmented, aligned: .start).width(of: segmented).pinEdges().marginTop(10).fitWidth() separatorView.pin.below(of: [logo, textLabel], aligned: .start).end(to: segmented.edge.end).marginTop(10) } } diff --git a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift index c2815873..28d0575e 100644 --- a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift +++ b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift @@ -61,8 +61,8 @@ class MethodCell: UITableViewCell { fileprivate func layout() { iconImageView.pin.top().left().size(30).margin(margin) - nameLabel.pin.right(of: iconImageView, aligned: .center).right().marginHorizontal(margin).fitSize() - descriptionLabel.pin.below(of: [iconImageView, nameLabel]).left().right().margin(margin).fitSize() + nameLabel.pin.right(of: iconImageView, aligned: .center).right().marginHorizontal(margin).fitWidth() + descriptionLabel.pin.below(of: [iconImageView, nameLabel]).left().right().margin(margin).fitWidth() } override func sizeThatFits(_ size: CGSize) -> CGSize { diff --git a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift index 1177e5e6..d170789e 100644 --- a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift +++ b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift @@ -43,6 +43,6 @@ class MethodGroupHeader: UITableViewHeaderFooterView { override func layoutSubviews() { super.layoutSubviews() - titleLabel.pin.left().right().vCenter().margin(10).fitSize() + titleLabel.pin.left().right().vCenter().margin(10).fitWidth() } } diff --git a/Gemfile b/Gemfile index d64c3a0f..c9f11624 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' gem 'synx' gem 'cocoapods' -gem 'jazzy' -gem 'fastlane' \ No newline at end of file +gem 'jazzy', '0.9' +gem 'fastlane' diff --git a/Gemfile.lock b/Gemfile.lock index 32f42c25..43ccb34a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -66,7 +66,7 @@ GEM faraday_middleware (0.12.2) faraday (>= 0.7.4, < 1.0) fastimage (2.1.0) - fastlane (2.62.1) + fastlane (2.63.0) CFPropertyList (>= 2.3, < 3.0.0) addressable (>= 2.3, < 3.0.0) babosa (>= 1.0.2, < 2.0.0) @@ -124,14 +124,18 @@ GEM httpclient (2.8.3) i18n (0.9.0) concurrent-ruby (~> 1.0) - jazzy (0.0.14) - activesupport (~> 4.1) + jazzy (0.9.0) + cocoapods (~> 1.0) mustache (~> 0.99) - nokogiri (~> 1.6) + open4 redcarpet (~> 3.2) + rouge (~> 1.5) sass (~> 3.4) + sqlite3 (~> 1.3) + xcinvoke (~> 0.3.0) json (2.1.0) jwt (2.1.0) + liferaft (0.0.6) little-plugger (1.1.4) logging (2.2.2) little-plugger (~> 1.1) @@ -141,7 +145,6 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) mini_magick (4.5.1) - mini_portile2 (2.3.0) minitest (5.10.3) molinillo (0.5.7) multi_json (1.12.2) @@ -151,8 +154,7 @@ GEM nanaimo (0.2.3) nap (1.1.0) netrc (0.11.0) - nokogiri (1.8.1) - mini_portile2 (~> 2.3.0) + open4 (1.3.4) os (0.9.6) plist (3.3.0) public_suffix (2.0.5) @@ -165,10 +167,10 @@ GEM declarative-option (< 0.2.0) uber (< 0.2.0) retriable (3.1.1) - rouge (2.0.7) + rouge (1.11.1) ruby-macho (1.1.0) rubyzip (1.2.1) - sass (3.5.2) + sass (3.5.3) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) @@ -180,6 +182,7 @@ GEM jwt (>= 1.5, < 3.0) multi_json (~> 1.10) slack-notifier (1.5.1) + sqlite3 (1.3.13) synx (0.2.1) clamp (~> 0.6) colorize (~> 0.7) @@ -188,8 +191,8 @@ GEM terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) - tty-screen (0.5.0) - tzinfo (1.2.3) + tty-screen (0.5.1) + tzinfo (1.2.4) thread_safe (~> 0.1) uber (0.1.0) unf (0.1.4) @@ -197,13 +200,15 @@ GEM unf_ext (0.0.7.4) unicode-display_width (1.3.0) word_wrap (1.0.0) + xcinvoke (0.3.0) + liferaft (~> 0.0.6) xcodeproj (1.5.3) CFPropertyList (~> 2.3.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.2.3) - xcpretty (0.2.8) - rouge (~> 2.0.7) + xcpretty (0.2.6) + rouge (~> 1.8) xcpretty-travis-formatter (1.0.0) xcpretty (~> 0.2, >= 0.0.7) @@ -213,7 +218,7 @@ PLATFORMS DEPENDENCIES cocoapods fastlane - jazzy + jazzy (= 0.9) synx BUNDLED WITH diff --git a/PinLayout.xcodeproj/project.pbxproj b/PinLayout.xcodeproj/project.pbxproj index d474e646..0d0531f1 100644 --- a/PinLayout.xcodeproj/project.pbxproj +++ b/PinLayout.xcodeproj/project.pbxproj @@ -15,7 +15,6 @@ 242E8DC31EED5AB2005935FB /* RelativePositionMultipleViewsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 242E8DC11EED5982005935FB /* RelativePositionMultipleViewsSpec.swift */; }; 244C6E151E776A0C0074FC74 /* MarginsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244C6E141E776A0C0074FC74 /* MarginsSpec.swift */; }; 244DF3061EF46FC20090508B /* PinLayoutTVOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 244DF3041EF46FB90090508B /* PinLayoutTVOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 245302071ED05FD000E13F29 /* AccurencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 245302061ED05FD000E13F29 /* AccurencyTests.swift */; }; 2469C4FC1E74855D00073BEE /* PinEdgeCoordinateSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2469C4FB1E74855D00073BEE /* PinEdgeCoordinateSpec.swift */; }; 2469C5001E75D74000073BEE /* AdjustSizeSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2469C4FF1E75D74000073BEE /* AdjustSizeSpec.swift */; }; 2469C5021E75D88500073BEE /* BasicView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2469C5011E75D88500073BEE /* BasicView.swift */; }; @@ -89,7 +88,6 @@ 244DF2F81EF46C500090508B /* PinLayoutTVOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PinLayoutTVOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 244DF3011EF46F670090508B /* InfoTVOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = InfoTVOS.plist; path = Sources/InfoTVOS.plist; sourceTree = SOURCE_ROOT; }; 244DF3041EF46FB90090508B /* PinLayoutTVOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PinLayoutTVOS.h; path = Sources/PinLayoutTVOS.h; sourceTree = SOURCE_ROOT; }; - 245302061ED05FD000E13F29 /* AccurencyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccurencyTests.swift; sourceTree = ""; }; 2469C4FB1E74855D00073BEE /* PinEdgeCoordinateSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinEdgeCoordinateSpec.swift; sourceTree = ""; }; 2469C4FF1E75D74000073BEE /* AdjustSizeSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdjustSizeSpec.swift; sourceTree = ""; }; 2469C5011E75D88500073BEE /* BasicView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicView.swift; sourceTree = ""; }; @@ -206,7 +204,6 @@ children = ( 249EFE8A1E64FB4C00165E39 /* Info.plist */, 2469C5011E75D88500073BEE /* BasicView.swift */, - 245302061ED05FD000E13F29 /* AccurencyTests.swift */, 2469C4FF1E75D74000073BEE /* AdjustSizeSpec.swift */, 248E4C721F7A83FA00C0E7F7 /* AspectRatioTests.swift */, 240F88BC1F0C042500280FC8 /* JustifyAlignSpec.swift */, @@ -514,7 +511,6 @@ 242E8DC31EED5AB2005935FB /* RelativePositionMultipleViewsSpec.swift in Sources */, 2469C5041E75DB7600073BEE /* RectNimbleMatcher.swift in Sources */, 242723731F008BF7006A5C3A /* MinMaxWidthHeightSpec.swift in Sources */, - 245302071ED05FD000E13F29 /* AccurencyTests.swift in Sources */, 2469C4FC1E74855D00073BEE /* PinEdgeCoordinateSpec.swift in Sources */, 24D18D171F3B4381008129EF /* RTLSpec.swift in Sources */, 2469C5021E75D88500073BEE /* BasicView.swift in Sources */, diff --git a/README.md b/README.md index 23a504d7..e8b4a119 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ override func layoutSubviews() { logo.pin.top().left().size(100).aspectRatio().margin(10) segmented.pin.after(of: logo, aligned: .top).right().marginHorizontal(10) - textLabel.pin.below(of: segmented, aligned: .left).right().marginTop(10).marginRight(10).fitSize() + textLabel.pin.below(of: segmented, aligned: .left).right().marginTop(10).marginRight(10).fitWidth() separatorView.pin.below(of: [logo, textLabel], aligned: .left).right(to: segmented.edge.right).marginTop(10) } ``` @@ -109,11 +109,11 @@ This example shows how easily PinLayout can adjust its layout based on the view' let margin: CGFloat = 12 if frame.width < 500 { - textLabel.pin.top().left().right().margin(margin).fitSize() + textLabel.pin.top().left().right().margin(margin).fitWidth() segmentedControl.pin.below(of: textLabel).right().margin(margin) } else { segmentedControl.pin.top().right().margin(margin) - textLabel.pin.top().left().before(of: segmentedControl).margin(margin).fitSize() + textLabel.pin.top().left().before(of: segmentedControl).margin(margin).fitWidth() } ``` @@ -771,17 +771,63 @@ Set the view’s size to match the referenced view’s size
-### fitSize() +### fitWidth() / fitHeight() / fitSize() / ... **Method:** -* `fitSize()` -`fitSize()` is the equivalent of calling sizeThatFits(_: CGSize) once PinLayout has determined the view's size and has applied margins. **`fitSize()` is applied only if at least the width or the height (or both) can be determined.** +* **`fitWidth()`** +The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting width will never be bigger than the reference width, but could be smaller. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width. + +* **`fitWidthHard()`** +Similar to `fitWidth()`, except that the resulting width will **always match the reference width**. + +* **`fitHeight()`** +The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting height will always match the reference height. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference height. +* **`fitHeightHard()`** +Similar to `fitHeight()`, except that the resulting height will **always match the reference width**. +* **`fitSize()`** +The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. +If the **width** has been pinned => the method **adjust the view's height** based on this width. +If the **height** has been pinned => the method **adjust the view's width** based on this height. +If the **width and the height** have been pinned => the method **adjust the view's size** based on both values. + + Notes: + * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width/height. + +* **`fitSizeHard()`** +Similar to `fitSize()`, except that the resulting width/height will **always match the pinned width/height**.. - The method was previously named `sizeToFit()`, but it was creating confusion with the already existing `UIView.sizeToFit()` method. ###### Usage examples: ```javascript + // Adjust the view's height based on a width of 100 pixels. + view.pin.width(100).fitWidth() + + // Adjust the view's height based on view's current width. + view.pin.fitWidth() + + // Adjust the labels's height based on a width of 100 pixels. The width will be 100 pixels even + // if the label text size is smaller. + label.pin.width(100).fitWidthHard() + + // Adjust the view's width based on a height of 100 pixels. + view.pin.height(100).fitHeight() + + // Adjust the view's width based on view's current height. + view.pin.fitHeight() + // Adjust the label's size based on a width of 200 pixels label.pin.width(200).fitSize() @@ -798,7 +844,7 @@ The following example layout the UILabel on the right side of the UIImageView wi ![](docs/pinlayout-fitSize.png) ```javascript - label.pin.after(of: image, aligned: .top).right().marginHorizontal(10).fitSize() + label.pin.after(of: image, aligned: .top).right().marginHorizontal(10).fitWidth() ``` @@ -808,7 +854,7 @@ The following example layout the UILabel on the right side of the UIImageView wi PinLayout has methods to set the view’s minimum and maximum width, and minimum and maximum height. -:pushpin: minWidth/maxWidth & minHeight/maxHeight have the highest priority. Higher than sizes (width/height/size, fitSize, aspectRatio) and edges positioning (top/left/bottom/right). Their values are always fullfilled. +:pushpin: minWidth/maxWidth & minHeight/maxHeight have the highest priority. Higher than sizes (width/height/size, fitWidth/fitHeight/fitSize, aspectRatio) and edges positioning (top/left/bottom/right). Their values are always fullfilled. **Methods:** @@ -1157,14 +1203,14 @@ Warnings can be disabled also in debug mode by setting the boolean Pin.logWarnin ## PinLayout style guide * You should always specifies methods in the same order, it makes layout lines easier to understand. Here is our prefered ordering: -`view.pin.[EDGE|ANCHOR|RELATIVE].[WIDTH|HEIGHT|SIZE].[pinEdges()].[MARGINS].[fitSize()]` +`view.pin.[EDGE|ANCHOR|RELATIVE].[WIDTH|HEIGHT|SIZE].[pinEdges()].[MARGINS].[fitWidth()/fitHeight()]` - This order reflect the logic inside PinLayout. `pinEdges()` is applied before margins and margins are applied before `fitSize()`. + This order reflect the logic inside PinLayout. `pinEdges()` is applied before margins and margins are applied before `fitWidth()/fitHeight()`. ```swift view.pin.top().left(10%).margin(10, 12, 10, 12) view.pin.left().width(100%).pinEdges().marginHorizontal(12) - view.pin.left().right().margin(0, 12).fitSize() + view.pin.left().right().margin(0, 12).fitWidth() view.pin.width(100).height(100%) ``` diff --git a/Sources/ObjectiveC/PinLayoutObjC.swift b/Sources/ObjectiveC/PinLayoutObjC.swift index 881a65a3..606d4bde 100644 --- a/Sources/ObjectiveC/PinLayoutObjC.swift +++ b/Sources/ObjectiveC/PinLayoutObjC.swift @@ -230,6 +230,11 @@ public extension UIView { @discardableResult func aspectRatio() -> PinLayoutObjC @discardableResult func fitSize() -> PinLayoutObjC + @discardableResult func fitSizeHard() -> PinLayoutObjC + @discardableResult func fitWidth() -> PinLayoutObjC + @discardableResult func fitWidthHard() -> PinLayoutObjC + @discardableResult func fitHeight() -> PinLayoutObjC + @discardableResult func fitHeightHard() -> PinLayoutObjC // // MARK: Margins diff --git a/Sources/ObjectiveC/PinLayoutObjCImpl.swift b/Sources/ObjectiveC/PinLayoutObjCImpl.swift index 097d69b9..0bbf397d 100644 --- a/Sources/ObjectiveC/PinLayoutObjCImpl.swift +++ b/Sources/ObjectiveC/PinLayoutObjCImpl.swift @@ -604,6 +604,31 @@ import UIKit return self } + public func fitSizeHard() -> PinLayoutObjC { + impl?.fitSizeHard() + return self + } + + public func fitWidth() -> PinLayoutObjC { + impl?.fitWidth() + return self + } + + public func fitWidthHard() -> PinLayoutObjC { + impl?.fitWidthHard() + return self + } + + public func fitHeight() -> PinLayoutObjC { + impl?.fitHeight() + return self + } + + public func fitHeightHard() -> PinLayoutObjC { + impl?.fitHeightHard() + return self + } + public func marginTop(_ value: CGFloat) -> PinLayoutObjC { impl?.marginTop(value) return self diff --git a/Sources/PinLayout.swift b/Sources/PinLayout.swift index a508ad6e..d303887a 100644 --- a/Sources/PinLayout.swift +++ b/Sources/PinLayout.swift @@ -118,6 +118,7 @@ public extension UIView { /// PinLayout interface public protocol PinLayout { + // // MARK: Layout using distances from superview’s edges // @@ -291,6 +292,10 @@ public protocol PinLayout { @discardableResult func size(_ percent: Percent) -> PinLayout @discardableResult func size(of view: UIView) -> PinLayout +// @discardableResult func wrapSubViews() -> PinLayout +// @discardableResult func wrapSubViews(insets: UIEdgeInsets) -> PinLayout + + /** Set the view aspect ratio. @@ -322,14 +327,132 @@ public protocol PinLayout { */ @discardableResult func aspectRatio() -> PinLayout - @available(*, deprecated, message: "You should now use fitSize() instead.") - @discardableResult func sizeToFit() -> PinLayout + /** + The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. + The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting width will never be bigger than the reference width, but could be smaller. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width. + + Example: + ``` + // Adjust the view's height based on a width of 100 pixels. + view.pin.width(100).fitWidth() + + // Adjust the view's height based on view's current width. + view.pin.fitWidth() + ``` + */ + @discardableResult func fitWidth() -> PinLayout + + /** + The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. + The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting width will always **match the reference width**. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width. + + Example: + `view.pin.width(100).fitWidthHard()`. + + In this example PinLayout will call the view's sizeThatFits() method with a width of + 100 pixels and adjust the height accordingly. Note that if sizeThatFits() returns a + bigger width (ex: 120 pixels) or a smaller width (ex: 80 pixels), PinLayout will + constrain the width to 100. + */ + @discardableResult func fitWidthHard() -> PinLayout + + /** + The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. + The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting height will never be bigger than the reference height, but could be smaller. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference height. + + Example: + ``` + // Adjust the view's width based on a height of 100 pixels. + view.pin.height(100).fitHeight() + + // Adjust the view's width based on view's current height. + view.pin.fitHeight() + ``` + */ + @discardableResult func fitHeight() -> PinLayout + + /** + The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. + The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. + + Notes: + * The resulting height will always match the reference height. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference height. + + Example: + `view.pin.height(100).fitHeightHard()`. + + In this example PinLayout will call the view's sizeThatFits() method with a height of + 100 pixels and adjust the width accordingly. Note that if sizeThatFits() returns a + bigger height (ex: 120 pixels) or a smaller height (ex: 80 pixels), PinLayout will + constrain the height to 100. + */ + @discardableResult func fitHeightHard() -> PinLayout + + /** + The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. + The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. + + If the width has been pinned, the method **adjust the view's height** based on this width. + If the height has been pinned, the method **adjust the view's width** based on this height. + If the width and the height have been pinned, the method **adjust the view's size** based on both values. + + Notes: + * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width/height. + + Example: + `view.pin.width(100).fitSize()`. + + In this example PinLayout will call the view's sizeThatFits() method with a width of 100. + If sizeThatFits() returns a bigger width (ex: 120 pixels), PinLayout will constrain the width to 100. + If sizeThatFits() returns a smaller width (ex: 80 pixels), this smaller width will be use. + */ @discardableResult func fitSize() -> PinLayout + + /** + The method **adjust the view's width and height** based on either the pinned height or width. + The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. + + If the width has been pinned, the method **adjust the view's height** based on this width. + If the height has been pinned, the method **adjust the view's width** based on this height. + If the width and the height have been pinned, the method **adjust the view's size** based on both values. + + Notes: + * The resulting width/height will **always match the pinned width/height**. + * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. + * If margin rules applies, margins will be applied when determining the reference width/height. + Example: + `view.pin.width(100).fitSizeHard()`. + + In this example PinLayout will call the view's sizeThatFits() method with a width of + 100 pixels and adjust the height accordingly. Note that if sizeThatFits() returns a + bigger width (ex: 120 pixels) or a smaller width (ex: 80 pixels), PinLayout will + constrain the width to 100. + */ + @discardableResult func fitSizeHard() -> PinLayout + // // MARK: Margins // - /** Set the top margin. */ @@ -421,6 +544,8 @@ public protocol PinLayout { /// /// - Returns: PinLayout @discardableResult func pinEdges() -> PinLayout + + //func layout() } /// Horizontal alignment used with relative positionning methods: above(of relativeView:, aligned:), below(of relativeView:, aligned:) diff --git a/Sources/PinLayoutImpl.swift b/Sources/PinLayoutImpl.swift index 6f574896..a37265fd 100644 --- a/Sources/PinLayoutImpl.swift +++ b/Sources/PinLayoutImpl.swift @@ -40,11 +40,12 @@ class PinLayoutImpl: PinLayout { internal var minHeight: CGFloat? internal var maxHeight: CGFloat? - internal var shouldSizeToFit = false + internal var fitType: FitType? + internal var shouldConstrainFit = false internal var _aspectRatio: CGFloat? internal var shouldKeepViewDimension: Bool { - return !shouldSizeToFit && _aspectRatio == nil + return fitType == nil && _aspectRatio == nil } internal var marginTop: CGFloat? @@ -61,6 +62,8 @@ class PinLayoutImpl: PinLayout { internal var _marginBottom: CGFloat { return marginBottom ?? 0 } internal var _marginRight: CGFloat { return marginRight ?? 0 } + //internal var isLayouted = false + init(view: UIView) { self.view = view } @@ -69,6 +72,10 @@ class PinLayoutImpl: PinLayout { apply() } +// public func layout() { +// apply() +// } + // // top, left, bottom, right // @@ -707,6 +714,14 @@ class PinLayoutImpl: PinLayout { return setSize(view.frame.size, context) } +// @discardableResult +// func wrapSubViews() -> PinLayout { +// let neededWidth = view.subviews.max(by: { subview1, subview2 in subview1.frame.maxX < subview2.frame.maxX })?.frame.maxX ?? 0 +// let neededHeight = view.subviews.max(by: { subview1, subview2 in subview1.frame.maxY < subview2.frame.maxY })?.frame.maxY ?? 0 +// +// return setSize(CGSize(width: neededWidth, height: neededHeight), { return "wrapSubViews()" }) +// } + @discardableResult func aspectRatio(_ ratio: CGFloat) -> PinLayout { return setAspectRatio(ratio, context: { "aspectRatio(\(ratio))" }) @@ -733,15 +748,35 @@ class PinLayoutImpl: PinLayout { } @discardableResult - func sizeToFit() -> PinLayout { - return setFitSize({ return "sizeToFit()" }) + func fitWidth() -> PinLayout { + return setFitSize(fitType: .width, constrain: false, { return "fitWidth()" }) } + @discardableResult + func fitWidthHard() -> PinLayout { + return setFitSize(fitType: .width, constrain: true, { return "fitWidthHard()" }) + } + + @discardableResult + func fitHeight() -> PinLayout { + return setFitSize(fitType: .height, constrain: false, { return "fitHeight()" }) + } + + @discardableResult + func fitHeightHard() -> PinLayout { + return setFitSize(fitType: .height, constrain: true, { return "fitHeightHard()" }) + } + @discardableResult func fitSize() -> PinLayout { - return setFitSize({ return "fitSize()" }) + return setFitSize(fitType: .size, constrain: false, { return "fitSize()" }) } - + + @discardableResult + func fitSizeHard() -> PinLayout { + return setFitSize(fitType: .size, constrain: true, { return "fitSizeHard()" }) + } + @discardableResult func justify(_ value: HorizontalAlign) -> PinLayout { justify = value @@ -869,19 +904,22 @@ class PinLayoutImpl: PinLayout { // MARK: Private methods // extension PinLayoutImpl { - internal func setFitSize(_ context: Context) -> PinLayout { + internal func setFitSize(fitType: FitType, constrain: Bool, _ context: Context) -> PinLayout { if let aspectRatio = _aspectRatio { warnConflict(context, ["aspectRatio": aspectRatio]) + } else if let currentFitType = self.fitType, currentFitType != fitType { + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with \(currentFitType.name).") } else { - shouldSizeToFit = true + self.fitType = fitType + shouldConstrainFit = constrain } return self } @discardableResult internal func setAspectRatio(_ ratio: CGFloat, context: Context) -> PinLayout { - if shouldSizeToFit { - warnConflict(context, ["fitSize": shouldSizeToFit]) + if let fitType = fitType { + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with \(fitType.name).") } else if ratio <= 0 { warnWontBeApplied("the aspectRatio (\(ratio)) must be greater than zero.", context) } else { @@ -912,7 +950,9 @@ extension PinLayoutImpl { // MARK - UIView's frame computation methods extension PinLayoutImpl { fileprivate func apply() { +// guard !isLayouted else { return } apply(onView: view) +// isLayouted = true } fileprivate func apply(onView view: UIView) { @@ -1062,29 +1102,58 @@ extension PinLayoutImpl { var width = computeWidth() var height = computeHeight() - if width != nil || height != nil { - if shouldSizeToFit { + if let fitType = fitType { + if fitType == .size && width == nil && height == nil { + warn("fitSize() won't be applied, neither the width nor the height can be determined.") + } else { + var fitWidth = CGFloat.greatestFiniteMagnitude + var fitHeight = CGFloat.greatestFiniteMagnitude + // Apply min/max width/height before calling sizeThatFits() ... and reapply them after. - width = applyMinMax(toWidth: width) - height = applyMinMax(toHeight: height) + switch fitType { + case .size: + if let width = applyMinMax(toWidth: width) { + fitWidth = width + } + if let height = applyMinMax(toHeight: height) { + fitHeight = height + } + case .width: + if let width = applyMinMax(toWidth: width) { + fitWidth = width + } else { + fitWidth = view.frame.width + } + case .height: + if let height = applyMinMax(toHeight: height) { + fitHeight = height + } else { + fitHeight = view.frame.height + } + } - let fitSize = CGSize(width: width ?? .greatestFiniteMagnitude, - height: height ?? .greatestFiniteMagnitude) - - let sizeThatFits = view.sizeThatFits(fitSize) + let sizeThatFits = view.sizeThatFits(CGSize(width: fitWidth, height: fitHeight)) - if fitSize.width != .greatestFiniteMagnitude && sizeThatFits.width > fitSize.width { - width = fitSize.width + if fitWidth != .greatestFiniteMagnitude && + (sizeThatFits.width > fitWidth || + (shouldConstrainFit && sizeThatFits.width < fitWidth)) { + width = fitWidth } else { width = sizeThatFits.width } - - if fitSize.height != .greatestFiniteMagnitude && sizeThatFits.height > fitSize.height { - height = fitSize.height + + if fitHeight != .greatestFiniteMagnitude && + (sizeThatFits.height > fitHeight || + (shouldConstrainFit && sizeThatFits.height < fitHeight)) { + height = fitHeight } else { height = sizeThatFits.height } - } else if let aspectRatio = _aspectRatio { + } + } else if let aspectRatio = _aspectRatio { + if width == nil && height == nil { + warn("aspectRatio won't be applied, neither the width nor the height can be determined.") + } else { if width != nil && height != nil { // warn, both are specified warn("aspectRatio won't be applied, the width and the height are already defined by other PinLayout's properties.") @@ -1094,13 +1163,6 @@ extension PinLayoutImpl { width = adjHeight * aspectRatio } } - } else { - // newWidth and newHeight are nil - if shouldSizeToFit { - warn("fitSize() won't be applied, neither the width nor the height can be determined.") - } else if _aspectRatio != nil { - warn("aspectRatio won't be applied, neither the width nor the height can be determined.") - } } width = applyMinMax(toWidth: width) diff --git a/Sources/TypesImpl.swift b/Sources/TypesImpl.swift index f1780126..815de9d5 100644 --- a/Sources/TypesImpl.swift +++ b/Sources/TypesImpl.swift @@ -185,5 +185,21 @@ extension Percent { return "\(value)%" } } + +enum FitType { + case size + case width + case height + + var name: String { + switch self { + case .size: return "fitSize()" + case .width: return "fitWidth()" + case .height: return "fitHeight()" + } + } +} + + #endif diff --git a/Tests/AccurencyTests.swift b/Tests/AccurencyTests.swift deleted file mode 100644 index 32cf4568..00000000 --- a/Tests/AccurencyTests.swift +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) 2017 Luc Dion -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Quick -import Nimble -import PinLayout - -@testable import PinLayout - -class AccurencyTests: QuickSpec { - var viewController: UIViewController! - var rootView: UIView! - - override func spec() { - var viewController: UIViewController! - - var rootView: BasicView! - var aView: BasicView! - - beforeEach { - viewController = UIViewController() - - rootView = BasicView(text: "", color: .white) - rootView.frame = CGRect(x: 0, y: 0, width: 400, height: 400) - viewController.view.addSubview(rootView) - - aView = BasicView(text: "View A", color: UIColor.red.withAlphaComponent(0.5)) -// aView.frame = CGRect(x: 140, y: 100, width: 200, height: 100) - rootView.addSubview(aView) - } - -// describe("Test accurency") { -// it("") { -// -// Coordinates.overwriteDisplayScaleForUnitTest(scale: 1) -// aView.pin.top(1.33).left(1.33).width(1.33).height(1.33) -//// expect(aView.top).to(equal(2)) -// expect(aView.frame).to(equal(CGRect(x: 2, y: 2, width: 2, height: 2))) -// } -// } - } -} -/* - -- (void)testCeilFloatToStandardDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:1.0]; - CGFloat ceiledFloat = [MCUIViewLayoutPosition ceilFloatToDisplayScale:1.33]; - XCTAssertEqualWithAccuracy(ceiledFloat, 2.0f, DESIRED_ACCURACY); - } - - - (void)testCeilFloatToRetinaDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - CGFloat ceiledFloat = [MCUIViewLayoutPosition ceilFloatToDisplayScale:1.33]; - XCTAssertEqualWithAccuracy(ceiledFloat, 1.5f, DESIRED_ACCURACY); - } - - - (void)testCeilFloatToRetinaPlusDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:3.0]; - CGFloat ceiledFloat = [MCUIViewLayoutPosition ceilFloatToDisplayScale:1.33]; - XCTAssertEqualWithAccuracy(ceiledFloat, 1.333333f, DESIRED_ACCURACY); - } - - - (void)testFloorFloatToStandardDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:1.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition floorFloatToDisplayScale:1.75]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.0f, DESIRED_ACCURACY); - } - - - (void)testFloorFloatToRetinaDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition floorFloatToDisplayScale:1.75]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.5f, DESIRED_ACCURACY); - } - - - (void)testFloorFloatToRetinaPlusDisplayScale { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:3.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition floorFloatToDisplayScale:1.75]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.666666f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToStandardDisplayScaleGoingDown { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:1.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.49]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.0f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToStandardDisplayScaleGoingUp { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:1.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.50]; - XCTAssertEqualWithAccuracy(flooredFloat, 2.0f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaDisplayScaleGoingUp { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.75]; - XCTAssertEqualWithAccuracy(flooredFloat, 2.0f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaDisplayScaleGoingUpUnder1_5 { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.25]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.5f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaDisplayScaleDownUnder1_5 { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.24]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.0f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaDisplayScaleGoingDown { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:2.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.74]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.5f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaPlusDisplayScaleToTwo { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:3.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.85]; - XCTAssertEqualWithAccuracy(flooredFloat, 2.0f, DESIRED_ACCURACY); - } - - - (void)testRoundFloatToRetinaPlusDisplayScaleLowerFraction { - [MCUIViewLayoutPosition overrideDisplayScaleForTest:3.0]; - - CGFloat flooredFloat = [MCUIViewLayoutPosition roundFloatToDisplayScale:1.49]; - XCTAssertEqualWithAccuracy(flooredFloat, 1.333333f, DESIRED_ACCURACY); -}*/ diff --git a/Tests/AdjustSizeSpec.swift b/Tests/AdjustSizeSpec.swift index 624c6de7..6f21a6b9 100644 --- a/Tests/AdjustSizeSpec.swift +++ b/Tests/AdjustSizeSpec.swift @@ -54,25 +54,26 @@ class AdjustSizeSpec: QuickSpec { viewController = UIViewController() rootView = BasicView(text: "", color: .white) - rootView.frame = CGRect(x: 0, y: 0, width: 400, height: 400) viewController.view.addSubview(rootView) aView = BasicView(text: "View A", color: UIColor.red.withAlphaComponent(0.5)) - aView.frame = CGRect(x: 140, y: 100, width: 100, height: 60) aView.sizeThatFitsExpectedArea = 40 * 40 rootView.addSubview(aView) aViewChild = BasicView(text: "View A Child", color: UIColor.red.withAlphaComponent(1)) - aViewChild.frame = CGRect(x: 10, y: 20, width: 50, height: 30) aView.addSubview(aViewChild) bView = BasicView(text: "View B", color: UIColor.blue.withAlphaComponent(0.5)) - bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) rootView.addSubview(bView) bViewChild = BasicView(text: "View B Child", color: UIColor.blue.withAlphaComponent(0.7)) - bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) bView.addSubview(bViewChild) + + 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) + bView.frame = CGRect(x: 160, y: 200, width: 110, height: 80) + bViewChild.frame = CGRect(x: 40, y: 10, width: 60, height: 20) } describe("the result of the width(...) methods") { @@ -219,6 +220,16 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) } + it("should adjust the size of aView by calling fitSize() method") { + aView.pin.size(CGSize(width: 20, height: 100)).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 100.0))) + } + + it("should adjust the size of aView by calling fitSize() method") { + aView.pin.size(CGSize(width: 20, height: 100)).fitSize() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) + } + it("should adjust the size and position the view by calling center(), height() and fitSize()") { aViewChild.pin.center(to: aView.anchor.center).height(40).fitSize() expect(aViewChild.frame).to(equal(CGRect(x: 30.0, y: 10.0, width: 40.0, height: 40.0))) @@ -433,6 +444,16 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 8.5))) } + it("should adjust the size with fitSizeHard()") { + aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginTop(10).marginBottom(10).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 180.0))) + } + + it("should adjust the size with fitSize()") { + aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginTop(10).marginBottom(10).fitSize() + expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 8.5))) + } + it("should adjust the size with fitSize()") { aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginRight(10).marginTop(10).fitSize() expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 9))) @@ -448,6 +469,13 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 9.0))) } + it("should adjust the size with fitSizeHard()") { + aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginRight(10).marginTop(10).marginBottom(10).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 180.0))) + } + } + + describe("the result of the fitSize() with justify() or align()") { it("should adjust the size with fitSize()") { aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginRight(10).marginTop(10).fitSize().justify(.left) expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 9))) @@ -507,6 +535,11 @@ class AdjustSizeSpec: QuickSpec { aView.pin.top(0).height(70).width(100).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 0.0, width: 100.0, height: 16.0))) } + + it("should adjust the size of aView by calling fitSizeHard()") { + aView.pin.top(0).height(70).width(100).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 0.0, width: 100.0, height: 70.0))) + } it("should adjust the size of aView by calling fitSize() method") { aView.pin.width(100).fitSize() @@ -559,24 +592,111 @@ class AdjustSizeSpec: QuickSpec { // describe("the result of the fitSize() method when min/max width/height are set") { it("should adjust the size of aView by calling fitSize() method") { - aView.pin.width(100).fitSize().minHeight(20) + aView.pin.width(100).minHeight(20).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 20.0))) } it("should adjust the size of aView by calling fitSize() method") { - aView.pin.width(100).fitSize().maxHeight(10) + aView.pin.width(100).maxHeight(10).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 10.0))) } it("should adjust the size of aView by calling fitSize() method") { - aView.pin.height(100).fitSize().maxWidth(10) + aView.pin.height(100).maxWidth(10).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 10.0, height: 100.0))) } it("should adjust the size of aView by calling fitSize() method") { - aView.pin.height(100).fitSize().minWidth(20) + aView.pin.height(100).minWidth(20).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) } } + + // + // fitHeight && fitWidth + // + describe("the result of the fitHeight() && fitWidth") { + it("should warn method") { + aView.pin.width(100).fitSize().fitWidth() + expect(_pinlayoutUnitTestLastWarning).to(contain(["fitWidth()", "won't be applied", "conflicts with fitSize()"])) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) + } + + it("should warn method") { + aView.pin.width(100).fitSize().fitHeight() + expect(_pinlayoutUnitTestLastWarning).to(contain(["fitHeight()", "won't be applied", "conflicts with fitSize()"])) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) + } + + it("should warn method") { + aView.pin.width(100).aspectRatio(2).fitWidth() + expect(_pinlayoutUnitTestLastWarning).to(contain(["fitWidth()", "won't be applied", "aspectRatio: 2"])) + } + + it("should warn method") { + aView.pin.fitWidth().aspectRatio(2) + expect(_pinlayoutUnitTestLastWarning).to(contain([" aspectRatio(2.0)", "won't be applied", "conflicts with fitWidth()"])) + } + } + + // + // fitWidth + // + describe("the result of the fitWidth()") { + it("should adjust the aView") { + aView.pin.fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) + } + + it("should adjust the aView") { + aView.pin.width(50).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 32.0))) + } + + it("should adjust the aView") { + aView.pin.minWidth(160).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 160.0, height: 10.0))) + } + + it("should adjust the aView") { + aView.pin.maxWidth(50).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 32.0))) + } + + it("should adjust the aView") { + aView.pin.size(CGSize(width: 20, height: 100)).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) + } + + it("should adjust the aView") { + aView.pin.size(CGSize(width: 20, height: 100)).fitHeight() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 16.0, height: 100.0))) + } + } + + // + // fitHeight + // + describe("the result of the fitHeight()") { + it("should adjust the aView") { + aView.pin.fitHeight() + expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 27, height: 60.0), within: 0.5)) + } + + it("should adjust the aView") { + aView.pin.height(50).fitHeight() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) + } + + it("should adjust the aView") { + aView.pin.minHeight(160).fitHeight() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 10.0, height: 160.0))) + } + + it("should adjust the aView") { + aView.pin.maxHeight(50).fitHeight() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) + } + } } } diff --git a/Tests/AspectRatioTests.swift b/Tests/AspectRatioTests.swift index 371a2779..833905b4 100644 --- a/Tests/AspectRatioTests.swift +++ b/Tests/AspectRatioTests.swift @@ -80,7 +80,7 @@ class AspectRatioTests: QuickSpec { it("should warn about aspectRatio(:CGFloat)") { aView.sizeThatFitsExpectedArea = 40 * 40 aView.pin.left().width(100%).fitSize().aspectRatio(2) - expect(_pinlayoutUnitTestLastWarning).to(contain(["aspectRatio(2.0) won't be applied", "conflicts", "fitSize"])) + expect(_pinlayoutUnitTestLastWarning).to(contain(["aspectRatio(2.0) won't be applied", "conflicts", "fitSize()"])) } it("should warn about aspectRatio(:CGFloat)") { diff --git a/Tests/MinMaxWidthHeightSpec.swift b/Tests/MinMaxWidthHeightSpec.swift index 40e849fc..cfd9bd8c 100644 --- a/Tests/MinMaxWidthHeightSpec.swift +++ b/Tests/MinMaxWidthHeightSpec.swift @@ -270,6 +270,30 @@ class MinMaxWidthHeightSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) } + it("should adjust the width when using fitSize") { + aView.sizeThatFitsExpectedArea = 40 * 40 + aView.pin.left().width(100%).maxWidth(250).maxHeight(20).fitSize() + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) + } + + it("should adjust the width when using fitSizeHard") { + aView.sizeThatFitsExpectedArea = 40 * 40 + aView.pin.left().width(100%).maxWidth(250).maxHeight(20).minHeight(14).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 14))) + } + + it("should adjust the width when using fitSize") { + aView.sizeThatFitsExpectedArea = 40 * 40 + aView.pin.left().width(100%).maxWidth(250).height(14).maxHeight(20).fitSize() + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) + } + + it("should adjust the width when using fitSizeHard") { + aView.sizeThatFitsExpectedArea = 40 * 40 + aView.pin.left().width(100%).maxWidth(250).height(14).maxHeight(20).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 14.0))) + } + it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 aView.pin.left().width(100%).maxWidth(250).fitSize().justify(.left) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7c2699ad..de3ac732 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -61,6 +61,10 @@ platform :ios do workspace: "PinLayout.xcworkspace") end + lane :jazzy do + jazzy + end + lane :travis do build tests From c04647f467052eda4a7b71ab6d9074a9ead68ae0 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Wed, 15 Nov 2017 21:37:42 -0500 Subject: [PATCH 2/8] Add more unit tests --- .../PinLayoutSample/UI/Common/BasicView.swift | 5 +- Tests/AdjustSizeSpec.swift | 109 ++++++++++++++++++ Tests/BasicView.swift | 5 +- 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/Example/PinLayoutSample/UI/Common/BasicView.swift b/Example/PinLayoutSample/UI/Common/BasicView.swift index 8ec5eb90..763f8bea 100644 --- a/Example/PinLayoutSample/UI/Common/BasicView.swift +++ b/Example/PinLayoutSample/UI/Common/BasicView.swift @@ -47,14 +47,15 @@ class BasicView: UIView { } var sizeThatFitsExpectedArea: CGFloat = 40 * 40 + var sizeThatFitSizeOffset: CGFloat = 0 override func sizeThatFits(_ size: CGSize) -> CGSize { var newSize = CGSize() if size.width != CGFloat.greatestFiniteMagnitude { - newSize.width = size.width + newSize.width = size.width + sizeThatFitSizeOffset newSize.height = sizeThatFitsExpectedArea / newSize.width } else if size.height != CGFloat.greatestFiniteMagnitude { - newSize.height = size.height + newSize.height = size.height + sizeThatFitSizeOffset newSize.width = sizeThatFitsExpectedArea / newSize.height } else { newSize.width = 40 diff --git a/Tests/AdjustSizeSpec.swift b/Tests/AdjustSizeSpec.swift index 6f21a6b9..de4b866e 100644 --- a/Tests/AdjustSizeSpec.swift +++ b/Tests/AdjustSizeSpec.swift @@ -698,5 +698,114 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) } } + + // + // fitWidthHard + // + describe("the result of the fitWidthHard()") { + it("should adjust the aView") { + aView.pin.fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.width(50).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.width(50).fitWidthHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.size(CGSize(width: 20, height: 100)).fitWidth() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 10.0, height: 160.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.size(CGSize(width: 20, height: 100)).fitWidthHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 160.0))) + } + } + + // + // fitHeightHard + // + describe("the result of the fitHeightHard()") { + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.fitHeight() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.fitHeightHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 60.0))) + } + } + + // + // fitSizeHard + // + describe("the result of the fitSizeHard()") { + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.width(50).fitSize() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.width(50).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = 10 + aView.pin.width(50).fitSize() + expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 26.6), within: 0.5)) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = 10 + aView.pin.width(50).fitSizeHard() + expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 26.6), within: 0.5)) + } + + it("should adjust the aView") { + aView.pin.height(50).fitSize() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.height(50).fitSize() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.height(50).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 50.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = 10 + aView.pin.height(30).fitSize() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 30.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = 10 + aView.pin.height(30).fitSizeHard() + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 30.0))) + } + } } } diff --git a/Tests/BasicView.swift b/Tests/BasicView.swift index afd9f66e..9849eac9 100644 --- a/Tests/BasicView.swift +++ b/Tests/BasicView.swift @@ -46,14 +46,15 @@ class BasicView: UIView { } var sizeThatFitsExpectedArea: CGFloat = 40 * 40 + var sizeThatFitSizeOffset: CGFloat = 0 override func sizeThatFits(_ size: CGSize) -> CGSize { var newSize = CGSize() if size.width != CGFloat.greatestFiniteMagnitude { - newSize.width = size.width + newSize.width = size.width + sizeThatFitSizeOffset newSize.height = sizeThatFitsExpectedArea / newSize.width } else if size.height != CGFloat.greatestFiniteMagnitude { - newSize.height = size.height + newSize.height = size.height + sizeThatFitSizeOffset newSize.width = sizeThatFitsExpectedArea / newSize.height } else { newSize.width = 40 From b2434b5e1d86f6cb5c90df847c07e7a508e46c9f Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Thu, 16 Nov 2017 07:16:23 -0500 Subject: [PATCH 3/8] Update readme --- README.md | 18 +++++++++--------- Sources/PinLayout.swift | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index e8b4a119..27d70a3e 100644 --- a/README.md +++ b/README.md @@ -776,35 +776,35 @@ Set the view’s size to match the referenced view’s size **Method:** * **`fitWidth()`** -The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. +The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: - * The resulting width will never be bigger than the reference width, but could be smaller. + * The resulting width will never be bigger than the reference width but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width. + * If margin rules apply, margins will be applied when determining the reference width. * **`fitWidthHard()`** Similar to `fitWidth()`, except that the resulting width will **always match the reference width**. * **`fitHeight()`** -The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. +The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: - * The resulting height will always match the reference height. + * The resulting height will never be bigger than the reference height but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference height. + * If margin rules apply, margins will be applied when determining the reference height. * **`fitHeightHard()`** Similar to `fitHeight()`, except that the resulting height will **always match the reference width**. * **`fitSize()`** -The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. +The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. If the **width** has been pinned => the method **adjust the view's height** based on this width. If the **height** has been pinned => the method **adjust the view's width** based on this height. If the **width and the height** have been pinned => the method **adjust the view's size** based on both values. Notes: - * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. + * The resulting width/height will never be bigger than the pinned width/height but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width/height. + * If margin rules apply, margins will be applied when determining the reference width/height. * **`fitSizeHard()`** Similar to `fitSize()`, except that the resulting width/height will **always match the pinned width/height**.. diff --git a/Sources/PinLayout.swift b/Sources/PinLayout.swift index d303887a..2c360fe4 100644 --- a/Sources/PinLayout.swift +++ b/Sources/PinLayout.swift @@ -329,12 +329,12 @@ public protocol PinLayout { /** The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. - The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: - * The resulting width will never be bigger than the reference width, but could be smaller. + * The resulting width will never be bigger than the reference width but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width. + * If margin rules apply, margins will be applied when determining the reference width. Example: ``` @@ -349,12 +349,12 @@ public protocol PinLayout { /** The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. - The method compute the height based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: * The resulting width will always **match the reference width**. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width. + * If margin rules apply, margins will be applied when determining the reference width. Example: `view.pin.width(100).fitWidthHard()`. @@ -368,12 +368,12 @@ public protocol PinLayout { /** The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. - The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: - * The resulting height will never be bigger than the reference height, but could be smaller. + * The resulting height will never be bigger than the reference height but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference height. + * If margin rules apply, margins will be applied when determining the reference height. Example: ``` @@ -388,12 +388,12 @@ public protocol PinLayout { /** The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. - The method compute the width based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. Notes: * The resulting height will always match the reference height. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference height. + * If margin rules apply, margins will be applied when determining the reference height. Example: `view.pin.height(100).fitHeightHard()`. @@ -407,7 +407,7 @@ public protocol PinLayout { /** The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. - The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. If the width has been pinned, the method **adjust the view's height** based on this width. If the height has been pinned, the method **adjust the view's width** based on this height. @@ -416,7 +416,7 @@ public protocol PinLayout { Notes: * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width/height. + * If margin rules apply, margins will be applied when determining the reference width/height. Example: `view.pin.width(100).fitSize()`. @@ -429,7 +429,7 @@ public protocol PinLayout { /** The method **adjust the view's width and height** based on either the pinned height or width. - The method compute the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. + The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. If the width has been pinned, the method **adjust the view's height** based on this width. If the height has been pinned, the method **adjust the view's width** based on this height. @@ -438,7 +438,7 @@ public protocol PinLayout { Notes: * The resulting width/height will **always match the pinned width/height**. * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules applies, margins will be applied when determining the reference width/height. + * If margin rules apply, margins will be applied when determining the reference width/height. Example: `view.pin.width(100).fitSizeHard()`. From 3014c0677ba7259089359db9fb0a53d44bbec131 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Thu, 16 Nov 2017 07:51:57 -0500 Subject: [PATCH 4/8] Update readme --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 27d70a3e..10124a77 100644 --- a/README.md +++ b/README.md @@ -813,29 +813,29 @@ Similar to `fitSize()`, except that the resulting width/height will **always mat ###### Usage examples: ```javascript // Adjust the view's height based on a width of 100 pixels. - view.pin.width(100).fitWidth() + view.pin.width(100).fitWidth() - // Adjust the view's height based on view's current width. - view.pin.fitWidth() + // Adjust the view's height based on view's current width. + view.pin.fitWidth() - // Adjust the labels's height based on a width of 100 pixels. The width will be 100 pixels even - // if the label text size is smaller. - label.pin.width(100).fitWidthHard() + // Adjust the labels's height based on a width of 100 pixels. The width will be 100 pixels even + // if the label text size is smaller. + label.pin.width(100).fitWidthHard() - // Adjust the view's width based on a height of 100 pixels. + // Adjust the view's width based on a height of 100 pixels. view.pin.height(100).fitHeight() // Adjust the view's width based on view's current height. view.pin.fitHeight() - // Adjust the label's size based on a width of 200 pixels - label.pin.width(200).fitSize() + // Adjust the label's size based on a width of 200 pixels + label.pin.width(200).fitSize() - // Adjust the label's size based on the computed view's width - label.pin.left().right().fitSize() + // Adjust the label's size based on the computed view's width + label.pin.left().right().fitSize() - // WRONG, neither the width nor the height can be determined, fitSize() won't be applied - label.pin.top().left().fitSize() + // WRONG, neither the width nor the height can be determined, fitSize() won't be applied + label.pin.top().left().fitSize() ``` ###### Example: From f0939427cd2b814337672bb31e6e6e5b8791c08b Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Thu, 16 Nov 2017 10:07:59 -0500 Subject: [PATCH 5/8] Update example image --- README.md | 2 +- docs/images/pinlayout-fitSize.png | Bin 0 -> 59573 bytes docs/pinlayout-fitSize.png | Bin 216002 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/images/pinlayout-fitSize.png delete mode 100644 docs/pinlayout-fitSize.png diff --git a/README.md b/README.md index 10124a77..63aad1da 100644 --- a/README.md +++ b/README.md @@ -841,7 +841,7 @@ Similar to `fitSize()`, except that the resulting width/height will **always mat ###### Example: The following example layout the UILabel on the right side of the UIImageView with a margin of 10px all around and also adjust the UILabel’t height to fit the text size. Note on the result that the UILabel’s height has changed to fit its content. -![](docs/pinlayout-fitSize.png) +![](docs/images/pinlayout-fitSize.png) ```javascript label.pin.after(of: image, aligned: .top).right().marginHorizontal(10).fitWidth() diff --git a/docs/images/pinlayout-fitSize.png b/docs/images/pinlayout-fitSize.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2b0783eb774da616f168435766ae9283d05a4e GIT binary patch literal 59573 zcmd3Og};Ba+gGZcti~4iyBH?mBQN>Fy5c?yhfhXD*-?{0q~_Eg-tE=< z4?Kv7bSN?DX=-U{=;rHiQzBhYWEmvSFsSvaq1kY4;_&9-&)_Lg%@^QHM`(7isa^4s z`q~gQ@$ptL%oX9L5MJU`A%~@7ndtdVc9DF1E?I@r$q`1@w(JpMY-Mjp{cv9sQ+pR@5H0P)gZ}#S&v9C~ zTm9!rc257A7BE51hcleq99*1#-5a=6?BP=p6)SfO8*LdYTMIiU;2Gk=!a`#I`2OF{ z{O5`Pb*0XKuH@z7{qHOP>&(Bd6ytoDz<*8XpVs=vr+~S{(Zo3aGQBt&VTd*v9GoQF zOBt!R?(jS5PtxL7&pHN1hv$Ze6+Tjj`N1QH%@I#TSvwRP)|YNiLr(3ph?&3A5{6~- zeR6hl+j(<4u%GOm1wCiN6mHxLbeb-yZ{y$1I2NZ0$E{ra|1_9uxC0A>{vGC$y-< zfOHPJc*mlY=)?fb%wJ7<@vs>?KBd-ymLVGMUYr>+5JX4&a0ZIQtmI2IXqJ)4)X(!j zY@?!pq}FX_N0N~9g+P?4@xc<3R`im}mR4TB7~J06Tz_2=CyR=B*br$*ua*~3PLf13 zxg`FF#Uyd@zjAS!F78DAkKL1o#N3+qXX!%Z~=2;($~@jEx-lIX0H2H3T!x9(Jplz+u2*SgbW&VMRw|=>F|w zb3}gDt{Ot1zi;yqN#Sb=D)1T*>QpH{ex?H4cd=(^9~br$FOS!Iek2;QIIZ{h4Y#gz z#jQ4+&&R315tbFdSVa7(Q=WsnevmT)jOi5z{2n)F?LY|Kocpv74_pNbiq8kCR%$ z^`%-Lu+JhkVd}%C{l}rej-X$oT)1waUml5e?9F2_9OQ**w$SK(biEJj@q~^1}IWWOl^*rAjQ(o@Q3r^@D|S$J}Rb<$j$2jj5gXf zMfGoAB>9uBDfn9LTtRU(h+4a(+H0=PrOdj+^3roJ^ODr4)^W8A)oDj#p~17dO3EaI zGloq+4=H96N0mZojgx?#ADsS4ImPL}H>ZLw!a>sV*e{KIuReHB*O_X2`?L5gTIiZ; zG^8=b)C7UwM`Jv&zNC9NM)sB69KOHwV>$lw-eoy-xUQDakn?oFlq!zEj!sMiH^)Bm(UJlPIHL-mf*byP zVbS^T1OZI)ME>jP{(?~opA{{gTtv)NIXKmOnHha)zS3H&cIC5T1aq<4k5BRJdgJtC z-T7Rc`DoufAc+NYBwc@^T;s-4#vHmn*~UWniq<|e=zaEm({;rrw3h~irS;xWx0nAN zOTJD%HTD%o5(pCbY~DOPJe;jlZppJ!&Pfjf8T1nmD!(5uc>aY|D}j{%y+WaGWiL3W zX`O%M6t{BDafI72xrCNEvlp%V$u3BZrjKD?2|H|tL9H-Nv1$iXF@^Hu-PCW3l|KW+ z3?LqI-kdmHcXJi&;|}F9-Dix_9TcE}@N{3#YLh#$H(DTvj&jz++e z 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 iuS-u`*re83B!+`E41kEN9v4e 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 aTrq0%%T$#2Mu`>R-vJAI^Wy!dul^USN%EQi From d1c95f286fc81c6e00d7a3ba41c25f70f3961b2c Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Sun, 19 Nov 2017 14:42:35 -0500 Subject: [PATCH 6/8] New method `sizeToFit(:FitType)` & `fitSize()` is now deprecated * `fitSize()` is now deprecated. The new `sizeToFit(:FitType)` should be used instead. **`sizeToFit(_ fitType: FitType)`** The method adjust the view's size based on the view's `sizeThatFits()` method result. PinLayout will adjust either the view's width or height based on the `fitType` parameter value. Notes: * If margin rules apply, margins will be applied when determining the reference dimension (width/height). * The resulting size will always respect `minWidth` / `maxWidth` / `minHeight` / `maxHeight`. - Parameter fitType: Identify the reference dimension (width / height) that will be used to adjust the view's size: .width: The method adjust the view's size based on the **reference width**. * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), the **reference width will be determined by these properties**, else the **current view's width** will be used. * The resulting width will always **match the reference width**. .height: The method adjust the view's size based on the **reference height**. * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), the **reference height will be determined by these properties**, else the **current view's height** will be used. * The resulting height will always **match the reference height**. .widthFlexible: Similar to `.width`, except that PinLayout won't constrain the resulting width to match the reference width. The resulting width may be smaller of bigger depending on the view's sizeThatFits(..) method result. For example a single line UILabel may returns a smaller width if its string is smaller than the reference width. .heightFlexible: Similar to `.height`, except that PinLayout won't constrain the resulting height to match the reference height. The resulting height may be smaller of bigger depending on the view's sizeThatFits(..) method result. Examples: ``` // Adjust the view's size based on a width of 100 pixels. // The resulting width will always match the pinned property `width(100)`. view.pin.width(100).sizeToFit(.width) // Adjust the view's size based on view's current width. // The resulting width will always match the view's original width. // The resulting height will never be bigger than the specified `maxHeight`. view.pin.sizeToFit(.width).maxHeight(100) // Adjust the view's size based on 100% of the superview's height. // The resulting height will always match the pinned property `height(100%)`. view.pin.height(100%).sizeToFit(.height) // Adjust the view's size based on view's current height. // The resulting width will always match the view's original height. view.pin.sizeToFit(.height) // Since `.widthFlexible` has been specified, its possible that the resulting // width will be smaller or bigger than 100 pixels, based of the label's sizeThatFits() // method result. label.pin.width(100).sizeToFit(.widthFlexible) ``` --- .../PinLayoutSample/UI/Common/BasicView.swift | 2 +- .../AdjustToContainerView.swift | 14 +- .../Subviews/ChoiceSelectorView.swift | 4 +- .../CollectionViewExample/HouseCell.swift | 6 +- .../UI/Examples/Intro/IntroView.swift | 2 +- .../IntroObjectiveC/IntroObjectiveCView.m | 2 +- .../UI/Examples/IntroRTL/IntroRTLView.swift | 2 +- .../TableViewExample/Cells/MethodCell.swift | 4 +- .../Cells/MethodGroupHeader.swift | 2 +- PinLayout.podspec | 2 +- README.md | 109 +++++----- Sources/ObjectiveC/PinLayoutObjC.swift | 13 +- Sources/ObjectiveC/PinLayoutObjCImpl.swift | 31 +-- Sources/PinLayout.swift | 190 ++++++++---------- Sources/PinLayoutImpl.swift | 120 +++++------ Sources/TypesImpl.swift | 19 +- Tests/AdjustSizeSpec.swift | 135 +++++++------ Tests/MinMaxWidthHeightSpec.swift | 26 ++- ...ut-fitSize.png => pinlayout-sizeToFit.png} | Bin 19 files changed, 329 insertions(+), 354 deletions(-) rename docs/images/{pinlayout-fitSize.png => pinlayout-sizeToFit.png} (100%) diff --git a/Example/PinLayoutSample/UI/Common/BasicView.swift b/Example/PinLayoutSample/UI/Common/BasicView.swift index 763f8bea..eb2cebd7 100644 --- a/Example/PinLayoutSample/UI/Common/BasicView.swift +++ b/Example/PinLayoutSample/UI/Common/BasicView.swift @@ -43,7 +43,7 @@ class BasicView: UIView { override func layoutSubviews() { super.layoutSubviews() - label.pin.top().left().right().margin(4).fitSize() + label.pin.top().left().right().margin(4).sizeToFit(.width) } var sizeThatFitsExpectedArea: CGFloat = 40 * 40 diff --git a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift index 9042f267..c971b1a9 100644 --- a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift +++ b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/AdjustToContainerView.swift @@ -23,8 +23,8 @@ import PinLayout class AdjustToContainerView: BaseView { fileprivate let contentView = UIView() fileprivate let languageSelectorView = ChoiceSelectorView(text: "What is your favorite language?", choices: ["Swift", "Objective-C", "C++"]) - fileprivate let swiftOpinionSelectorView = ChoiceSelectorView(text: "Overall, are you satisfied with the Swift performance in your projects?", choices: ["Yes", "No"]) - fileprivate let swiftUsageSelectorView = ChoiceSelectorView(text: "How often do you typically use Swift?", choices: ["Daily", "Weekly", "Montly", "Do not use"]) + fileprivate let swiftOpinionSelector = ChoiceSelectorView(text: "Overall, are you satisfied with the Swift performance in your projects?", choices: ["Yes", "No"]) + fileprivate let swiftUsageSelector = ChoiceSelectorView(text: "How often do you typically use Swift?", choices: ["Daily", "Weekly", "Montly", "Do not use"]) override init() { super.init() @@ -32,8 +32,8 @@ class AdjustToContainerView: BaseView { addSubview(contentView) contentView.addSubview(languageSelectorView) - contentView.addSubview(swiftOpinionSelectorView) - contentView.addSubview(swiftUsageSelectorView) + contentView.addSubview(swiftOpinionSelector) + contentView.addSubview(swiftUsageSelector) } required init?(coder aDecoder: NSCoder) { @@ -46,8 +46,8 @@ class AdjustToContainerView: BaseView { // Layout the contentView using the view's safeArea. contentView.pin.all().margin(safeArea) - languageSelectorView.pin.top().left().right().fitWidth() - swiftOpinionSelectorView.pin.below(of: languageSelectorView, aligned: .left).right().marginTop(10).fitWidth() - swiftUsageSelectorView.pin.below(of: swiftOpinionSelectorView, aligned: .left).right().marginTop(10).fitWidth() + languageSelectorView.pin.top().left().right().sizeToFit(.width) + swiftOpinionSelector.pin.below(of: languageSelectorView, aligned: .left).right().marginTop(10).sizeToFit(.width) + swiftUsageSelector.pin.below(of: swiftOpinionSelector, aligned: .left).right().marginTop(10).sizeToFit(.width) } } diff --git a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/Subviews/ChoiceSelectorView.swift b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/Subviews/ChoiceSelectorView.swift index c0579d23..a354ccba 100644 --- a/Example/PinLayoutSample/UI/Examples/AdjustToContainer/Subviews/ChoiceSelectorView.swift +++ b/Example/PinLayoutSample/UI/Examples/AdjustToContainer/Subviews/ChoiceSelectorView.swift @@ -63,10 +63,10 @@ class ChoiceSelectorView: UIView { if frame.width > 500 { // The UISegmentedControl is at the top-right corner and the label takes the remaining horizontal space. segmentedControl.pin.top().right().margin(margin) - textLabel.pin.top().left().before(of: segmentedControl).margin(margin).fitSize() + textLabel.pin.top().left().before(of: segmentedControl).margin(margin).sizeToFit(.width) } else { // The UISegmentedControl is placed below the label. - textLabel.pin.top().left().right().margin(margin).fitSize() + textLabel.pin.top().left().right().margin(margin).sizeToFit(.width) segmentedControl.pin.below(of: textLabel).right().margin(margin) } diff --git a/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift b/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift index e9b6fdda..df6bb943 100644 --- a/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift +++ b/Example/PinLayoutSample/UI/Examples/CollectionViewExample/HouseCell.swift @@ -80,13 +80,13 @@ class HouseCell: UICollectionViewCell { private func layout() { headerView.pin.top().horizontally().height(100) - nameLabel.pin.top().horizontally().margin(padding).fitWidth() + nameLabel.pin.top().horizontally().margin(padding).sizeToFit(.width) mainImage.pin.below(of: nameLabel).horizontally().height(300).marginTop(padding) footerView.pin.below(of: mainImage).horizontally() - priceLabel.pin.top().horizontally().margin(6, padding).fitWidth() - distanceLabel.pin.top().after(of: priceLabel).right().margin(6, padding).fitWidthHard() + priceLabel.pin.top().horizontally().margin(6, padding).sizeToFit(.width) + distanceLabel.pin.top().after(of: priceLabel).right().margin(6, padding).sizeToFit(.width) footerView.pin.height(max(priceLabel.frame.maxY, distanceLabel.frame.maxY) + 6) contentView.pin.height(footerView.frame.maxY) diff --git a/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift b/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift index f9035186..140ae952 100644 --- a/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift +++ b/Example/PinLayoutSample/UI/Examples/Intro/IntroView.swift @@ -64,7 +64,7 @@ class IntroView: BaseView { logo.pin.top().left().size(100).aspectRatio().marginTop(10) segmented.pin.after(of: logo, aligned: .top).right().marginLeft(10) - textLabel.pin.below(of: segmented, aligned: .left).width(of: segmented).pinEdges().marginTop(10).fitWidth() + textLabel.pin.below(of: segmented, aligned: .left).width(of: segmented).pinEdges().marginTop(10).sizeToFit(.width) separatorView.pin.below(of: [logo, textLabel], aligned: .left).right(to: segmented.edge.right).marginTop(10) } } diff --git a/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m b/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m index 79ca9479..7a45118a 100644 --- a/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m +++ b/Example/PinLayoutSample/UI/Examples/IntroObjectiveC/IntroObjectiveCView.m @@ -61,7 +61,7 @@ - (void) layoutSubviews { [[[[[[logo.pinObjc top] left] width:100] aspectRatio] marginWithTop:topLayoutGuide + 10 horizontal:10 bottom:10] layout]; [[[[segmented.pinObjc rightOf:logo aligned:VerticalAlignTop] right] marginHorizontal:10] layout]; - [[[[[[textLabel.pinObjc belowOf:segmented aligned:HorizontalAlignLeft] widthOf:segmented] pinEdges] marginTop:10] fitWidth] layout]; + [[[[[[textLabel.pinObjc belowOf:segmented aligned:HorizontalAlignLeft] widthOf:segmented] pinEdges] marginTop:10] sizeToFit:FitWidth] layout]; [[[[[separatorView.pinObjc belowOfViews:@[logo, textLabel] aligned:HorizontalAlignLeft] rightTo:segmented.edge.right] height:1] marginTop:10] layout]; } diff --git a/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift b/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift index fc9b9986..cfb8b552 100644 --- a/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift +++ b/Example/PinLayoutSample/UI/Examples/IntroRTL/IntroRTLView.swift @@ -69,7 +69,7 @@ class IntroRTLView: BaseView { logo.pin.top().start().size(100).aspectRatio().marginTop(10) segmented.pin.after(of: logo, aligned: .top).end().marginStart(10) - textLabel.pin.below(of: segmented, aligned: .start).width(of: segmented).pinEdges().marginTop(10).fitWidth() + textLabel.pin.below(of: segmented, aligned: .start).width(of: segmented).pinEdges().marginTop(10).sizeToFit(.width) separatorView.pin.below(of: [logo, textLabel], aligned: .start).end(to: segmented.edge.end).marginTop(10) } } diff --git a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift index 28d0575e..b694223d 100644 --- a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift +++ b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodCell.swift @@ -61,8 +61,8 @@ class MethodCell: UITableViewCell { fileprivate func layout() { iconImageView.pin.top().left().size(30).margin(margin) - nameLabel.pin.right(of: iconImageView, aligned: .center).right().marginHorizontal(margin).fitWidth() - descriptionLabel.pin.below(of: [iconImageView, nameLabel]).left().right().margin(margin).fitWidth() + nameLabel.pin.right(of: iconImageView, aligned: .center).right().marginHorizontal(margin).sizeToFit(.width) + descriptionLabel.pin.below(of: [iconImageView, nameLabel]).left().right().margin(margin).sizeToFit(.width) } override func sizeThatFits(_ size: CGSize) -> CGSize { diff --git a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift index d170789e..9bbdd331 100644 --- a/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift +++ b/Example/PinLayoutSample/UI/Examples/TableViewExample/Cells/MethodGroupHeader.swift @@ -43,6 +43,6 @@ class MethodGroupHeader: UITableViewHeaderFooterView { override func layoutSubviews() { super.layoutSubviews() - titleLabel.pin.left().right().vCenter().margin(10).fitWidth() + titleLabel.pin.left().right().vCenter().margin(10).sizeToFit(.width) } } diff --git a/PinLayout.podspec b/PinLayout.podspec index 06151e77..e6457a03 100644 --- a/PinLayout.podspec +++ b/PinLayout.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = "PinLayout" - s.version = "1.4.2" + s.version = "1.5.0" s.summary = "Fast Swift UIViews layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable & chainable." s.description = "Fast Swift UIViews layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable & chainable." diff --git a/README.md b/README.md index 63aad1da..5ef8855c 100644 --- a/README.md +++ b/README.md @@ -771,80 +771,69 @@ Set the view’s size to match the referenced view’s size
-### fitWidth() / fitHeight() / fitSize() / ... +### sizeToFit **Method:** -* **`fitWidth()`** -The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. - - Notes: - * The resulting width will never be bigger than the reference width but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width. - -* **`fitWidthHard()`** -Similar to `fitWidth()`, except that the resulting width will **always match the reference width**. - -* **`fitHeight()`** -The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. - - Notes: - * The resulting height will never be bigger than the reference height but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference height. -* **`fitHeightHard()`** -Similar to `fitHeight()`, except that the resulting height will **always match the reference width**. -* **`fitSize()`** -The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. -If the **width** has been pinned => the method **adjust the view's height** based on this width. -If the **height** has been pinned => the method **adjust the view's width** based on this height. -If the **width and the height** have been pinned => the method **adjust the view's size** based on both values. +* **`sizeToFit(_ fitType: FitType)`** +The method adjust the view's size based on the view's `sizeThatFits()` method result. + PinLayout will adjust either the view's width or height based on the `fitType` parameter value. Notes: - * The resulting width/height will never be bigger than the pinned width/height but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width/height. - -* **`fitSizeHard()`** -Similar to `fitSize()`, except that the resulting width/height will **always match the pinned width/height**.. - + * If margin rules apply, margins will be applied when determining the reference dimension (width/height). + * The resulting size will always respect `minWidth` / `maxWidth` / `minHeight` / `maxHeight`. + + **Parameter `fitType`:** Identify the reference dimension (width / height) that will be used to adjust the view's size. + * **`.width`**: The method adjust the view's size based on the **reference width**. + * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), + the **reference width will be determined by these properties**, else the **current view's width** + will be used. + * The resulting width will always **match the reference width**. + + * **`.height`**: The method adjust the view's size based on the **reference height**. + * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), + the **reference height will be determined by these properties**, else the **current view's height** + will be used. + * The resulting height will always **match the reference height**. + + * **`.widthFlexible`**: Similar to `.width`, except that PinLayout won't constrain the resulting width to match the reference width. The resulting width may be smaller of bigger depending on the view's sizeThatFits(..) method result. For example a single line UILabel may returns a smaller width if its string is smaller than the reference width. + + * **`.heightFlexible`**: Similar to `.height`, except that PinLayout won't constrain the resulting height to match the reference height. The resulting height may be smaller of bigger depending on the view's sizeThatFits(..) method result. + ###### Usage examples: -```javascript - // Adjust the view's height based on a width of 100 pixels. - view.pin.width(100).fitWidth() + +```swift + // Adjust the view's size based on a width of 100 pixels. + // The resulting width will always match the pinned property `width(100)`. + view.pin.width(100).sizeToFit(.width) - // Adjust the view's height based on view's current width. - view.pin.fitWidth() + // Adjust the view's size based on view's current width. + // The resulting width will always match the view's original width. + // The resulting height will never be bigger than the specified `maxHeight`. + view.pin.sizeToFit(.width).maxHeight(100) - // Adjust the labels's height based on a width of 100 pixels. The width will be 100 pixels even - // if the label text size is smaller. - label.pin.width(100).fitWidthHard() - - // Adjust the view's width based on a height of 100 pixels. - view.pin.height(100).fitHeight() - - // Adjust the view's width based on view's current height. - view.pin.fitHeight() - - // Adjust the label's size based on a width of 200 pixels - label.pin.width(200).fitSize() - - // Adjust the label's size based on the computed view's width - label.pin.left().right().fitSize() - - // WRONG, neither the width nor the height can be determined, fitSize() won't be applied - label.pin.top().left().fitSize() + // Adjust the view's size based on 100% of the superview's height. + // The resulting height will always match the pinned property `height(100%)`. + view.pin.height(100%).sizeToFit(.height) + + // Adjust the view's size based on view's current height. + // The resulting width will always match the view's original height. + view.pin.sizeToFit(.height) + + // Since `.widthFlexible` has been specified, its possible that the resulting + // width will be smaller or bigger than 100 pixels, based of the label's sizeThatFits() + // method result. + label.pin.width(100).sizeToFit(.widthFlexible) ``` ###### Example: -The following example layout the UILabel on the right side of the UIImageView with a margin of 10px all around and also adjust the UILabel’t height to fit the text size. Note on the result that the UILabel’s height has changed to fit its content. +The following example layout the UILabel on the right side of the UIImageView with a margin of 10px all around and also adjust the UILabel’t height to fit the text size. Note that the UILabel’s height has changed to fit its content. -![](docs/images/pinlayout-fitSize.png) +![](docs/images/pinlayout-sizeToFit.png) ```javascript - label.pin.after(of: image, aligned: .top).right().marginHorizontal(10).fitWidth() + label.pin.after(of: image, aligned: .top).right().marginHorizontal(10).sizeToFit(.width) ``` @@ -854,7 +843,7 @@ The following example layout the UILabel on the right side of the UIImageView wi PinLayout has methods to set the view’s minimum and maximum width, and minimum and maximum height. -:pushpin: minWidth/maxWidth & minHeight/maxHeight have the highest priority. Higher than sizes (width/height/size, fitWidth/fitHeight/fitSize, aspectRatio) and edges positioning (top/left/bottom/right). Their values are always fullfilled. +:pushpin: minWidth/maxWidth & minHeight/maxHeight have the highest priority. Higher than sizes (width/height/size, sizeToFit, aspectRatio) and edges positioning (top/left/bottom/right). Their values are always fullfilled. **Methods:** diff --git a/Sources/ObjectiveC/PinLayoutObjC.swift b/Sources/ObjectiveC/PinLayoutObjC.swift index 606d4bde..79ff7e64 100644 --- a/Sources/ObjectiveC/PinLayoutObjC.swift +++ b/Sources/ObjectiveC/PinLayoutObjC.swift @@ -229,12 +229,8 @@ public extension UIView { */ @discardableResult func aspectRatio() -> PinLayoutObjC + @discardableResult func sizeToFit(_ fitType: Fit) -> PinLayoutObjC @discardableResult func fitSize() -> PinLayoutObjC - @discardableResult func fitSizeHard() -> PinLayoutObjC - @discardableResult func fitWidth() -> PinLayoutObjC - @discardableResult func fitWidthHard() -> PinLayoutObjC - @discardableResult func fitHeight() -> PinLayoutObjC - @discardableResult func fitHeightHard() -> PinLayoutObjC // // MARK: Margins @@ -332,5 +328,12 @@ public extension UIView { /// - Returns: PinLayout @discardableResult func pinEdges() -> PinLayoutObjC } + +@objc public enum Fit: Int { + case width + case height + case widthFlexible + case heightFlexible +} #endif diff --git a/Sources/ObjectiveC/PinLayoutObjCImpl.swift b/Sources/ObjectiveC/PinLayoutObjCImpl.swift index 0bbf397d..8a3efc19 100644 --- a/Sources/ObjectiveC/PinLayoutObjCImpl.swift +++ b/Sources/ObjectiveC/PinLayoutObjCImpl.swift @@ -604,28 +604,15 @@ import UIKit return self } - public func fitSizeHard() -> PinLayoutObjC { - impl?.fitSizeHard() - return self - } - - public func fitWidth() -> PinLayoutObjC { - impl?.fitWidth() - return self - } - - public func fitWidthHard() -> PinLayoutObjC { - impl?.fitWidthHard() - return self - } - - public func fitHeight() -> PinLayoutObjC { - impl?.fitHeight() - return self - } - - public func fitHeightHard() -> PinLayoutObjC { - impl?.fitHeightHard() + public func sizeToFit(_ fitType: Fit) -> PinLayoutObjC { + let type: FitType + switch fitType { + case .width: type = .width + case .height: type = .height + case .widthFlexible: type = .widthFlexible + case .heightFlexible: type = .heightFlexible + } + impl?.sizeToFit(type) return self } diff --git a/Sources/PinLayout.swift b/Sources/PinLayout.swift index 2c360fe4..217893ac 100644 --- a/Sources/PinLayout.swift +++ b/Sources/PinLayout.swift @@ -118,7 +118,6 @@ public extension UIView { /// PinLayout interface public protocol PinLayout { - // // MARK: Layout using distances from superview’s edges // @@ -328,127 +327,67 @@ public protocol PinLayout { @discardableResult func aspectRatio() -> PinLayout /** - The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. - The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. + The method adjust the view's size based on the view's `sizeThatFits()` method result. + PinLayout will adjust either the view's width or height based on the `fitType` parameter value. Notes: - * The resulting width will never be bigger than the reference width but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width. - - Example: - ``` - // Adjust the view's height based on a width of 100 pixels. - view.pin.width(100).fitWidth() + * If margin rules apply, margins will be applied when determining the reference dimension (width/height). + * The resulting size will always respect `minWidth` / `maxWidth` / `minHeight` / `maxHeight`. - // Adjust the view's height based on view's current width. - view.pin.fitWidth() - ``` - */ - @discardableResult func fitWidth() -> PinLayout - - /** - The method **adjust the view's height** based on either the **current view's width** or the **width determined by PinLayout**. - The method computes the height based on the result of the view's `sizeThatFits(: CGSize)` method. + - Parameter fitType: Identify the reference dimension (width / height) that will be used + to adjust the view's size: - Notes: - * The resulting width will always **match the reference width**. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width. - - Example: - `view.pin.width(100).fitWidthHard()`. + .width: The method adjust the view's size based on the **reference width**. + * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), + the **reference width will be determined by these properties**, else the **current view's width** + will be used. + * The resulting width will always **match the reference width**. - In this example PinLayout will call the view's sizeThatFits() method with a width of - 100 pixels and adjust the height accordingly. Note that if sizeThatFits() returns a - bigger width (ex: 120 pixels) or a smaller width (ex: 80 pixels), PinLayout will - constrain the width to 100. - */ - @discardableResult func fitWidthHard() -> PinLayout - - /** - The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. - The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. + .height: The method adjust the view's size based on the **reference height**. + * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), + the **reference height will be determined by these properties**, else the **current view's height** + will be used. + * The resulting height will always **match the reference height**. - Notes: - * The resulting height will never be bigger than the reference height but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference height. - - Example: - ``` - // Adjust the view's width based on a height of 100 pixels. - view.pin.height(100).fitHeight() + .widthFlexible: Similar to `.width`, except that PinLayout won't constrain the resulting width to + match the reference width. The resulting width may be smaller of bigger depending on the view's + sizeThatFits(..) method result. For example a single line UILabel may returns a smaller width if its + string is smaller than the reference width. - // Adjust the view's width based on view's current height. - view.pin.fitHeight() - ``` - */ - @discardableResult func fitHeight() -> PinLayout - - /** - The method **adjust the view's width** based on either the **current view's height** or the **height determined by PinLayout**. - The method computes the width based on the result of the view's `sizeThatFits(: CGSize)` method. + .heightFlexible: Similar to `.height`, except that PinLayout won't constrain the resulting height to + match the reference height. The resulting height may be smaller of bigger depending on the view's + sizeThatFits(..) method result. - Notes: - * The resulting height will always match the reference height. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference height. - - Example: - `view.pin.height(100).fitHeightHard()`. + Examples: - In this example PinLayout will call the view's sizeThatFits() method with a height of - 100 pixels and adjust the width accordingly. Note that if sizeThatFits() returns a - bigger height (ex: 120 pixels) or a smaller height (ex: 80 pixels), PinLayout will - constrain the height to 100. - */ - @discardableResult func fitHeightHard() -> PinLayout - - /** - The method **adjust the view's width and height** based on either the **pinned height** or **pinned width**. - The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. + ``` + // Adjust the view's size based on a width of 100 pixels. + // The resulting width will always match the pinned property `width(100)`. + view.pin.width(100).sizeToFit(.width) - If the width has been pinned, the method **adjust the view's height** based on this width. - If the height has been pinned, the method **adjust the view's width** based on this height. - If the width and the height have been pinned, the method **adjust the view's size** based on both values. + // Adjust the view's size based on view's current width. + // The resulting width will always match the view's original width. + // The resulting height will never be bigger than the specified `maxHeight`. + view.pin.sizeToFit(.width).maxHeight(100) - Notes: - * The resulting width/height will never be bigger than the pinnded width/height, but could be smaller. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width/height. - - Example: - `view.pin.width(100).fitSize()`. + // Adjust the view's size based on 100% of the superview's height. + // The resulting height will always match the pinned property `height(100%)`. + view.pin.height(100%).sizeToFit(.height) - In this example PinLayout will call the view's sizeThatFits() method with a width of 100. - If sizeThatFits() returns a bigger width (ex: 120 pixels), PinLayout will constrain the width to 100. - If sizeThatFits() returns a smaller width (ex: 80 pixels), this smaller width will be use. + // Adjust the view's size based on view's current height. + // The resulting width will always match the view's original height. + view.pin.sizeToFit(.height) + + // Since `.widthFlexible` has been specified, its possible that the resulting + // width will be smaller or bigger than 100 pixels, based of the label's sizeThatFits() + // method result. + label.pin.width(100).sizeToFit(.widthFlexible) + ``` */ - @discardableResult func fitSize() -> PinLayout + @discardableResult func sizeToFit(_ fitType: FitType) -> PinLayout - /** - The method **adjust the view's width and height** based on either the pinned height or width. - The method computes the width and height based on the result of the view's `sizeThatFits(: CGSize)` method. - - If the width has been pinned, the method **adjust the view's height** based on this width. - If the height has been pinned, the method **adjust the view's width** based on this height. - If the width and the height have been pinned, the method **adjust the view's size** based on both values. - - Notes: - * The resulting width/height will **always match the pinned width/height**. - * The resulting size will always respect minWidth/maxWidth/minHeight/maxHeight. - * If margin rules apply, margins will be applied when determining the reference width/height. - - Example: - `view.pin.width(100).fitSizeHard()`. - - In this example PinLayout will call the view's sizeThatFits() method with a width of - 100 pixels and adjust the height accordingly. Note that if sizeThatFits() returns a - bigger width (ex: 120 pixels) or a smaller width (ex: 80 pixels), PinLayout will - constrain the width to 100. - */ - @discardableResult func fitSizeHard() -> PinLayout + @available(*, deprecated: 1.5.0, message: "fitSize() is deprecated, please use sizeToFit(fitType: FitType)") + @discardableResult func fitSize() -> PinLayout // // MARK: Margins @@ -581,5 +520,38 @@ public protocol PinLayout { /// UIView's vertical edges (top/bottom) definition @objc public protocol VerticalEdge { } - + +public enum FitType { + /** + **Adjust the view's height** based on the reference width. + * If properties related to the width have been pinned (e.g: width, left & right, margins), + the **reference width will be determined by these properties**, else the **current view's width** + will be used. + * The resulting width will always **match the reference width**. + */ + case width + /** + **Adjust the view's width** based on the reference height. + * If properties related to the height have been pinned (e.g: height, top & bottom, margins), + the reference height will be determined by these properties, else the **current view's height** + will be used. + * The resulting height will always **match the reference height*. + */ + case height + + /** + Similar to `.width`, except that PinLayout won't constrain the resulting width to + match the reference width. The resulting width may be smaller of bigger depending on the view's + sizeThatFits(..) method result. For example a single line UILabel may returns a smaller width if its + string is smaller than the reference width. + */ + case widthFlexible + /** + Similar to `.height`, except that PinLayout won't constrain the resulting height to + match the reference height. The resulting height may be smaller of bigger depending on the view's + sizeThatFits(..) method result. + */ + case heightFlexible +} + #endif diff --git a/Sources/PinLayoutImpl.swift b/Sources/PinLayoutImpl.swift index a37265fd..bbd50d0b 100644 --- a/Sources/PinLayoutImpl.swift +++ b/Sources/PinLayoutImpl.swift @@ -41,11 +41,11 @@ class PinLayoutImpl: PinLayout { internal var maxHeight: CGFloat? internal var fitType: FitType? - internal var shouldConstrainFit = false + internal var legacyFitSize = false internal var _aspectRatio: CGFloat? internal var shouldKeepViewDimension: Bool { - return fitType == nil && _aspectRatio == nil + return fitType == nil && !legacyFitSize && _aspectRatio == nil } internal var marginTop: CGFloat? @@ -748,35 +748,15 @@ class PinLayoutImpl: PinLayout { } @discardableResult - func fitWidth() -> PinLayout { - return setFitSize(fitType: .width, constrain: false, { return "fitWidth()" }) + func sizeToFit(_ fitType: FitType) -> PinLayout { + return setFitSize(fitType: fitType, { return "sizeToFit(\(fitType.name))" }) } - @discardableResult - func fitWidthHard() -> PinLayout { - return setFitSize(fitType: .width, constrain: true, { return "fitWidthHard()" }) - } - - @discardableResult - func fitHeight() -> PinLayout { - return setFitSize(fitType: .height, constrain: false, { return "fitHeight()" }) - } - - @discardableResult - func fitHeightHard() -> PinLayout { - return setFitSize(fitType: .height, constrain: true, { return "fitHeightHard()" }) - } - @discardableResult func fitSize() -> PinLayout { - return setFitSize(fitType: .size, constrain: false, { return "fitSize()" }) - } - - @discardableResult - func fitSizeHard() -> PinLayout { - return setFitSize(fitType: .size, constrain: true, { return "fitSizeHard()" }) + return setFitSize(fitType: nil, { return "fitSize()" }) } - + @discardableResult func justify(_ value: HorizontalAlign) -> PinLayout { justify = value @@ -904,14 +884,19 @@ class PinLayoutImpl: PinLayout { // MARK: Private methods // extension PinLayoutImpl { - internal func setFitSize(fitType: FitType, constrain: Bool, _ context: Context) -> PinLayout { + internal func setFitSize(fitType: FitType?, _ context: Context) -> PinLayout { if let aspectRatio = _aspectRatio { warnConflict(context, ["aspectRatio": aspectRatio]) + } else if fitType != nil && legacyFitSize { + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with fitSize().") } else if let currentFitType = self.fitType, currentFitType != fitType { - warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with \(currentFitType.name).") + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with sizeToFit(\(currentFitType.name)).") } else { - self.fitType = fitType - shouldConstrainFit = constrain + if fitType == nil { + legacyFitSize = true + } else { + self.fitType = fitType + } } return self } @@ -919,7 +904,9 @@ extension PinLayoutImpl { @discardableResult internal func setAspectRatio(_ ratio: CGFloat, context: Context) -> PinLayout { if let fitType = fitType { - warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with \(fitType.name).") + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with sizeToFit(\(fitType.name)).") + } else if legacyFitSize { + warn("PinLayout Conflict: \(context()) won't be applied since it conflicts with fitSize().") } else if ratio <= 0 { warnWontBeApplied("the aspectRatio (\(ratio)) must be greater than zero.", context) } else { @@ -1102,54 +1089,67 @@ extension PinLayoutImpl { var width = computeWidth() var height = computeHeight() - if let fitType = fitType { - if fitType == .size && width == nil && height == nil { + if legacyFitSize { + if width == nil && height == nil { warn("fitSize() won't be applied, neither the width nor the height can be determined.") } else { var fitWidth = CGFloat.greatestFiniteMagnitude var fitHeight = CGFloat.greatestFiniteMagnitude - // Apply min/max width/height before calling sizeThatFits() ... and reapply them after. - switch fitType { - case .size: - if let width = applyMinMax(toWidth: width) { - fitWidth = width - } - if let height = applyMinMax(toHeight: height) { - fitHeight = height - } - case .width: - if let width = applyMinMax(toWidth: width) { - fitWidth = width - } else { - fitWidth = view.frame.width - } - case .height: - if let height = applyMinMax(toHeight: height) { - fitHeight = height - } else { - fitHeight = view.frame.height - } + if let width = applyMinMax(toWidth: width) { + fitWidth = width + } + if let height = applyMinMax(toHeight: height) { + fitHeight = height } let sizeThatFits = view.sizeThatFits(CGSize(width: fitWidth, height: fitHeight)) - if fitWidth != .greatestFiniteMagnitude && - (sizeThatFits.width > fitWidth || - (shouldConstrainFit && sizeThatFits.width < fitWidth)) { + if fitWidth != .greatestFiniteMagnitude && (sizeThatFits.width > fitWidth) { width = fitWidth } else { width = sizeThatFits.width } - if fitHeight != .greatestFiniteMagnitude && - (sizeThatFits.height > fitHeight || - (shouldConstrainFit && sizeThatFits.height < fitHeight)) { + if fitHeight != .greatestFiniteMagnitude && (sizeThatFits.height > fitHeight) { height = fitHeight } else { height = sizeThatFits.height } } + } else if let fitType = fitType { + var fitWidth = CGFloat.greatestFiniteMagnitude + var fitHeight = CGFloat.greatestFiniteMagnitude + + // Apply min/max width/height before calling sizeThatFits() ... and reapply them after. + switch fitType { + case .width, .widthFlexible: + if let width = applyMinMax(toWidth: width) { + fitWidth = width + } else { + fitWidth = view.frame.width + } + case .height, .heightFlexible: + if let height = applyMinMax(toHeight: height) { + fitHeight = height + } else { + fitHeight = view.frame.height + } + } + + let sizeThatFits = view.sizeThatFits(CGSize(width: fitWidth, height: fitHeight)) + + if fitWidth != .greatestFiniteMagnitude { + width = fitType.isFlexible ? sizeThatFits.width : fitWidth + } else { + width = sizeThatFits.width + } + + if fitHeight != .greatestFiniteMagnitude { + height = fitType.isFlexible ? sizeThatFits.height : fitHeight + } else { + height = sizeThatFits.height + } } else if let aspectRatio = _aspectRatio { if width == nil && height == nil { warn("aspectRatio won't be applied, neither the width nor the height can be determined.") diff --git a/Sources/TypesImpl.swift b/Sources/TypesImpl.swift index 815de9d5..13d6168f 100644 --- a/Sources/TypesImpl.swift +++ b/Sources/TypesImpl.swift @@ -186,20 +186,19 @@ extension Percent { } } -enum FitType { - case size - case width - case height - +internal extension FitType { var name: String { switch self { - case .size: return "fitSize()" - case .width: return "fitWidth()" - case .height: return "fitHeight()" + case .width: return ".width" + case .height: return ".height" + case .widthFlexible: return ".widthFlexible" + case .heightFlexible: return ".heightFlexible" } } + + var isFlexible: Bool { + return self == .widthFlexible || self == .heightFlexible + } } - - #endif diff --git a/Tests/AdjustSizeSpec.swift b/Tests/AdjustSizeSpec.swift index de4b866e..ebe9bd69 100644 --- a/Tests/AdjustSizeSpec.swift +++ b/Tests/AdjustSizeSpec.swift @@ -220,9 +220,14 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) } - it("should adjust the size of aView by calling fitSize() method") { - aView.pin.size(CGSize(width: 20, height: 100)).fitSizeHard() - expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 100.0))) + it("should adjust the size of aView by calling sizeToFit(.height) method") { + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.height) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 16.0, height: 100.0))) + } + + it("should adjust the size of aView by calling sizeToFit(.width) method") { + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.width) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) } it("should adjust the size of aView by calling fitSize() method") { @@ -444,11 +449,6 @@ class AdjustSizeSpec: QuickSpec { expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 8.5))) } - it("should adjust the size with fitSizeHard()") { - aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginTop(10).marginBottom(10).fitSizeHard() - expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 180.0))) - } - it("should adjust the size with fitSize()") { aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginTop(10).marginBottom(10).fitSize() expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 190.0, height: 8.5))) @@ -468,11 +468,6 @@ class AdjustSizeSpec: QuickSpec { aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginRight(10).marginTop(10).marginBottom(10).fitSize() expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 9.0))) } - - it("should adjust the size with fitSizeHard()") { - aView.pin.top(20).left(20).bottom(180).right(180).marginLeft(10).marginRight(10).marginTop(10).marginBottom(10).fitSizeHard() - expect(aView.frame).to(equal(CGRect(x: 30.0, y: 30.0, width: 180.0, height: 180.0))) - } } describe("the result of the fitSize() with justify() or align()") { @@ -535,11 +530,6 @@ class AdjustSizeSpec: QuickSpec { aView.pin.top(0).height(70).width(100).fitSize() expect(aView.frame).to(equal(CGRect(x: 140.0, y: 0.0, width: 100.0, height: 16.0))) } - - it("should adjust the size of aView by calling fitSizeHard()") { - aView.pin.top(0).height(70).width(100).fitSizeHard() - expect(aView.frame).to(equal(CGRect(x: 140.0, y: 0.0, width: 100.0, height: 70.0))) - } it("should adjust the size of aView by calling fitSize() method") { aView.pin.width(100).fitSize() @@ -615,61 +605,66 @@ class AdjustSizeSpec: QuickSpec { // // fitHeight && fitWidth // - describe("the result of the fitHeight() && fitWidth") { + describe("the result of the sizeToFit(.height) && sizeToFit(.width)") { it("should warn method") { - aView.pin.width(100).fitSize().fitWidth() - expect(_pinlayoutUnitTestLastWarning).to(contain(["fitWidth()", "won't be applied", "conflicts with fitSize()"])) + aView.pin.width(100).fitSize().sizeToFit(.width) + expect(_pinlayoutUnitTestLastWarning).to(contain(["sizeToFit(.width)", "won't be applied", "conflicts with fitSize()"])) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) } it("should warn method") { - aView.pin.width(100).fitSize().fitHeight() - expect(_pinlayoutUnitTestLastWarning).to(contain(["fitHeight()", "won't be applied", "conflicts with fitSize()"])) + aView.pin.width(100).fitSize().sizeToFit(.height) + expect(_pinlayoutUnitTestLastWarning).to(contain(["sizeToFit(.height)", "won't be applied", "conflicts with fitSize()"])) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) } it("should warn method") { - aView.pin.width(100).aspectRatio(2).fitWidth() - expect(_pinlayoutUnitTestLastWarning).to(contain(["fitWidth()", "won't be applied", "aspectRatio: 2"])) + aView.pin.width(100).aspectRatio(2).sizeToFit(.width) + expect(_pinlayoutUnitTestLastWarning).to(contain(["sizeToFit(.width)", "won't be applied", "aspectRatio: 2"])) + } + + it("should warn method") { + aView.pin.sizeToFit(.width).aspectRatio(2) + expect(_pinlayoutUnitTestLastWarning).to(contain([" aspectRatio(2.0)", "won't be applied", "conflicts with sizeToFit(.width)"])) } it("should warn method") { - aView.pin.fitWidth().aspectRatio(2) - expect(_pinlayoutUnitTestLastWarning).to(contain([" aspectRatio(2.0)", "won't be applied", "conflicts with fitWidth()"])) + aView.pin.width(100).fitSize().aspectRatio(2) + expect(_pinlayoutUnitTestLastWarning).to(contain([" aspectRatio(2.0)", "won't be applied", "conflicts with fitSize()"])) } } // // fitWidth // - describe("the result of the fitWidth()") { + describe("the result of the sizeToFit(.width)") { it("should adjust the aView") { - aView.pin.fitWidth() + aView.pin.sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) } it("should adjust the aView") { - aView.pin.width(50).fitWidth() + aView.pin.width(50).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 32.0))) } it("should adjust the aView") { - aView.pin.minWidth(160).fitWidth() + aView.pin.minWidth(160).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 160.0, height: 10.0))) } it("should adjust the aView") { - aView.pin.maxWidth(50).fitWidth() + aView.pin.maxWidth(50).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 32.0))) } it("should adjust the aView") { - aView.pin.size(CGSize(width: 20, height: 100)).fitWidth() + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 80.0))) } it("should adjust the aView") { - aView.pin.size(CGSize(width: 20, height: 100)).fitHeight() + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 16.0, height: 100.0))) } } @@ -677,83 +672,107 @@ class AdjustSizeSpec: QuickSpec { // // fitHeight // - describe("the result of the fitHeight()") { + describe("the result of the sizeToFit(.height)") { it("should adjust the aView") { - aView.pin.fitHeight() + aView.pin.sizeToFit(.height) expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 27, height: 60.0), within: 0.5)) } it("should adjust the aView") { - aView.pin.height(50).fitHeight() + aView.pin.height(50).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) } it("should adjust the aView") { - aView.pin.minHeight(160).fitHeight() + aView.pin.minHeight(160).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 10.0, height: 160.0))) } it("should adjust the aView") { - aView.pin.maxHeight(50).fitHeight() + aView.pin.maxHeight(50).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) } } // - // fitWidthHard + // sizeToFit(.width) // - describe("the result of the fitWidthHard()") { + describe("the result of the sizeToFit(.width) when the value return by sizeThatFits() is smaller then the width") { it("should adjust the aView") { - aView.pin.fitWidth() + aView.pin.sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 100.0, height: 16.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.width(50).fitWidth() + aView.pin.width(50).sizeToFit(.width) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 40.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.width(50).sizeToFit(.widthFlexible) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 40.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.width(50).fitWidthHard() + aView.pin.width(50).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 40.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.size(CGSize(width: 20, height: 100)).fitWidth() + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.width) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 160.0))) + } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.widthFlexible) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 10.0, height: 160.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.size(CGSize(width: 20, height: 100)).fitWidthHard() + aView.pin.size(CGSize(width: 20, height: 100)).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 20.0, height: 160.0))) } } // - // fitHeightHard + // sizeToFit(.height) // - describe("the result of the fitHeightHard()") { + describe("the result of the sizeToFit(.height) when the value return by sizeThatFits() is smaller then the width") { + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.sizeToFit(.height) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 60.0))) + } + it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.fitHeight() + aView.pin.sizeToFit(.heightFlexible) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.fitHeightHard() + aView.pin.sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 60.0))) } + + it("should adjust the aView") { + aView.sizeThatFitSizeOffset = -10 + aView.pin.sizeToFit(.heightFlexible) + expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) + } } // - // fitSizeHard + // fitSize() / sizeToFit(..) // - describe("the result of the fitSizeHard()") { + describe("the result of the fitSize()") { it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 aView.pin.width(50).fitSize() @@ -762,24 +781,24 @@ class AdjustSizeSpec: QuickSpec { it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.width(50).fitSizeHard() + aView.pin.width(50).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 40.0))) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = 10 - aView.pin.width(50).fitSize() + aView.pin.width(50).sizeToFit(.width) expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 26.6), within: 0.5)) } it("should adjust the aView") { aView.sizeThatFitSizeOffset = 10 - aView.pin.width(50).fitSizeHard() + aView.pin.width(50).sizeToFit(.width) expect(aView.frame).to(beCloseTo(CGRect(x: 140.0, y: 100.0, width: 50.0, height: 26.6), within: 0.5)) } it("should adjust the aView") { - aView.pin.height(50).fitSize() + aView.pin.height(50).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 32.0, height: 50.0))) } @@ -791,7 +810,7 @@ class AdjustSizeSpec: QuickSpec { it("should adjust the aView") { aView.sizeThatFitSizeOffset = -10 - aView.pin.height(50).fitSizeHard() + aView.pin.height(50).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 50.0))) } @@ -803,7 +822,7 @@ class AdjustSizeSpec: QuickSpec { it("should adjust the aView") { aView.sizeThatFitSizeOffset = 10 - aView.pin.height(30).fitSizeHard() + aView.pin.height(30).sizeToFit(.height) expect(aView.frame).to(equal(CGRect(x: 140.0, y: 100.0, width: 40.0, height: 30.0))) } } diff --git a/Tests/MinMaxWidthHeightSpec.swift b/Tests/MinMaxWidthHeightSpec.swift index cfd9bd8c..90cf879d 100644 --- a/Tests/MinMaxWidthHeightSpec.swift +++ b/Tests/MinMaxWidthHeightSpec.swift @@ -278,7 +278,7 @@ class MinMaxWidthHeightSpec: QuickSpec { it("should adjust the width when using fitSizeHard") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().width(100%).maxWidth(250).maxHeight(20).minHeight(14).fitSizeHard() + aView.pin.left().width(100%).maxWidth(250).maxHeight(20).minHeight(14).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 14))) } @@ -290,43 +290,49 @@ class MinMaxWidthHeightSpec: QuickSpec { it("should adjust the width when using fitSizeHard") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().width(100%).maxWidth(250).height(14).maxHeight(20).fitSizeHard() - expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 14.0))) + aView.pin.left().width(100%).maxWidth(250).height(14).maxHeight(20).sizeToFit(.width) + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) } - + + it("should adjust the width when using fitSizeHard") { + aView.sizeThatFitsExpectedArea = 40 * 40 + aView.pin.left().width(100%).maxWidth(250).height(14).maxHeight(5).sizeToFit(.width) + expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 5))) + } + it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().width(100%).maxWidth(250).fitSize().justify(.left) + aView.pin.left().width(100%).maxWidth(250).sizeToFit(.width).justify(.left) expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) } it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().right().width(100%).maxWidth(250).fitSize().justify(.right) + aView.pin.left().right().width(100%).maxWidth(250).sizeToFit(.width).justify(.right) expect(aView.frame).to(equal(CGRect(x: 150.0, y: 100.0, width: 250.0, height: 6.5))) } it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().right().maxWidth(250).fitSize().justify(.center) + aView.pin.left().right().maxWidth(250).sizeToFit(.width).justify(.center) expect(aView.frame).to(equal(CGRect(x: 75.0, y: 100.0, width: 250.0, height: 6.5))) } it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().width(10).minWidth(250).fitSize() + aView.pin.left().width(10).minWidth(250).sizeToFit(.width) expect(aView.frame).to(equal(CGRect(x: 0.0, y: 100.0, width: 250.0, height: 6.5))) } it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().right().width(10).minWidth(250).fitSize().justify(.center) + aView.pin.left().right().width(10).minWidth(250).sizeToFit(.width).justify(.center) expect(aView.frame).to(equal(CGRect(x: 75.0, y: 100.0, width: 250.0, height: 6.5))) } it("should adjust the width when using fitSize") { aView.sizeThatFitsExpectedArea = 40 * 40 - aView.pin.left().right().width(10).minWidth(250).marginLeft(10).fitSize().justify(.center) + aView.pin.left().right().width(10).minWidth(250).marginLeft(10).sizeToFit(.width).justify(.center) expect(aView.frame).to(equal(CGRect(x: 80.0, y: 100.0, width: 250.0, height: 6.5))) } diff --git a/docs/images/pinlayout-fitSize.png b/docs/images/pinlayout-sizeToFit.png similarity index 100% rename from docs/images/pinlayout-fitSize.png rename to docs/images/pinlayout-sizeToFit.png From a729350d9eef0135aeb284c11b4b34e2a30728f5 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Sun, 19 Nov 2017 18:38:57 -0500 Subject: [PATCH 7/8] Update readme.md --- README.md | 20 ++++++++------------ Sources/PinLayout.swift | 4 ++-- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5ef8855c..13384223 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ override func layoutSubviews() { logo.pin.top().left().size(100).aspectRatio().margin(10) segmented.pin.after(of: logo, aligned: .top).right().marginHorizontal(10) - textLabel.pin.below(of: segmented, aligned: .left).right().marginTop(10).marginRight(10).fitWidth() + textLabel.pin.below(of: segmented, aligned: .left).right().marginTop(10).marginRight(10).sizeToFit(.width) separatorView.pin.below(of: [logo, textLabel], aligned: .left).right(to: segmented.edge.right).marginTop(10) } ``` @@ -109,11 +109,11 @@ This example shows how easily PinLayout can adjust its layout based on the view' let margin: CGFloat = 12 if frame.width < 500 { - textLabel.pin.top().left().right().margin(margin).fitWidth() + textLabel.pin.top().left().right().margin(margin).sizeToFit(.width) segmentedControl.pin.below(of: textLabel).right().margin(margin) } else { segmentedControl.pin.top().right().margin(margin) - textLabel.pin.top().left().before(of: segmentedControl).margin(margin).fitWidth() + textLabel.pin.top().left().before(of: segmentedControl).margin(margin).sizeToFit(.width) } ``` @@ -786,15 +786,11 @@ The method adjust the view's size based on the view's `sizeThatFits()` method re **Parameter `fitType`:** Identify the reference dimension (width / height) that will be used to adjust the view's size. * **`.width`**: The method adjust the view's size based on the **reference width**. - * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), - the **reference width will be determined by these properties**, else the **current view's width** - will be used. + * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), the **reference width will be determined by these properties**, if not the **current view's width** will be used. * The resulting width will always **match the reference width**. * **`.height`**: The method adjust the view's size based on the **reference height**. - * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), - the **reference height will be determined by these properties**, else the **current view's height** - will be used. + * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), the **reference height will be determined by these properties**, if not the **current view's height** will be used. * The resulting height will always **match the reference height**. * **`.widthFlexible`**: Similar to `.width`, except that PinLayout won't constrain the resulting width to match the reference width. The resulting width may be smaller of bigger depending on the view's sizeThatFits(..) method result. For example a single line UILabel may returns a smaller width if its string is smaller than the reference width. @@ -1192,14 +1188,14 @@ Warnings can be disabled also in debug mode by setting the boolean Pin.logWarnin ## PinLayout style guide * You should always specifies methods in the same order, it makes layout lines easier to understand. Here is our prefered ordering: -`view.pin.[EDGE|ANCHOR|RELATIVE].[WIDTH|HEIGHT|SIZE].[pinEdges()].[MARGINS].[fitWidth()/fitHeight()]` +`view.pin.[EDGE|ANCHOR|RELATIVE].[WIDTH|HEIGHT|SIZE].[pinEdges()].[MARGINS].[sizeToFit()]` - This order reflect the logic inside PinLayout. `pinEdges()` is applied before margins and margins are applied before `fitWidth()/fitHeight()`. + This order reflect the logic inside PinLayout. `pinEdges()` is applied before margins and margins are applied before `sizeToFit()`. ```swift view.pin.top().left(10%).margin(10, 12, 10, 12) view.pin.left().width(100%).pinEdges().marginHorizontal(12) - view.pin.left().right().margin(0, 12).fitWidth() + view.pin.left().right().margin(0, 12).sizeToFit(.width) view.pin.width(100).height(100%) ``` diff --git a/Sources/PinLayout.swift b/Sources/PinLayout.swift index 217893ac..fe34c7d2 100644 --- a/Sources/PinLayout.swift +++ b/Sources/PinLayout.swift @@ -339,13 +339,13 @@ public protocol PinLayout { .width: The method adjust the view's size based on the **reference width**. * If properties related to the width have been pinned (e.g: width, left & right, margins, ...), - the **reference width will be determined by these properties**, else the **current view's width** + the **reference width will be determined by these properties**, if not the **current view's width** will be used. * The resulting width will always **match the reference width**. .height: The method adjust the view's size based on the **reference height**. * If properties related to the height have been pinned (e.g: height, top & bottom, margins, ...), - the **reference height will be determined by these properties**, else the **current view's height** + the **reference height will be determined by these properties**, if not the **current view's height** will be used. * The resulting height will always **match the reference height**. From 25779380974e2a10dec94c95ee3e7b510f6ccc40 Mon Sep 17 00:00:00 2001 From: Luc Dion Date: Sun, 19 Nov 2017 18:51:07 -0500 Subject: [PATCH 8/8] Update @available --- Sources/PinLayout.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PinLayout.swift b/Sources/PinLayout.swift index fe34c7d2..a27b0f96 100644 --- a/Sources/PinLayout.swift +++ b/Sources/PinLayout.swift @@ -386,7 +386,7 @@ public protocol PinLayout { */ @discardableResult func sizeToFit(_ fitType: FitType) -> PinLayout - @available(*, deprecated: 1.5.0, message: "fitSize() is deprecated, please use sizeToFit(fitType: FitType)") + @available(*, deprecated, message: "fitSize() is deprecated, please use sizeToFit(fitType: FitType)") @discardableResult func fitSize() -> PinLayout //