From e4b2c05c21c128a8a7bea683a8cb2456c8aa4c0a Mon Sep 17 00:00:00 2001 From: huang-kun Date: Fri, 24 Nov 2017 21:45:59 +0800 Subject: [PATCH] [ASCornerLayoutSpec] New layout spec class for declarative corner element layout. (#657) * Add new layout spec class with snapshot testing. Update examples and CHANGELOG.md * Code review updates. * Open curly bracket in a new line. --- AsyncDisplayKit.xcodeproj/project.pbxproj | 21 +- CHANGELOG.md | 1 + Source/AsyncDisplayKit.h | 1 + Source/Layout/ASCornerLayoutSpec.h | 79 +++++++ Source/Layout/ASCornerLayoutSpec.mm | 169 ++++++++++++++ Tests/ASCornerLayoutSpecSnapshotTests.mm | 219 ++++++++++++++++++ ...erOffset_bottomLeft_inner_childSize@2x.png | Bin 0 -> 697 bytes ...nerOffset_bottomLeft_inner_fullSize@2x.png | Bin 0 -> 697 bytes ...rOffset_bottomRight_inner_childSize@2x.png | Bin 0 -> 780 bytes ...erOffset_bottomRight_inner_fullSize@2x.png | Bin 0 -> 780 bytes ...InnerOffset_topLeft_inner_childSize@2x.png | Bin 0 -> 774 bytes ...hInnerOffset_topLeft_inner_fullSize@2x.png | Bin 0 -> 774 bytes ...nnerOffset_topRight_inner_childSize@2x.png | Bin 0 -> 785 bytes ...InnerOffset_topRight_inner_fullSize@2x.png | Bin 0 -> 785 bytes ...erOffset_bottomLeft_outer_childSize@2x.png | Bin 0 -> 667 bytes ...terOffset_bottomLeft_outer_fullSize@2x.png | Bin 0 -> 1271 bytes ...rOffset_bottomRight_outer_childSize@2x.png | Bin 0 -> 667 bytes ...erOffset_bottomRight_outer_fullSize@2x.png | Bin 0 -> 1272 bytes ...OuterOffset_topLeft_outer_childSize@2x.png | Bin 0 -> 667 bytes ...hOuterOffset_topLeft_outer_fullSize@2x.png | Bin 0 -> 1280 bytes ...uterOffset_topRight_outer_childSize@2x.png | Bin 0 -> 667 bytes ...OuterOffset_topRight_outer_fullSize@2x.png | Bin 0 -> 1286 bytes ...cations_bottomLeft_center_childSize@2x.png | Bin 0 -> 701 bytes ...ocations_bottomLeft_center_fullSize@2x.png | Bin 0 -> 900 bytes ...ations_bottomRight_center_childSize@2x.png | Bin 0 -> 701 bytes ...cations_bottomRight_center_fullSize@2x.png | Bin 0 -> 943 bytes ...lLocations_topLeft_center_childSize@2x.png | Bin 0 -> 708 bytes ...llLocations_topLeft_center_fullSize@2x.png | Bin 0 -> 888 bytes ...Locations_topRight_center_childSize@2x.png | Bin 0 -> 707 bytes ...lLocations_topRight_center_fullSize@2x.png | Bin 0 -> 927 bytes .../ASCornerLayoutSpec.png | Bin 0 -> 124421 bytes .../Sample/LayoutExampleNode.swift | 137 +++++++++++ .../Sample/OverviewViewController.swift | 4 +- .../Sample/Utilities.swift | 16 +- .../Sample.xcodeproj/project.pbxproj | 5 +- .../contents.xcworkspacedata | 10 + .../Sample/LayoutExampleNodes.h | 6 + .../Sample/LayoutExampleNodes.m | 182 +++++++++++++++ .../Sample/OverviewViewController.m | 18 +- .../LayoutSpecExamples/Sample/Utilities.h | 14 +- .../LayoutSpecExamples/Sample/Utilities.m | 28 ++- examples/README.md | 16 ++ 42 files changed, 910 insertions(+), 16 deletions(-) create mode 100644 Source/Layout/ASCornerLayoutSpec.h create mode 100644 Source/Layout/ASCornerLayoutSpec.mm create mode 100644 Tests/ASCornerLayoutSpecSnapshotTests.mm create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomLeft_inner_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomLeft_inner_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomRight_inner_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomRight_inner_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topLeft_inner_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topLeft_inner_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topRight_inner_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topRight_inner_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomLeft_center_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomLeft_center_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomRight_center_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomRight_center_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topLeft_center_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topLeft_center_fullSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topRight_center_childSize@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topRight_center_fullSize@2x.png create mode 100644 docs/static/images/example-app-screenshots/ASCornerLayoutSpec.png create mode 100644 examples/LayoutSpecExamples/Sample.xcworkspace/contents.xcworkspacedata diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index cefcdea8e4..28ee692cc4 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -33,6 +33,9 @@ 05EA6FE71AC0966E00E35788 /* ASSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 05EA6FE61AC0966E00E35788 /* ASSnapshotTestCase.m */; }; 18C2ED7F1B9B7DE800F627B3 /* ASCollectionNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C2ED7C1B9B7DE800F627B3 /* ASCollectionNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18C2ED831B9B7DE800F627B3 /* ASCollectionNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 18C2ED7D1B9B7DE800F627B3 /* ASCollectionNode.mm */; }; + 1A6C000D1FAB4E2100D05926 /* ASCornerLayoutSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A6C000B1FAB4E2000D05926 /* ASCornerLayoutSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A6C000E1FAB4E2100D05926 /* ASCornerLayoutSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C000C1FAB4E2100D05926 /* ASCornerLayoutSpec.mm */; }; + 1A6C00111FAB4EDD00D05926 /* ASCornerLayoutSpecSnapshotTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C000F1FAB4ED400D05926 /* ASCornerLayoutSpecSnapshotTests.mm */; }; 242995D31B29743C00090100 /* ASBasicImageDownloaderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 242995D21B29743C00090100 /* ASBasicImageDownloaderTests.m */; }; 2538B6F31BC5D2A2003CA0B4 /* ASCollectionViewFlowLayoutInspectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2538B6F21BC5D2A2003CA0B4 /* ASCollectionViewFlowLayoutInspectorTests.m */; }; 254C6B521BF8FE6D003EC431 /* ASTextKitTruncationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 254C6B511BF8FE6D003EC431 /* ASTextKitTruncationTests.mm */; }; @@ -307,8 +310,8 @@ B350625C1B010F070018CF92 /* ASLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 0516FA3B1A15563400B4EBED /* ASLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; B350625D1B0111740018CF92 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 051943141A1575670030A7D0 /* Photos.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; B350625E1B0111780018CF92 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 051943121A1575630030A7D0 /* AssetsLibrary.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - BB5FC3D11F9C9389007F191E /* ASTabBarControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */; }; BB5FC3CE1F9BA689007F191E /* ASNavigationControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5FC3CD1F9BA688007F191E /* ASNavigationControllerTests.m */; }; + BB5FC3D11F9C9389007F191E /* ASTabBarControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */; }; C78F7E2B1BF7809800CDEAFC /* ASTableNode.h in Headers */ = {isa = PBXBuildFile; fileRef = B0F880581BEAEC7500D17647 /* ASTableNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC034A091E60BEB400626263 /* ASDisplayNode+Convenience.h in Headers */ = {isa = PBXBuildFile; fileRef = CC034A071E60BEB400626263 /* ASDisplayNode+Convenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC034A0A1E60BEB400626263 /* ASDisplayNode+Convenience.m in Sources */ = {isa = PBXBuildFile; fileRef = CC034A081E60BEB400626263 /* ASDisplayNode+Convenience.m */; }; @@ -572,6 +575,9 @@ 18C2ED7C1B9B7DE800F627B3 /* ASCollectionNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionNode.h; sourceTree = ""; }; 18C2ED7D1B9B7DE800F627B3 /* ASCollectionNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCollectionNode.mm; sourceTree = ""; }; 1950C4481A3BB5C1005C8279 /* ASEqualityHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASEqualityHelpers.h; sourceTree = ""; }; + 1A6C000B1FAB4E2000D05926 /* ASCornerLayoutSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCornerLayoutSpec.h; sourceTree = ""; }; + 1A6C000C1FAB4E2100D05926 /* ASCornerLayoutSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCornerLayoutSpec.mm; sourceTree = ""; }; + 1A6C000F1FAB4ED400D05926 /* ASCornerLayoutSpecSnapshotTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCornerLayoutSpecSnapshotTests.mm; sourceTree = ""; }; 205F0E0D1B371875007741D0 /* UICollectionViewLayout+ASConvenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionViewLayout+ASConvenience.h"; sourceTree = ""; }; 205F0E0E1B371875007741D0 /* UICollectionViewLayout+ASConvenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionViewLayout+ASConvenience.m"; sourceTree = ""; }; 205F0E111B371BD7007741D0 /* ASScrollDirection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASScrollDirection.m; sourceTree = ""; }; @@ -785,8 +791,8 @@ B30BF6501C5964B0004FCD53 /* ASLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutManager.h; path = TextKit/ASLayoutManager.h; sourceTree = ""; }; B30BF6511C5964B0004FCD53 /* ASLayoutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ASLayoutManager.m; path = TextKit/ASLayoutManager.m; sourceTree = ""; }; B35061DA1B010EDF0018CF92 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASTabBarControllerTests.m; sourceTree = ""; }; BB5FC3CD1F9BA688007F191E /* ASNavigationControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASNavigationControllerTests.m; sourceTree = ""; }; + BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASTabBarControllerTests.m; sourceTree = ""; }; BDC2D162BD55A807C1475DA5 /* Pods-AsyncDisplayKitTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.profile.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.profile.xcconfig"; sourceTree = ""; }; CC034A071E60BEB400626263 /* ASDisplayNode+Convenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASDisplayNode+Convenience.h"; sourceTree = ""; }; CC034A081E60BEB400626263 /* ASDisplayNode+Convenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ASDisplayNode+Convenience.m"; sourceTree = ""; }; @@ -1187,6 +1193,7 @@ 7AB338681C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm */, ACF6ED551B178DC700DA7C62 /* ASInsetLayoutSpecSnapshotTests.mm */, ACF6ED591B178DC700DA7C62 /* ASOverlayLayoutSpecSnapshotTests.mm */, + 1A6C000F1FAB4ED400D05926 /* ASCornerLayoutSpecSnapshotTests.mm */, 696FCB301D6E46050093471E /* ASBackgroundLayoutSpecSnapshotTests.mm */, ACF6ED5A1B178DC700DA7C62 /* ASRatioLayoutSpecSnapshotTests.mm */, ACF6ED5B1B178DC700DA7C62 /* ASStackLayoutSpecSnapshotTests.mm */, @@ -1524,6 +1531,8 @@ ACF6ED021B17843500DA7C62 /* ASBackgroundLayoutSpec.mm */, ACF6ED031B17843500DA7C62 /* ASCenterLayoutSpec.h */, ACF6ED041B17843500DA7C62 /* ASCenterLayoutSpec.mm */, + 1A6C000B1FAB4E2000D05926 /* ASCornerLayoutSpec.h */, + 1A6C000C1FAB4E2100D05926 /* ASCornerLayoutSpec.mm */, ACF6ED071B17843500DA7C62 /* ASDimension.h */, ACF6ED081B17843500DA7C62 /* ASDimension.mm */, 690C35631E055C7B00069B91 /* ASDimensionInternal.h */, @@ -1717,6 +1726,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 1A6C000D1FAB4E2100D05926 /* ASCornerLayoutSpec.h in Headers */, E54E00721F1D3828000B30D7 /* ASPagerNode+Beta.h in Headers */, E5B225281F1790D6001E1431 /* ASHashing.h in Headers */, CC034A131E649F1300626263 /* AsyncDisplayKit+IGListKitMethods.h in Headers */, @@ -2069,13 +2079,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AsyncDisplayKitTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B9D88CDF51B429C8409E4B6 /* [CP] Copy Pods Resources */ = { @@ -2174,6 +2187,7 @@ ACF6ED621B178DC700DA7C62 /* ASRatioLayoutSpecSnapshotTests.mm in Sources */, 7AB338691C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm in Sources */, CCDD148B1EEDCD9D0020834E /* ASCollectionModernDataSourceTests.m in Sources */, + 1A6C00111FAB4EDD00D05926 /* ASCornerLayoutSpecSnapshotTests.mm in Sources */, 254C6B541BF8FF2A003EC431 /* ASTextKitTests.mm in Sources */, 05EA6FE71AC0966E00E35788 /* ASSnapshotTestCase.m in Sources */, ACF6ED631B178DC700DA7C62 /* ASStackLayoutSpecSnapshotTests.mm in Sources */, @@ -2334,6 +2348,7 @@ 68FC85E51CE29B7E00EDD713 /* ASTabBarController.m in Sources */, CCCCCCDC1EC3EF060087FE10 /* ASTextLine.m in Sources */, 34EFC7741B701D0A00AD841F /* ASAbsoluteLayoutSpec.mm in Sources */, + 1A6C000E1FAB4E2100D05926 /* ASCornerLayoutSpec.mm in Sources */, CCCCCCE81EC3F0FC0087FE10 /* NSAttributedString+ASText.m in Sources */, 690C35621E055C5D00069B91 /* ASDimensionInternal.mm in Sources */, 909C4C761F09C98B00D6B76F /* ASTextNode2.mm in Sources */, diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4f027f9c..fa04a6c773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Updated to be backwards compatible with Xcode 8. [Adlai Holler](https://github.com/Adlai-Holler) - [API CHANGES] `ASPerformMainThreadDeallocation` and `ASPerformBackgroundDeallocation` functions take `id *` instead of `id` and they're now more reliable. Also, in Swift, `ASDeallocQueue.sharedDeallocationQueue() -> ASDeallocQueue.sharedDeallocationQueue`. [Adlai Holler](https://github.com/Adlai-Holler) [#651](https://github.com/TextureGroup/Texture/pull/651) - [Collection/Table] Added direct support for mapping section indexes between data spaces. [Adlai Holler](https://github.com/Adlai-Holler) [#651](https://github.com/TextureGroup/Texture/pull/660) +- [ASCornerLayoutSpec] New layout spec class for declarative corner element layout. [#657](https://github.com/TextureGroup/Texture/pull/657) [huangkun](https://github.com/huang-kun) ## 2.6 - [Xcode 9] Updated to require Xcode 9 (to fix warnings) [Garrett Moon](https://github.com/garrettmoon) diff --git a/Source/AsyncDisplayKit.h b/Source/AsyncDisplayKit.h index b1903945ef..c20f5077a1 100644 --- a/Source/AsyncDisplayKit.h +++ b/Source/AsyncDisplayKit.h @@ -79,6 +79,7 @@ #import #import #import +#import #import #import #import diff --git a/Source/Layout/ASCornerLayoutSpec.h b/Source/Layout/ASCornerLayoutSpec.h new file mode 100644 index 0000000000..23d09d0179 --- /dev/null +++ b/Source/Layout/ASCornerLayoutSpec.h @@ -0,0 +1,79 @@ +// +// ASCornerLayoutSpec.h +// Texture +// +// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// + +#import + +/** + The corner location for positioning corner element. + */ +typedef NS_ENUM(NSInteger, ASCornerLayoutLocation) { + ASCornerLayoutLocationTopLeft, + ASCornerLayoutLocationTopRight, + ASCornerLayoutLocationBottomLeft, + ASCornerLayoutLocationBottomRight, +}; + +NS_ASSUME_NONNULL_BEGIN + +/** + A layout spec that positions a corner element which relatives to the child element. + + @warning Both child element and corner element must have valid preferredSize for layout calculation. + */ +@interface ASCornerLayoutSpec : ASLayoutSpec + +/** + A layout spec that positions a corner element which relatives to the child element. + + @param child A child that is laid out to determine the size of this spec. + @param corner A layoutElement object that is laid out to a corner on the child. + @param location The corner position option. + @return An ASCornerLayoutSpec object with a given child and an layoutElement that act as corner. + */ +- (instancetype)initWithChild:(id )child corner:(id )corner location:(ASCornerLayoutLocation)location AS_WARN_UNUSED_RESULT; + +/** + A layout spec that positions a corner element which relatives to the child element. + + @param child A child that is laid out to determine the size of this spec. + @param corner A layoutElement object that is laid out to a corner on the child. + @param location The corner position option. + @return An ASCornerLayoutSpec object with a given child and an layoutElement that act as corner. + */ ++ (instancetype)cornerLayoutSpecWithChild:(id )child corner:(id )corner location:(ASCornerLayoutLocation)location AS_WARN_UNUSED_RESULT; + +/** + A layoutElement object that is laid out to a corner on the child. + */ +@property (nonatomic, strong) id corner; + +/** + The corner position option. + */ +@property (nonatomic, assign) ASCornerLayoutLocation cornerLocation; + +/** + The point which offsets from the corner location. Use this property to make delta + distance from the default corner location. Default is CGPointZero. + */ +@property (nonatomic, assign) CGPoint offset; + +/** + Whether should include corner element into layout size calculation. If included, + the layout size will be the union size of both child and corner; If not included, + the layout size will be only child's size. Default is NO. + */ +@property (nonatomic, assign) BOOL wrapsCorner; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Source/Layout/ASCornerLayoutSpec.mm b/Source/Layout/ASCornerLayoutSpec.mm new file mode 100644 index 0000000000..d1104089b3 --- /dev/null +++ b/Source/Layout/ASCornerLayoutSpec.mm @@ -0,0 +1,169 @@ +// +// ASCornerLayoutSpec.mm +// Texture +// +// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// + +#import +#import +#import +#import + +CGPoint as_calculatedCornerOriginIn(CGRect baseFrame, CGSize cornerSize, ASCornerLayoutLocation cornerLocation, CGPoint offset) +{ + CGPoint cornerOrigin = CGPointZero; + CGPoint baseOrigin = baseFrame.origin; + CGSize baseSize = baseFrame.size; + + switch (cornerLocation) { + case ASCornerLayoutLocationTopLeft: + cornerOrigin.x = baseOrigin.x - cornerSize.width / 2; + cornerOrigin.y = baseOrigin.y - cornerSize.height / 2; + break; + case ASCornerLayoutLocationTopRight: + cornerOrigin.x = baseOrigin.x + baseSize.width - cornerSize.width / 2; + cornerOrigin.y = baseOrigin.y - cornerSize.height / 2; + break; + case ASCornerLayoutLocationBottomLeft: + cornerOrigin.x = baseOrigin.x - cornerSize.width / 2; + cornerOrigin.y = baseOrigin.y + baseSize.height - cornerSize.height / 2; + break; + case ASCornerLayoutLocationBottomRight: + cornerOrigin.x = baseOrigin.x + baseSize.width - cornerSize.width / 2; + cornerOrigin.y = baseOrigin.y + baseSize.height - cornerSize.height / 2; + break; + } + + cornerOrigin.x += offset.x; + cornerOrigin.y += offset.y; + + return cornerOrigin; +} + +static NSUInteger const kBaseChildIndex = 0; +static NSUInteger const kCornerChildIndex = 1; + +@interface ASCornerLayoutSpec() +@end + +@implementation ASCornerLayoutSpec + +- (instancetype)initWithChild:(id )child corner:(id )corner location:(ASCornerLayoutLocation)location +{ + self = [super init]; + if (self) { + self.child = child; + self.corner = corner; + self.cornerLocation = location; + } + return self; +} + ++ (instancetype)cornerLayoutSpecWithChild:(id )child corner:(id )corner location:(ASCornerLayoutLocation)location +{ + return [[self alloc] initWithChild:child corner:corner location:location]; +} + +#pragma mark - Children + +- (void)setChild:(id)child +{ + ASDisplayNodeAssertNotNil(child, @"Child shouldn't be nil."); + [super setChild:child atIndex:kBaseChildIndex]; +} + +- (id)child +{ + return [super childAtIndex:kBaseChildIndex]; +} + +- (void)setCorner:(id)corner +{ + ASDisplayNodeAssertNotNil(corner, @"Corner element cannot be nil."); + [super setChild:corner atIndex:kCornerChildIndex]; +} + +- (id)corner +{ + return [super childAtIndex:kCornerChildIndex]; +} + +#pragma mark - Calculation + +- (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize +{ + CGSize size = { + ASPointsValidForSize(constrainedSize.max.width) == NO ? ASLayoutElementParentDimensionUndefined : constrainedSize.max.width, + ASPointsValidForSize(constrainedSize.max.height) == NO ? ASLayoutElementParentDimensionUndefined : constrainedSize.max.height + }; + + id child = self.child; + id corner = self.corner; + + // Element validation + [self _validateElement:child]; + [self _validateElement:corner]; + + CGRect childFrame = CGRectZero; + CGRect cornerFrame = CGRectZero; + + // Layout child + ASLayout *childLayout = [child layoutThatFits:constrainedSize parentSize:size]; + childFrame.size = childLayout.size; + + // Layout corner + ASLayout *cornerLayout = [corner layoutThatFits:constrainedSize parentSize:size]; + cornerFrame.size = cornerLayout.size; + + // Calculate corner's position + CGPoint relativePosition = as_calculatedCornerOriginIn(childFrame, cornerFrame.size, _cornerLocation, _offset); + + // Update corner's position + cornerFrame.origin = relativePosition; + + // Calculate size + CGRect frame = childFrame; + if (_wrapsCorner) { + frame = CGRectUnion(childFrame, cornerFrame); + frame.size = ASSizeRangeClamp(constrainedSize, frame.size); + } + + // Shift sublayouts' positions if they are off the bounds. + if (frame.origin.x != 0) { + CGFloat deltaX = frame.origin.x; + childFrame.origin.x -= deltaX; + cornerFrame.origin.x -= deltaX; + } + + if (frame.origin.y != 0) { + CGFloat deltaY = frame.origin.y; + childFrame.origin.y -= deltaY; + cornerFrame.origin.y -= deltaY; + } + + childLayout.position = childFrame.origin; + cornerLayout.position = cornerFrame.origin; + + return [ASLayout layoutWithLayoutElement:self size:frame.size sublayouts:@[childLayout, cornerLayout]]; +} + +- (void)_validateElement:(id )element +{ + // Validate non-nil element + if (element == nil) { + ASDisplayNodeAssertNotNil(element, @"[%@]: Must have a non-nil child/corner for layout calculation.", self.class); + } + // Validate preferredSize if needed + CGSize size = element.style.preferredSize; + if (!CGSizeEqualToSize(size, CGSizeZero) && !ASIsCGSizeValidForSize(size) && (size.width < 0 || (size.height < 0))) { + ASDisplayNodeFailAssert(@"[%@]: Should give a valid preferredSize value for %@ before corner's position calculation.", self.class, element); + } +} + +@end diff --git a/Tests/ASCornerLayoutSpecSnapshotTests.mm b/Tests/ASCornerLayoutSpecSnapshotTests.mm new file mode 100644 index 0000000000..fcbbfe9850 --- /dev/null +++ b/Tests/ASCornerLayoutSpecSnapshotTests.mm @@ -0,0 +1,219 @@ +// +// ASCornerLayoutSpecSnapshotTests.mm +// Texture +// +// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// + +#import "ASLayoutSpecSnapshotTestsHelper.h" +#import +#import + +typedef NS_ENUM(NSInteger, ASCornerLayoutSpecSnapshotTestsOffsetOption) { + ASCornerLayoutSpecSnapshotTestsOffsetOptionCenter, + ASCornerLayoutSpecSnapshotTestsOffsetOptionInner, + ASCornerLayoutSpecSnapshotTestsOffsetOptionOuter, +}; + + +@interface ASCornerLayoutSpecSnapshotTests : ASLayoutSpecSnapshotTestCase + +@property (nonatomic, strong) UIColor *boxColor; +@property (nonatomic, strong) UIColor *baseColor; +@property (nonatomic, strong) UIColor *cornerColor; +@property (nonatomic, strong) UIColor *contextColor; + +@property (nonatomic, assign) CGSize baseSize; +@property (nonatomic, assign) CGSize cornerSize; +@property (nonatomic, assign) CGSize contextSize; + +@property (nonatomic, assign) ASSizeRange contextSizeRange; + +@end + + +@implementation ASCornerLayoutSpecSnapshotTests + +- (void)setUp +{ + [super setUp]; + + self.recordMode = NO; + + _boxColor = [UIColor greenColor]; + _baseColor = [UIColor blueColor]; + _cornerColor = [UIColor orangeColor]; + _contextColor = [UIColor lightGrayColor]; + + _baseSize = CGSizeMake(60, 60); + _cornerSize = CGSizeMake(20, 20); + _contextSize = CGSizeMake(120, 120); + + _contextSizeRange = ASSizeRangeMake(CGSizeZero, _contextSize); +} + +- (void)testCornerSpecForAllLocations +{ + ASCornerLayoutSpecSnapshotTestsOffsetOption center = ASCornerLayoutSpecSnapshotTestsOffsetOptionCenter; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:center wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:center wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:center wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:center wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:center wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:center wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:center wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:center wrapsCorner:YES]; +} + +- (void)testCornerSpecForAllLocationsWithInnerOffset +{ + ASCornerLayoutSpecSnapshotTestsOffsetOption inner = ASCornerLayoutSpecSnapshotTestsOffsetOptionInner; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:inner wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:inner wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:inner wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:inner wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:inner wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:inner wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:inner wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:inner wrapsCorner:YES]; +} + +- (void)testCornerSpecForAllLocationsWithOuterOffset +{ + ASCornerLayoutSpecSnapshotTestsOffsetOption outer = ASCornerLayoutSpecSnapshotTestsOffsetOptionOuter; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:outer wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopLeft offsetOption:outer wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:outer wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationTopRight offsetOption:outer wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:outer wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomLeft offsetOption:outer wrapsCorner:YES]; + + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:outer wrapsCorner:NO]; + [self testCornerSpecWithLocation:ASCornerLayoutLocationBottomRight offsetOption:outer wrapsCorner:YES]; +} + +- (void)testCornerSpecWithLocation:(ASCornerLayoutLocation)location + offsetOption:(ASCornerLayoutSpecSnapshotTestsOffsetOption)offsetOption + wrapsCorner:(BOOL)wrapsCorner +{ + ASDisplayNode *baseNode = ASDisplayNodeWithBackgroundColor(_baseColor, _baseSize); + ASDisplayNode *cornerNode = ASDisplayNodeWithBackgroundColor(_cornerColor, _cornerSize); + ASDisplayNode *debugBoxNode = ASDisplayNodeWithBackgroundColor(_boxColor); + + baseNode.style.layoutPosition = CGPointMake((_contextSize.width - _baseSize.width) / 2, + (_contextSize.height - _baseSize.height) / 2); + + ASCornerLayoutSpec *cornerSpec = [ASCornerLayoutSpec cornerLayoutSpecWithChild:baseNode + corner:cornerNode + location:location]; + + CGPoint delta = (CGPoint){ _cornerSize.width / 2, _cornerSize.height / 2 }; + cornerSpec.offset = [self offsetForOption:offsetOption location:location delta:delta]; + cornerSpec.wrapsCorner = wrapsCorner; + + ASBackgroundLayoutSpec *backgroundSpec = [ASBackgroundLayoutSpec backgroundLayoutSpecWithChild:cornerSpec + background:debugBoxNode]; + + [self testLayoutSpec:backgroundSpec + sizeRange:_contextSizeRange + subnodes:@[debugBoxNode, baseNode, cornerNode] + identifier:[self suffixWithLocation:location option:offsetOption wrapsCorner:wrapsCorner]]; +} + +- (CGPoint)offsetForOption:(ASCornerLayoutSpecSnapshotTestsOffsetOption)option + location:(ASCornerLayoutLocation)location + delta:(CGPoint)delta +{ + CGFloat x = delta.x; + CGFloat y = delta.y; + + switch (option) { + + case ASCornerLayoutSpecSnapshotTestsOffsetOptionCenter: + return CGPointZero; + + case ASCornerLayoutSpecSnapshotTestsOffsetOptionInner: + + switch (location) { + case ASCornerLayoutLocationTopLeft: return (CGPoint){ x, y }; + case ASCornerLayoutLocationTopRight: return (CGPoint){ -x, y }; + case ASCornerLayoutLocationBottomLeft: return (CGPoint){ x, -y }; + case ASCornerLayoutLocationBottomRight: return (CGPoint){ -x, -y }; + } + + case ASCornerLayoutSpecSnapshotTestsOffsetOptionOuter: + + switch (location) { + case ASCornerLayoutLocationTopLeft: return (CGPoint){ -x, -y }; + case ASCornerLayoutLocationTopRight: return (CGPoint){ x, -y }; + case ASCornerLayoutLocationBottomLeft: return (CGPoint){ -x, y }; + case ASCornerLayoutLocationBottomRight: return (CGPoint){ x, y }; + } + + } + +} + +- (NSString *)suffixWithLocation:(ASCornerLayoutLocation)location + option:(ASCornerLayoutSpecSnapshotTestsOffsetOption)option + wrapsCorner:(BOOL)wrapsCorner +{ + NSMutableString *desc = [NSMutableString string]; + + switch (location) { + case ASCornerLayoutLocationTopLeft: + [desc appendString:@"topLeft"]; + break; + case ASCornerLayoutLocationTopRight: + [desc appendString:@"topRight"]; + break; + case ASCornerLayoutLocationBottomLeft: + [desc appendString:@"bottomLeft"]; + break; + case ASCornerLayoutLocationBottomRight: + [desc appendString:@"bottomRight"]; + break; + } + + [desc appendString:@"_"]; + + switch (option) { + case ASCornerLayoutSpecSnapshotTestsOffsetOptionCenter: + [desc appendString:@"center"]; + break; + case ASCornerLayoutSpecSnapshotTestsOffsetOptionInner: + [desc appendString:@"inner"]; + break; + case ASCornerLayoutSpecSnapshotTestsOffsetOptionOuter: + [desc appendString:@"outer"]; + break; + } + + [desc appendString:@"_"]; + + if (wrapsCorner) { + [desc appendString:@"fullSize"]; + } else { + [desc appendString:@"childSize"]; + } + + return desc.copy; +} + +@end diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomLeft_inner_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_bottomLeft_inner_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b78fb5e7de98d1102fdadb445643c447e96a602 GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?Ynu&Y`(oAiGqcLq9S~iUpuMNERoKVi zAdCDuhl5;lzgJ32uZcXnz1>ifS-Nqj5p9l%R9Es1e%{0 zJiC%pZN>wUi)J9}bF+-~53&f)QM#1|)Uv}j_n9itgkYE3AWv*xd3F!TgszO)AT4HF rXHEy2;3t@C4AgRGnb~Kdnr#o*MJmkf&aziu10^j_S3j3^P6+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?Ynu&Y`(oAiGqcLq9S~iUpuMNERoKVi zAdCDuhl5;lzgJ32uZcXnz1>ifS-Nqj5p9l%R9Es1e%{0 zJiC%pZN>wUi)J9}bF+-~53&f)QM#1|)Uv}j_n9itgkYE3AWv*xd3F!TgszO)AT4HF rXHEy2;3t@C4AgRGnb~Kdnr#o*MJmkf&aziu10^j_S3j3^P6+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?Yn987N5J zUN_7;;=tn^C~s?CKBq{UQJJylT1D&XjSCo8`ro`>dUyNtvr+~>o-&_HVC(*n-&eq* zEOC&d&XScU?Zd6m?cb8_`q-@UOfEp4cGit$p+1DA7uG1@p$tM+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?Yn987N5J zUN_7;;=tn^C~s?CKBq{UQJJylT1D&XjSCo8`ro`>dUyNtvr+~>o-&_HVC(*n-&eq* zEOC&d&XScU?Zd6m?cb8_`q-@UOfEp4cGit$p+1DA7uG1@p$tMt9%FdQYQWCa$?!3jW)BB5| zj**;m?8vkuFD-$F7#v*M6msBo_T_6kxB7SM$v+PZxLnMllVEJo+qrVh+FF+BO`;og zAAJ4WxqYjA#($?jjRL{qf*TsnzEpYgOA2U5O>E{akX>_HV&au&Bs8tp_Wcf`Cr@~t z4K)8l>C%^VAjb+7)%GSdaqe4Za<~7%e6c@_3=IGOr*6y<1cp8
Z6+bGy#AmZ%! z{r;AfjyDf)W}L}%w)5{D%ja?DPw#JRl&?R?o0Fja=e+tHpgC$k3R&6A3cdwT*Zr1m zy7V1e-Jf3)HxB%Bo$mMURx40J+|?t9%FdQYQWCa$?!3jW)BB5| zj**;m?8vkuFD-$F7#v*M6msBo_T_6kxB7SM$v+PZxLnMllVEJo+qrVh+FF+BO`;og zAAJ4WxqYjA#($?jjRL{qf*TsnzEpYgOA2U5O>E{akX>_HV&au&Bs8tp_Wcf`Cr@~t z4K)8l>C%^VAjb+7)%GSdaqe4Za<~7%e6c@_3=IGOr*6y<1cp8
Z6+bGy#AmZ%! z{r;AfjyDf)W}L}%w)5{D%ja?DPw#JRl&?R?o0Fja=e+tHpgC$k3R&6A3cdwT*Zr1m zy7V1e-Jf3)HxB%Bo$mMURx40J+|?sAjL?Kgi)`&@@{lgeh;muWN2qUq>Eay4If%`DV!+_VDbat|MP$Sd=9Wa^wXC zaPHVU&Fy)}e4vu&QvzRF@}zB$jal0{Wz9-EBqe5|TVGl#?XsM+@+JNzDze1t|%3Tl(B!#=)|Jt!hD=mi4J8ioTGBqMSU!(Ce|mpoqkR2A-kb#WKj+owBs6iV{U~H* zGb{KOJYDx&y6Mt)Y;}KrN!&Q_&vm-ryIZY51#wrWd}0yyDe!zUB)Hd}GABlx+1zopr09e0D$^ZZW literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topRight_inner_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithInnerOffset_topRight_inner_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..23082ede8c09cf7acdcc0c0331da12ef943b3282 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%98|V2gxCx|dJzX3_Dj46~apY@u;BgM@ zyEi*{hl5z(lw}{p)-1|kv%bG@w%qZ;dGlhLKNoZE_+dF?_U!8H?KkiI&g02blW3mJ zl;sAjL?Kgi)`&@@{lgeh;muWN2qUq>Eay4If%`DV!+_VDbat|MP$Sd=9Wa^wXC zaPHVU&Fy)}e4vu&QvzRF@}zB$jal0{Wz9-EBqe5|TVGl#?XsM+@+JNzDze1t|%3Tl(B!#=)|Jt!hD=mi4J8ioTGBqMSU!(Ce|mpoqkR2A-kb#WKj+owBs6iV{U~H* zGb{KOJYDx&y6Mt)Y;}KrN!&Q_&vm-ryIZY51#wrWd}0yyDe!zUB)Hd}GABlx+1zopr09e0D$^ZZW literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18e211ae8efffb10bc9a529d9e8563babea4f64f GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YmUD=0|b bj`RST@Ig$Fx3b#=lz2Q{{an^LB{Ts5kSQ3; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomLeft_outer_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..393143a214cab4d28e79fea473568279f80e173d GIT binary patch literal 1271 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|I14-?iy0Wi zR6&^0Gf3qFP*5h*#Xkf{GXXIO1OTxHlm@byl2%<@ejP~bdAc};R4~4|elW`^kcTDU z|NrH>v1hcV}CD{kN{N{!_U^1Jl13{V@!z0Sxu~I4tVy zfByLUFXyp7qsRewWvvD#jfVbv6IlWnSU3D|e|xdwZyj?fi|~hw9b5|-xE3hi5cE0Z zKlMZ4{X2|*H?VA|*i*AAs{ZFrpnCbek3mWvoG*7QU$Wokomjfyga#Is2mhze15yf% zoEBOS|JNFH*GouQ_p<4$aV0!nsDD<(q1>VTKt;JWbrU%l$zUHOChK1)Y`7i;cKE4ZM z(#yPhqZQ=fsrs@^W>+F-c>*0{aPO|y0oAoqy9I#y_k3FFe4x$B+n5vRm}9%6Id?1x zO%?~~58qe9aU&o-Qw`*p!Ri@1^#|g>1oZ#EnwO{mFy&Z*QqJ4!7r71@2(VtP+f^U; zRngy3>`1}%uL?mLiYAXsgx0^#`?vGm?@x2jG&HdE?|T9YID2`Poc)ux-~WDVRy~Ku zffb8Df{W8tK;gjte}(JURsIXMC9w8rc>%-kf>;iB*rAoGJ>SksUg&l`(0u#!m8`!- zvA}5h(&G(^?az@HBwtRy9eaGINC2Z~0OSAdU$|B@fY6OCE&qQXF8On~;L*%kUE61Q z91ymzT5ietg69R#j;ihPq8ozO`q^|dX)R!S_cXd(DSPp(l4Zt zAoBmqzN@d5fq}uoA#pTbJn0t)FadcrGz9*+{5x!YKQIA;RMp3Jyi^7ToCYJ4+eiQR z(R=M+s!A1?^(#QN+waZ)`U|G&dg~0kCaCs-w`A>m&a<4!*Pj|ngUTlcPgg&ebxsLQ E01|@%od5s; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18e211ae8efffb10bc9a529d9e8563babea4f64f GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YmUD=0|b bj`RST@Ig$Fx3b#=lz2Q{{an^LB{Ts5kSQ3; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_bottomRight_outer_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..12498681e014141412efa9910890954c797940e6 GIT binary patch literal 1272 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|I14-?iy0Wi zR6&^0Gf3qFP*5h*#Xkf{GXXIO1OTxHlm@by5?t;d`wgUZJY5_^Dj46~IJk<*k%#5L z-~aQ!edLSV+mbeWnZQSpNg4TPAAGi%-~atX`G?9~@rTT1_SMJSif7VjSl<@Hz#71C z*SYw6f%}IY25T?MHUUy^xOG5^L| zW}qzx!feH!?fN-oJ;=@-3cj!TDi7z$a)4}qwb9`E+2u8+AXTiHQROG3%U(M;FbQo4 z?Qh+gXZLh9$c=g)mv=ee+YrspBs8I6ZI#ZM($AXlzCcw4jZ^7;Q?|7g%G zV7jpdrJJ`m4rXN=ia1}a`SttrzOoCM>TVt~V$&x~wA{4m{kD_OKmYvo$@0#@>*>E4 z?tgFr*52P20A!>;yc?;iF&c-$6QU&+96;FT$R0|Uzg`R!-2EMFhL-de+R zqT%Xv8KBq#WsC3T$A1}~Z2$@Z(Q36d`{sg`tbXwK8PkK0+K1lr@BPK=!0@lo`E)Y3 z0|V2CL$TSV{FUu{eG?qmQVxVx$DH{3Z26xowiE}pJqfd}+CGu}X4c3kIe{_!ZK2}z z+4DcG2C^kTG-ZZ;pHP0|HVa5$%+}+rG5K|;)~A8Y;9eGa*ZE#zzOV#PVZl{7@uIyy zHTTZ~nV~-;jTp-|WFIiETPv6U;Pw6Ov)b+NGkuB4OOV_*KZn8Q9~0AuAN+gr{27=w z++tu@{dN6s&H4Nd3~S674rKkUJiNxAL4jd4FT;kY|GVaY`UwoKEM|r^*XEm_`NcBy dv_!CfurF0jz8=@>T@Fl944$rjF6*2Ung9uIBb5LE literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18e211ae8efffb10bc9a529d9e8563babea4f64f GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YmUD=0|b bj`RST@Ig$Fx3b#=lz2Q{{an^LB{Ts5kSQ3; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topLeft_outer_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4f1ab2b350dd889438231ff8cc46419d13ef5f GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|I14-?iy0Wi zR6&^0Gf3qFP*5h*#Xkf{GXXIO1OTxHlm@bys&?+RZv@hAo-U3d6^w809?Wt!Kc-Xf`-mw{2jm!aX}kMi4VFUi6<+I=@-nH?D1 zgc%Y{{@pEGUBV9IbSalzXMmbKXsj`6?X*nz`*!I@QvV^mS|szud^jDh;uje_D^4X?brEz z3>*hu^l$_9e0U#uq36r|{@tDFh6>C^3e0uuUP?}21fhZzoc7H*JfuXb>Q z47~Tu+M4G^;#|*kAjjyz$Gdxt9;if@-f0C{lK*+GEZdt6=av|QZ2a)!U7TdWq_tM> z4mI$cXxRSq93OL8MEa$fKn_nuP5F8ri<4op<%u9mZr7x@Gg_}Pes(4wn6Uo;Kcnj! z1x!)epcM7?`oS!xKpvKW|Nock#-7odl4rH&pqvX+WXlWb^LzKjz5jUq_20V6`cLHw z4NU)D^v5u;1~Am`W7268dmzIv=C-E1k0-JreKpR3A(V>y72`aA1o2c}X$BdG6AgAmbk2UCR=4Y1Kw< zMoy0d+VNH_IV(1sOa|JNuxIzw2Ja}-GDV>Nil^S~4ZNk((u9C+=_%hXRN%S#m>x*~ z`kI#l8y23sFVdQ&MBb@09Lp7mjD0& literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..18e211ae8efffb10bc9a529d9e8563babea4f64f GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YmUD=0|b bj`RST@Ig$Fx3b#=lz2Q{{an^LB{Ts5kSQ3; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocationsWithOuterOffset_topRight_outer_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7e15a554c6128134ea2a705df7844c14c54f1e GIT binary patch literal 1286 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D$|I14-?iy0Wi zR6&^0Gf3qFP*5h*#Xkf{GXXIO1OTxHlm@bynz(Met_RY7o-U3d6^w80IQAVf5O4|X zvolXmFpM^t^mN^(N+&_>)!I|%zdxYVfBf?EXKeHA`_n&v+_AIf`8D4AzmG9Icxvsi z`7c9-WzBn8hKBfpiLXtun*)QJG(*Ccf0Cz7{23J(7V|O~MAdJeowkWlpy47LgT&hUV@79#88{APFf;UA zyZ>g{%p3-mge{B=Zm;KW^!Y3@P}VGvKXAQzP5k;(<#%p5iu|vSkgJ(~zlLGYAExcI zg@HbNXT-pwz+i8~?RGlz{=U2u#~XMg_MT+qaA3IAwEug(A6tq82<4b2etEa&VR+ha z%Pmdcr*k(;nxzjq1|NY=6(1|80F5&{YS@y5~@0UFIQuU;_L9-}lo$ zcVNoW1f{IEHx901a^zt-@b~}xZy)*M_O_(WUMBESWKu@{*$1C(=J$X9Q2wEESNtJ! znSJ#!x8j*J8rHXkFt7$N+;uMgUf}*=hrwI^eg>`wtFOy2ia0R-DLh^C^>n8FKCx%Y z3XJi!Cx9whF9^>0J$v!r8EOiQoE{EL+q{0fx_q;)M)%BhsXgywm@MjCfBd_!c0SN- z`@D>wH@Fr6%{vsky0m>y;&wh36$QrVuMsm|KMUSBtAR!3L6gZ^>nFUsOBH~o-B@+} zP>lKfPgg;z#Fu2=Rm{J!mKkWvfiPRKXS;q*Sr4*vhl1~GzRJUSvK%1WUu`tFes+0{ zDM%G-W>onJ>9W@j4opHDLi<~H=Gi@64RWKN$K_ql_clbcGYL&-SX-rYru4IByf08y zf#a-evY*=SS_w>OV9B|foVaeb|IaLtD(*{L-c2xnbFC5R$b{8$+{JfmPK65tRmDtL gHgvsG6MVqF=6dq=%onYOz|_Ow>FVdQ&MBb@04OdR<^TWy literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomLeft_center_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomLeft_center_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90f411aff2f19b597221ff00dce5e7e8a49ba461 GIT binary patch literal 701 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9){~V_JqOb4o-U3d6^w7LZ4_)V5OH?= zet*kK$D4;YGtOi>+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YnsQBcUnS)b}$eR3@J=;XcSBJZDwr zEOnspY?oz`9BMNjg!o>z0SezyF*@r6G;Mj-tY@4+VYP{wV!$A`2)%6L4-_`<^w}%` zv~A_AWtBkT9iAz(Kq2mT)#NP55xz=?b-q7$|8a2sX#ueh-`Hw5-TA*+WKF{K2f156 z|74loIs2(iVc3SI#r+2FA8g`wE{Ih0U-R@Q53BZ#u6at^=7Ma@%}S308eP$Kqf8Cx vzU?dLR)T~zlWxxh+H`MO*)!E2IS1p}3-1Yj=1g}0rYZ(cS3j3^P69Zq$>>Mek?y>E5U!PS@XZ@n(cyZ1}%}{5&Qfl z4hbxa`B5dE$l*MrwDsxl7Db-KQ?2VqmVz03|1&c%{Qti*<4iL!P}hJ0_3d3pzGed+ zmy0rc&6hvr5Hpz<;op(_w&!0>*oCd@rmruJJ#A~re1Kt3NYMcXHiOCXoOjccCE5~a zyc6@Aciw>Ku)$>Md$ne5i4tuu^Bz9=2^8Ql-uaLQiq6fgudSOO#j$Ve{wx3fH_zfZ zy;nMcA=pSNfq{9(WcwXYCW>5pP%;C^xs)t#(7@=k>ze<)exSP&{qhQay#qOH^1Vxw zzk^*rS$fVsYoN&CCELF|`3qDd@$3oP^7rRJ9(t*3Te-jD@SeZ@g>~-}ndZyCJNW&y z{y`g_(`MR|)2hwGqnHksG5Sd9e79>z+!(~vpm}uajh}n18QBb$vM>a9W#`WpUJm1E zZ~R+xhp7<@31nr}sBD%GV#{%}G%Ib6$N;LKCOjk3v>9vx0BI({;b4 zn=XCFR`=(Z#Ek?0T&MfJyVVL*5O;OTCl+C!0?#Kyf_v>LGXul_|F_=RT?YntiZ$KFz?>{%ilP)Ei;;*O_bsZw$ETOd35>tH@}zcV>VpDf)v}fIfa>yuW`1)rILNX*Yt}1H zwHXi8CQ@6vVCsXvKUs}_=vV~{p1KN|%%G}OBK-|tqxt_<{$f7k4L-9Y!w3o9+M1;zQ29WVEC03Dne es(yX8*dNwXse6KqQ@*?hB`;4`KbLh*2~7ZQVj#l+ literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomRight_center_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_bottomRight_center_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..58257ffef600b3ee08e6ca2b90bf42172a788b55 GIT binary patch literal 943 zcmeAS@N?(olHy`uVBq!ia0vp^Js`}%1|-)VaI^zbjKx9jP7LeL$-D$|I14-?iy0Wi zR6&^0Gf3qFP*5h*#Xkf{GXXIOxB;;Slm@aHXT)^R*af6hJY5_^Dj45fJIK}SAmHNo z|NnAc%cpBR*lSuVN+n*dyZhMU+~wbo>I>w~+a3D!XhV%*#V6m@}jS2+4la6dhFZwbf?(?9&N^iwpxYD zy&Mt;_SA)Za};a%sj%eb+Wd9=1`UZb(jIR+nS(#>ew{<{_o7a9ltCIw>mfhTuyZM>)vsd|3tM|_rVmRaf(e?k6;%?7|okx$~ zU=}xM=oDh`5eZ*^GFTnx_duqG&PTIu{l2#g7$zEw2V4rj&ax>LN?;IHWtgF{Zsp$h hYq`nPGK237bEVDtZ$a)W?g1l|!PC{xWt~$(698Z$i<|%e literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topLeft_center_childSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topLeft_center_childSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3503fd79dd13f9926a4cbe6af1ef207caf601cc9 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}oCO|{#S9E$ zsvykh8Km+7C@7QZ;vWK}nSdAsY=Bq;N(0%9DH-3}nt-%{r;B4q1>>7rj$DTgcvu|l z_uBi<7BAsFq?5+ClQTNSwn!uPe7f!A^S^YTYgVyOez-52bGybJ@!1WhnP$#wU=sUq zO*YqMx~xRgX(q!(`ur{jnC|Uj>wR&Wzo&uqjdsIIxhB=bskVc@(*NGS=4N2{|9?lw1!Z8^v4XVM9w&q)Bf_(vftn_0oP;OV;G z(oL7XW2^h~OX9|Xf3DO0-rZ^iDu}x}Te^JJch|qpt6O(_{c6So4n|oF27$4$+4DV^B@VdoGN`S} zPP!cXo`ol25gUW>)vH^-b(%CV`dnd1ShP#c?Cw{;0}N^uYuUp5d1p~gWtCONK8Am1 z*`{qe$gu29^OoBp1`VA$d=dv3mc_nSf1WJSmN;Xw_?>xk6M?K-;Z;R;Z9tY~<-xZ% zC4sDEwM+3S`g`+#&F4M;53H-T`|Z}yIpxoqH@q8|*bFZIw>ZGSW*~j#eia+Yyv*3= zZ81ED4R|&uo?M%r0J8L2Y2JyW20$_CX?LirXvTfs&%kK^|9@BW#|&U>xr1Ws?bVB% zPL2XB2hZBSG;U)*KGbv)8^Zn){h&-Ff{92eUc9&nfsH>C^W6z3PL*W-}W2 zxl^i`xgrj1zqUiP_C}-Pj|~oMUQB0KN?^SIYu>@Gx}S}L8yaf6=GE!Hd*g0!kmbFI zd98jEr&>kS)pK<$!ag7T3NL?Gnvu}7JoN1w_YbF8&&#Xvzq!`W_?gk>?|cJB?j7&1 z*sWc((*7We@EsMibXB0zVAo(@pi$T60Zt^R*m85sWmpOL*27%PmdprCtuZKGg|frzu?_xoE`I^I0InQR`4x&y6(4h)1~j&>i+zaxN+d0 u>vX?&w_1S;;;v5l1aiFRlOe&q_LNz_{GQ-?!`9uPMCR%0=d#Wzp$P!TnjA?0 literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topRight_center_fullSize@2x.png b/Tests/ReferenceImages_iOS_10/ASCornerLayoutSpecSnapshotTests/testCornerSpecForAllLocations_topRight_center_fullSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9e39a3c5c4ca41524850c32106738d8aae86df6e GIT binary patch literal 927 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�$TK$`@c4IVeVY9@OT@%L^qn(#mhr zW}q+H{k?G>$dLo<2l;*AUT~}gl!+1Y8+65+P;EnC)P2+`Sr?UO0XBK0M5CD0C|hy| zN{~JW;S<+1_Ms#iX;U+__KG3~L#4DjDtW;T!m$y&<;t|*zjI=FrRn2c8#f2QP}|6> zM5*?1A}^~i%Vf-l3FHZc#Qr92Aa*sFoUz4N>(5s7nfK#c_8z+}?zB~!lV?$VBJinU z+Xgmu&;->Nx3SY{kf~$YhutXAw5Y6EfWb?_3&5o_zbrKP9_dcZb2p1o=~6kAR`ym? z|4lxbq;jLnwu5kjG_4>P&k{G#Bbq`MScS-6HFVTiC=ALi6)L4WQ5J9xqu zLsH={{RQjnkfpz2rTfS=HTpB+-Uj0Z8tN+*Pl6wtKQyL+Fiz+4kQ_9QLFM_AHCxpI zrv#e4i!PAI|KV}n*-8#_PDxqI(`f&aDH=$*PO_h1i}^pBH?VgTmH)oKlORX?)8^$X zFy+$CbuwBVbY6Q8W|KN^$6`+9DJafw6&;b-OBE>U^2EWtoQy!m>+tA+90iJJ)}0sl zRt6MN^87nFZ$ciI_zjOUr9=jc08*E?l?Defsbm_lQ}CegmAqtZ(+?eeo~RVGResL_ zAO)bY6etB4Saxzk46s)3{-u{rD6nGz|D#2=p*jRu%uI$|jJWZB74`Wm?#pgr9}T)R z485UX8JF$pY<()PchG{c4Hk(BZD0-&+(c`>r7t(Pejf{0aIDEs-RBgD5R#v(&N~Yk z`I7$2sw3qNsAa-I*6!LIK$l(-W*cs?z7lMFlWKMR+&g%zRvCE7&TJu#FE|jOHP{OW zGA&=0Ty3mkHVH|leoOgTIe2GTG3Ii$gQ2;}jUst;jJeXI0!w`B^{7Lu1PuYoRwsj| zwAxMlo{)txU@2NK;WgFV$cFV~F#bw-hh{cxKpPP^gfe5b_DwO1WZ)q`EUW!al{QNvP*k5$r$2JiSMJZKpdA+`Wg& zvf^ZXX5GB7jpSBA_k4Kz`u~)}#63WE>XdBqg!@yagOF?`*=7>TRH#mBQ3T%x8#AgCF9ruO&ovi1j6QXQL<(F1 ze#2+R>RMVxxk0$e{X>S2>N@9S3kkxzV7HMnvZ{^n6+t6O#f)2kBx>~90Pb1w=lB)x z!RHi6n#-1yHyR#8$<7$ZP@0)!=95>gb{8feMhdq{B*%$|ZobwY)&NeZez;=5@1by6 zXIng#OBg__mU4o5f3TYXb<>f1nz?}VL#$wSas zFrTe&X_>rss&IJNHi+*Ze+y?l>*#=jFq?n5XJH#kj+&V2WOg@XJgnQo^yIhbt9gMA zKiFIDGvUYh{{h`|a{1KFt=cV)yl=}{9#N`YCr4Lt8B|4f0nfR|bv1glSaGCi=Kyl+ zjQmKPxO=qtLiZ@=Jc`Y|Nh3uLp7JCPJD5KseJ3z> zU?G*_zO$9EQZkAWw?gC%GrC`k^ZR`98V8t42>sS&giM9-DZl{9X32HQx{N}|;sJMT z%=FV*tksDb0RElyhjA`UqOEDDSe$4-ebaDuQ<-J#Qu_wXHMiiKT#%|c2c@|n?jx_r zFSccfCRAGyxYa0;I~cR={i?L8S@rsAq6{F>*Sfk@!+cr_$QO490wcl}#*ae0%px%i z@w;|0HVjqHx_xo*g?~Mb?qk>I8Qk%L7n*cEjXX-O&pHaoDpg6H>X3y3^fAxr^Q0C| z%AKWNz%OWa7i7K-dg_RPV0;+&Ib#+`1-A(rS2+fqleBo5!8s8Zy;vana? zzX)WX5XpYEoPgQk6XC>|xs9T>hYk&M?*z|mLiXm(H zN4#>RF(dv38ZYZ;yLVKM8Z=a9`9F#_WvjaE;y7BrQy3~TVBmBci=8!|Uwu{Uf|kdV zo)=#{gF0W*VCceUv^$v8Qsk6)EPY3QnHN1f#w8klk{qM)AS!%88Xgv|n88S^A&BGY zE~+(7*9p4wRH_j1**f1KJdk=SS+&EMpR3$uww<3E52T*ddHZ7EMcq?pKVC7 z0CnO-@6l8Sc2ltw^`f6i07!U%WN(7x&J*EsW4Cb1QYR)duna)ne{!Y%1D}|!wweW` zm(n}}DZrNZ3hy=XO@Q<42KPZ`1{>=Td%z9=vC3|MSpkbZknT&iyMp*Kdt1yc6%{#j z1Y>;;mSaFXwp8y!uvH9t6|OOyXRFlNBN!x)2~g$Kf7{pe77}StTkegww#5-0n5RP( z#I|UTd8*`ffIS$93?u|oPy4IUIpy?fSt}m0X#q8Iw7FL&cXXGVrP~pj6Iw|BNjD;n z>5ZX^(@P6r+@XIjC4=+A{7o2rWSKjSTpiv!^E#hxXWFLe^T0GELf7GNr>}ly!&kY5 zDmf-hI*v2#8g-Vnb=+~g_wc&sa{Xpobw<~*uv`nQEW4< z!mELhd`7+uo>zOfQ|~)bGYw@)a;;D?(@X|9wP@xG(kbP1lkO|vy2<&ndBk-qS|KwO zl1DQIl1HRfZ=YNmk=LcNTYFv7fYsH@$cUL?;XTLDsp5KXu5htUvv}YzSM(yVTKTg# zc6}33*H8~>)Po{6!CX#Gbf}50C)Ztr5EP^qK+;9AOs}2*ejY+5HI{qqwfqIf`XE zABXIUFmr|qD0!9kUEnlepFH!iH1V|*(9yJ}S3b->1B-STH+s(h&cj1kpcSk4Ic0#S zsx_&s`B0&-H5Bod5TM9Z5QuY;QvRm4Gq!;1i0+$*YMyTa1^2tP6LJ%0h-HqYsd+SK z6c@q69PRvi(@yuAH;80&-R^E&XajRDGIs_4fE5`CPL)US4l~V5+b#?65<+SjQVYQg z4?Rq+(cYHxFo|KVsSiXRGF#cTZL3^NPv-z=914xN7MrpDejp%;0tj_LWh1 z4Nqd;4}MxZDkMb(hrB9$W@i+$RTHvCNwdo@r8UHSllpk0tg1uAV}YaNX7WV<0Gg0q zYrjF%WfjaQ3zT$$h)+Hxfhi@vw?+HJl5L%&yRD2|!yc<`Tivdhk)Ldj6=g%gBr@tu6EIX6@+uA5bVwvYebUA&8%sle&o^U}?b`nIphIusf#z|v3a z@YmJ-n?;mZ3wYV;{QiVL`uI^m>xYSPZDC`SV1~f?ZH!!@fRf2&m~C*u4euR&PwYSM zRLV)^%nZ8`kf6oF0Xqiw3k5!C zX39VA;3;Dr%uy(|CSdUKY1}l4^FYE!4UeKI8W12Y+U&hohY7LNuS&k<5U|ojypO&H zV($_s{F|FydF-UpQn!h#ygItsO|qB?v$(d%s(5gc)HstNDyz@QJKw|cXeqG4|8h81 zQ%uFJJ(TFbuJBnTzSN!=*Z7%C@bKQdYW(fOxcE;lisL^qV@r*CP1UUn)$HYRi0GJ) zvA-7L@Tf@Xmtd(R)S1Wyp-PZ*3&q>eEy9>ZwmPliO-&24DxKFx6c1)@7jLU2QL8u4 z4P!?$dsd^KbF+bGVMmAAcyUj#5|PY_Mtb*%k->}H!hd?_of~}Bn_}oKt@8Wwp!>&S zAVHVpYh`iZ>sbvxawOS;JSml8+k@EO_Ah-R$L~16BW(o1>sW_(u!Sp0cx}T&kb8Zi z&COCbaH(gh$<Myiz|U>kaB zTYk%7+eXJwqL^v$9DTHuSe2GP#DxRH$cBPP8Yw@|M4a`1vvmu8Y2wa)WVy03(jBqm zNt}f({K7X2Vf;aqH#u7oK|AIq=uND?f;O$15@4yWBK{S8iN33FXw@y$QDT+DiRCxA z7e4M6d&@}qVc(>kCKEt%PqJvTCoRfLrNtT zN2uk^MmQGbE%0sUA+|u-K@@JQm*cGXTAgv_FH!mxfN4<}vY~JnWE-G@wR*G*&7Fha zdT4`a9yw|vwAgrdDKPthZ4)lb7|xX8TQLM%1Jr*{V;eo)sabBZ{dpz(AFg5TAJ<@m zhK2R{RUHTV8&HlI1K<>XnLCsoF|!^yi9wht@JuObyZ{#0Mcd2(_?_?94Rh)gNBTTs z1m-tdg_BxAuy-_BAC@bd?y*i$kqU37A?j{4QvFt%1yttE&rpU<=e(^+>Wft|O6|hq zTeRyRf0?ZJ)zq_YWA{uK*zwFxbR!x9LfC)&sG}YKYW-(dfpo99>VRw_K7yJ8KcQq^ zgsvsk)~i(JmTROxjl{2%Az>6OSG3+T&q2qX0$Qf zRtPSsGB^ylm=9{hH z-34={)!($^nkCnAS+|M@uBWnp>e#x#lC$`k74PNl)~jtVry=z?h*1TatI6NUNVMU9!`$ zU$DQw)*w%70J7O=KAWTiqkk#%v6%r!5S%X9dWnn|wR!7>rgWbR$9l=#GlpXPcjFWF z6_T)rIBudMjL=)$*#?OPvwqj@1vJ`9?UvZjkbBzE=DWK-7!g0k4~ta9M8uF?3%TkP zGRQ(FgDV~<$ArCwU|2-%4@(yI8e7jPRgfOEM~Gerk8OJ?*MPgF54I@F6NwlBoj=&B z0U0ZaJZ6+!>y)#QIix5JMt5w+wST4Fi#<>8;i;o_iRy!g#xKvo-D_lu2-`av!74;^ zhVhOHq?Hyx77Hf&;DE6(L=wmisy4)B?>2`=;cta1_rP&qwjmGmzn;R4>1k{_jt#li zpYeG#;kXRh;_xhg9?&wPN?=R+YH};N7YXL-Y4E6cMZ1`1v1kC%0ic@+ON$nNaKFN?HWOjo)X$NTFoFE9n> zU(FW?2nfKK2XA7i1lsk=%f<|Kgb>uVjWH0{@)I36xp*YLXtw6OGjYoL0FpRZ;xH+K zC-S3uvZ0#+wWaE}L$O~deDSxPFqu_OXuu%0L|1ZEuiq!-S3V^jY`hlTuP}C_t=&&js{kyY{Kc26J%`?xEm6I zFZkt^|7{K|A7>P5_KYMP?6865O**ouKCf;Z-9lROBR{BTP=pM4N*-|4p4t!izA8wL zp1J+h+;yHyfG4-CtBzQ`;R*ftF`=Nt>>Gi4@SvDa$3AfUKo|ktSiTA78t%3+>`sB zWu!~5y(E+Of+V+T(-wnb33gyqYf!XZ3LY*uLtkU4@$mSQYl&Zs$jc#UB>s_h;O!NG==p^zmZyI5`zx$eTA&;fp&a~nwnb3rebzEf+=q=WpM~zu|KumLbgRI1kgoD zCW;J%F^*`YuKBQdQ)}-_w*#409^~G=(nC21(u7ps!_=Ex@hY(U(sARDG{fKO#p{m? zXv*IKhk)VQ@s&d%hM*1PBKrnQ-Pm{WrBbgX@oX$K=Shi3Wn6U#J0_g7T zL*x#Ch1gY%2m(9p94Z>fVa0e#hn2$R6yCJcCS7Ht&uxj{WSA6L-7bzA33mI~ye0v1 z-BWX#Su`?X5GZlZifDn-b#-{n{d8@00jO;ae|j>y`kr_!y7L-8smL=jf4;V7_|NmY z9uK^$r(%tJLr1`UDh8eZ4j%J9=h8f)23Sedw8WM?2)l*97@U)|)b81R&fb-_qm`*WIQ00w?vM4)>cu)>``q`3@-hk8a!klbkht zG`z+x@8o@p$`wIRUO?@-9+0vmSK>8EIG_L=V?<%+#L3BNxRqBNZ?4u}I0^%um(nDm zlDEzs4Cw?gI7(b>Vg*M6j@)_=1mu+9`m{)Lvs@6>@Mj>nNJdIAk?2pUL|%LJd8s zQXAvR6%_}e=xDF2JPT44IcP}LJ5H_j^ElnpJmSCmZOHp7yKn6#aFY*Q^bLsw&}6{i zR=>B&Dtt=h9H`7QwCXj>2K@{ywjMdd88Ty-lVc+AT*4Dp$X*}O$h*3?Yxb#oPJ8<- zhAwwcG-(f3S9&e(mAl9ZsfP_WN3ETtMg+>kSVeGMyK->~VA*j7+YRu^ahLS<=G9p= z**`1D#8ZzfeCTh&|L0ZgC#i}Ju%I_mHu=ex=eU``t*iowbS;0?JBnulEqK%<67so8 z>1~RXc3w%WY%Cdm<6ksJ3iMBm=g-cMpJiSckV+-ga6@AAoHEM*Nke`=7#j~ z`HdMJ0$Lh~IHks~?+*J|dKgX95hHp%(E`Mwn4Z_DfIsIm3d2MANEuZ0#j`~23$zi2WVHzgKo%>_@^_HgB{w zpGW4Czg2!4ZL>k>nRWuco6h#mwWc(bgw`P&>v*t_wfjl7gUbD)x;cD~x?Aq3yT}1n zf&5(bmK8hul(sO~QEh!!4&2%}>MQ%Q%k4q02bc!Cxyx+_2JTrk{}=gxWjJ4x($Xxh z2E>(H3&rF17=JS92sT6X;6_-QLefim_n-IJT`Vjl^#yX&LG$M%rR(SCgnnt_hyuX4 zs<`w06_7agS$%D7`a&=fd^WghI1vxA+K$gP!+IXQk4XyhT86+FHNBeFn5@myf*kNu zy$nQW^BGgob`8`YI%`&HMaf83dIQ=VMmYjIIyDkuVmr!EkIc2nF>QXIG(&Kz+S9)_ zwR`T{cg2@x%-`N?@Jq=O^68s)gKv?c{vg1T6M87vjk2#6o)duA-XemsfX9om?~Y&U zd1|&F+EoC+@7c?&?Tr70_R2xflQu=MqYk&FF0ZzSow7)49&n0i?x0p1H=I+hjU2qf z@e$-rKX~kDN8W3*b{X;jTbk6YjH9xn({$C5?zA<+5Tvy~Nj)UN9Gy(GLm8~KW4dRt z^dS)FadFN5K;o1X0Q<|c@opar7{N);>PbCl1HmR4qs;*X=O(CR!H1WfZgsc~7CA3g zR+vAd@qOxZEIU8m#xLcrEKNd>MbEyUT2NFk5~A`igWJ8tr^vgW#U0jlcJ{K=hlkjZ zlo3B?Jxu(~%xcRZaCRDBHb6gcGlqKPZ}Qz4`nLu2^8FX8!!jMuE$Ib%XF&#lhuyd8 z|AtI`DE?z|Wmt4j%TiO{-GB1K`)bFyb##YFO`ATSUm3uz#8-ZiQyW^rr z*HeN}oFYaVUSb}?@V(Oc2WHhkK?T#28G8vvGuWJ>5Ts&FEkh-Q?M(q*a|VN401g&q z_YSMlS4h5XA?NaHRQdrMjWnv53YgdySgdV6Lc0ndwZWY$q1lxNi=#UR&%pk8=%b2{ zOU$uWc_?8ygMFk2s#Jr7N6``KC`&Rw0J@M+cRV$kr}FlUQt@|Xz%kk{(~efAEu+(o zbdF)DY|cDw;ux0_QK(BMixpBG`Mhcw930IQZ2@A4OZ+r?wK#o7gMKbIDx*+Gie!1uYBL6c-6JbGL;b{mPM=f@QwAMW6blVA%6zI<^`}F{r=z zd1Fns;+B=55x&TSBJ8TNT+6fF)V|tvdKVXJim&)T#)5|K&5y1nEVrlJtIq{}HSP3SCgV03cE6RH?37UNcZwdZ zT8Fm&9nKR5h3f(>h5{Nap5f6 zP1D3#H+vi=%Sa0+fr$?B6|nR3mQDuUpU}DLbG~iO9r!dFKi2TyN^;jKqEBn)1RRBM zEEFWG6d`qeuvmUfP-E%`#ADV3`o+bug`-^zW)1`(Hfsw6S~C9@{0P9K(FH3hzZYDP zaND!!%6z`LyB+!LUo)Zz^Pw7kl(N(re|;Z+(TC#ry8cHNz6TC@=Qgw~lu?_+K#&>M zB!&lJYbJ~7K;|HRCTC5O6dY?dyE<|9s5$lCea}IFx1Y)J3YSWk2ICpwk0NzH{m;$H zdeiOC9UjLdjsjK;7<9kVN&k(!Xth+Xzb7*MLHcZ-;;1CMvY1~^_qQQ`UNZ-`ZacHj z{8oDpui79hXw+Q?tk8x)>)@C8<*h%timb8uX0cO5&UC zx}G4bGI`FeWQ5W3TSYTa(}a5ubu(`j$`l zC+LAn6%}&I@{q!tU2aGAf{R$V2#*Cnc7(qrk zpSds!jTr#^LHkdRQD!_`57) zNrtRpT&XN{-|;jrr4>GwZY$+MbtU57k=q{D67XmnMYmEuh-1@_)LACs_R&i);jDE< zUC+ngc<^@Zks~udf6Z{;_XD>Qd$9>=Wdtk8mUgsqv5!hm^1h|AhN0@Y@VQFjgyffx8ayk*ZBsq0=-foxm%Z`nI0I>2%t5ar=~ z!n_Y4r)pMBM82;D#L-Pqg3>(=#U&A+&l&k)X5f zUH+vUsOFn_Ol9I1TH}RKmoGn#OJ!}`%qF&h99CA}V%UNoX?1Pa5D`1pmlF!BEZT3O z-G5es$AvC2=s3!&3ckaj)hZ-%?dDeNO*U_IuDZ3TjiX(B(&F23+T}UfBEHhO&P z+th60hYuCTbaah@>v*M~-pt-wMo`5HL37Jwjxpms_EuaFn6`9c6YdRz%};d*iEkGG zAka12gpfY3Iy)MD;PS$vqI;*4dyz5>EM~zvgO6@P`o4BvHb$o}mxN=2$?%xv_lq!X zeTWu~Gsvn<^}h{F)V~IXh#O1gD=ji6M?b+yzjMeEUjq7W8*TRK*oZRZw35Jc=`UdJ zIV*aiQ;~3P(2$%cvg(O^?tLW%UkEe5q`MMZQ$OA8c)lRknD*yp)Lf^4AE*Tgm5 z7DkdUV^9;s*4`Jy6z)-IrvZdYL@!^EVFG}K)hi^A-emb;sI2_8Jincki(I{IhS55ZdJxB)^`Nh_|}># zVRTiwv{wrURoGB+7=zSVM>kZFF36R?eEpL>LJypYcl_PNpeca>5_=P{eNc9% zV3d!kZz*JuIbBPU&%*!NW}!k8z;lpLWr16qVd!idPZQV=(;)Ob0<@LZ_f}=o@H|^~ zr`lGv7qxVRv)=AGD+wxfKN|R-fINUXQ@$Y-oe&~Qq8K`3uP#%&99}n^mnjWzkSU8o z1q~D$cXq7;Lc!J+VZtUgf!Ze*o9%s1#;Z>>n=0-987l1j!%xGSY;6O3fwFYjt12p` zx_kKtg&GqVU>XA9wtnt&7kIUsA*#(xVYBd4@PnA;1nqbSoO*CLjw+U0-V?0MnnuWR zWVeQs2Yae5Jq?;|0(o+r!YQ+!a2tQ19hkeN9c7$rOASBCnKMw4ke{y6eT`b1F-#d- z$z#gx7PA>}+vkQtU>U6RFTB8T9A^N30>zikfWfgQZE5yR7nafHwT`a14c8M-5LXr| zbdlEpe`JDF0H&ZAF}i*Lj`yq)?Q4m|(~Pk()vByF+WQJsHobRKBv%8FLnUDwK)yYi z8E;lJ>6++EG9L36&2sF{rm!$oxSq2UHeQWg-uZRo-1>P9uc}Ccy~-Z4?iZN(T9>52 z{XN?qs>*`ziQq~OqoX0UJHh1Gc}-1hdZ2W7Ar%qJ-t(aCf(*0Bi8zC0iTv*t_}R?Eef*qMMuNRK(U~ zY*0!uI(Zthl!*~5&>4(rYCghZ+e9g!e9Ht*sSv!~5X~~wXeOWw4OK8w&8RK>T4i6u2lzf;SQ zZ&UOyj;0Cd9))49vVget|0&7|iQte_xE z6JdWf9?;YpO+BA?u)!_1dUlEqR!FUAD&>@u*T-i&}ba?HrZpK>nXS_wnbe0$O{VsWH6sc{6Lt+Oe`9k))ksE?l_H~VE)d9fI+@q8w3)*!x| z$y!&ldk)Dm(=a6$4!u%AamYZwwH)b?8utMVvq#$57$Z8|g&{nfnJgMxgA%@2d9V~q zYN0ims2U#oIci+sLkUa?Ww{UALADistpoaD)-je`-^HlZi1%5dAH zz=qtVCE%dpQDQY3kpcY5a6c3|@0sPPA(~k3Ig^Aclvyw5V_G3~n2!@tH19cKQI*G; zg*@Sb=*26HUw-5lCkuHfY8}?AeDVE5NGP1f zr_LkBreHPyFkq;4zKrUQznJ3Dnn9nUg5f&dKEI!LL>$B#(Ed^|3UA-07#iUDE^SP( zC%st8ho9e}orrM$HpV_R#g3tl8}2n(EpGUgH3y?RM84ou|FGWpyhjZj_4IGui>X%w=*LHXw{h zU^9~lD2@INqZo}5C&9xjL;qb!1|J$dy81QlMzAT#NsavxxmeE$DSLQlt=3C*j@@4t z?S}*R?oXpetn=}FD5RxJxvpe9My94B427+XEAN*q3|iu zJ!-=%cwZ7ytml<|=336q0Sl$eGEI)+<;@dZuyN4?V;J~69SzxU&Rs2~pTaZzY!bK2 zCc54B%llC=6?f$5il$s_&sLi^aUC~4&g}ptK^}kG?Ko`lNfg~1lfCkoo&Pw2u`GRs zz&v`O=u;VJFWVuZ{N<_WJlAUIx<`QH=V{C_C%_-<61+aYCjV+w(#wMi;|cjVA;c1s zhi$vS7|Sd&ib}U*CkLU+~M)vb`1nJs`GVrW`0lQ2=}QJOuhYk)$>r z4Eo=On68Qal-2_i9c#E?1q?So_jP{ER95B*aN;xY2FR9=%DXZ=)i%K$J-QQ88Kp4a z{clA1Cl>KNuHR(ZZj6}+ZK)0IB0yP^hMr0C8N$4zA`K$1`$XI<-BV02LBY#^{#O#* z{c)lA-(olpQc=U){^h4x+Rm}P`FTsKh*ZK{)0d6OZjUIG!B5o%92y5R zR`rY0cBYE2dVji=eA&dQ)cS9KL1hz0{gLG9q4cs*QU4ev%l6H1PirCZV&VFezf~`b z?<<`W%Kh868-Qq5Yq@DgmW9S}0*{Bc2bLt#myE6N+uL>7+(24oRhhH4%@=KTn+&EJ z3tnQogDdOSx80~&l0C)IZp5YTd56)|V?eWAruArv!Bs{l?nlwj0_oEOco#yvqG48x zQps-Vl>0wZq*vbuDj+QzsFL#VI$(WDU>fDYv}CHJd4KHQ7aA^Wce#;!o~(9dT6^EZ zK0r+utY=V0aW`ToJ%HVgd@lwLf~1&wy4#yCPC7TH5E?_ zTM|BqPX8pBZ!EO|(+ZbmRY^;;F?ho0f?FLkj9@R<88*qnB3X1V%%$yK7D04T_!SIFe`&M}Z$$1g|cz;Nix6F+0^Sc3JzP0*izCdg$21(Cm>Ti9QoN zg_0GxU39V5m({rUHvV!m8~OGAKlEW((l39>h zp;ngJPkgiyVrS}KaqC@0i{)(vC=;?!MH?-rssRJA9Q=?}XwhDAEg%@SYc-(Fr4UC* zZ2GAYDa?uml;sNM1_B}xA+s}@z6?h4EhnaBA3)GCx=7~;Uovk@da5Dxma}CTFm5Ze zKYTnTd8ZKac?Fo0C#&@@b8ukrKzxf-n;vBFd{db@P$jI4`qYZ$k|B;X^U65$yT&6r zx0&@YTT`T{8XLoB!^>wmIKpKl3i*1OE^33+JoZ(0pSW)G#QBq4bcWW~a;mI+EMSSX zwRh}SXJ}x;mAa!bWYs4?;w*-LW94GnC~$r}&tUOIaY=agRWfS#o_UG6W?-J*v95J7 z%B^>v zUmzPKWB4o(M9zfyVR!dWg!YatsciiPYN9EB|ATSZF6wnp_>^{_`j@*+dH?Z>aEJ&T z|Ab|F-+6o5gfa9-p4iDXYfS$^4BX7m#B#m%qMD#Y#8B3dW$*3YK-E9_5t6r2HvVKCrWOVgKyVPJoJXk++xe9JM=}`n5CD}0n_4YB zPqi@@j_p(jU8xLYeHA1h|u^Sn-0%HG@V3p(0--TM#>C$*Zk z*BkgSG0-U^Gf9U3siiKx`QC9+AYt(pAt2;ywBt9iC?cZ#by4V}+h`?unazm zAG;*7VumQ8L-avV-$bu_ad=c^8F$VDh)$P!Sy!P%)CI)KZNvB@24dRte5GGldqw-Zm(_iXTMsf~>WH~Lb38|mkMk3=Gmqj!4 z^fcH{1E33~N8qX(P zGDP5V$09M17VgbRoIDz{m;>i4Wxw)&ecWFNm}m40*%y11x7v=PI`;DtDiGQ93U!2v z_DVO?hj^mB%Y1^oA-KBIi>CdPf~hN!k#Uy3aB-amM`Ax2KUV`)kh!oLWU%1QG*=c2 zK=gPeGNWjw(!+SE#VXGeqCZiyw=ijFoxh*W*Sn14lb2UkAO?TBy}Tj)Q{4gvXi(f2 zLC6#en2*eoO~UCpa%6`nAqQ6Qx)wXFTKY;!HsIhU6e`IMxgFB)!`c9Pi36C2;{bR4 z3XyqPG%cxid8OOO@d0?v*+z*B?;kGGtGDdiv!^>!>u8t}^Z7THoiA%8?|T~k`1+`5 zQu;XDgXawp;xIT%yF&1WF!34&GY4OL;i$y;3Sb@*;L6NWa#w*_Q@V3s{<_GP>Dhne zkLWC4yAQ$ugEd)*SuVt`wEttkYyy1L(f&8bF$OGkl3DZ9=$uO&4FkcmSWC4p*cvz? znEt%-iz9WiCQ7(0c8|C2@Sxc_Q$);YuK<5Mnt1GDJF5ix;896Z+iXX$Si=>|wcs#? zz~%d8dDc>71E{f=DlZQtt8YHXCtWXUV)avzJhSVl7>cUyKwkTzV2oY_uD7^=YH;(cOz z^Tj4%xS94*&R?OZ%a>dI1*6_uU-4`mkYjY)$KOz<72gz*(mW>3Kh$=FUjTsu>NwRm zPcT$rA5~||w_*3;SaS&Fqgb}#C{^MNOO(i|rhnZt5l-tUA6<#gBndZDc)vHV)x?~+ z>1Z8KHjAv!yrYoxyCKy#&~H&2g=r$GInF4V>2}q3Tzxb+7xLE{KWOoHD5_kzKWLfk zPoAeRiQ^miB`n4G3y})t2KX4&{eTgYV~p|f{>?7d{yhfyR}8*i0BN+C5ACErvo`bC z`tyCKqLNCL2j4*pYvzyk45$19josGurq*NE%p1<3ho}38rgUMUo^iBABf`Sf%N)uw zck|6pU4ZYo?b|WWV?x+-*cgX5k}vWj1niu*1YghY!88dnkm!qUP5`@3U=q8|ufe>_ zlHQTD9Cl;KK46Zb7H?A^%i<_0gjN-})2f`y*O^3^Ror8i+akCkUBzlO`D0!slIGfe z1f1=itBU&D-&S|zKg&bAzC@bPU<3xcBhbK<>blcIbPz&jE^@dtR!~rhLK*r&eFf_m$}RKmcY99n5-Q-t(uf z>z9QAg>l!L&ufGvC(QV-#)}zvc=ZIp$u(0qu?I z7-jOmw^Bq5TU4&{Ib9VW7qUpWD9lRi1mAZdpZs?@q9ufALKu+qzSIA0kp0k2$<*lW z@EE*;Rm)RErwO~v^t;2yukd&~&+-hO<{B`{5auEE;7HoG2`nndkhe?UXW??G{WFrW zv!c9R>od)w$n#t5?%7<1xL2!YNmwqkE^L&O2>SrbkFa+Izb)s)!WwB}TiBMt41lGUPdaCdhph2Rh@xLeSNbMN!q`+j@>fs-{~W>&Ihuh~1Z<+o>V zhf=FBp-v0J`L^Z{SEoIN2mC!m7ae6>=hJs_IA8#!_o~xL6O*C?^mTIFo&D-+ox-Wr z4l~&&r;#B%SAX3LpM`8SNB75|l|&m_oma@k=I}@`BNKM|8;piNl1ZeGgAKO^O2 z>jJD-V2gmB2g?>QccsA#25B7c-Sj(e%&8t;%lHR2M{EVuxhvmy5c{`2BZ(0f2GqU{ zG4|C-s)~KZn&G@yS)?&977a10=DOY8C_K%`6YZ9e=qO%L%cT1-AeKtkbxPY?)<5(d zeg@XAE#p$lx)hqUwMAgQEy|sszwq38&vRH zfZU$!P89Z4j>({gg;pJClWuOlUA(afobUPhlcT0GFIR7T;F9dV#$k(BXJf?;)S|I! zw9!akOz?&~1M;aHd@SzMvh&oHkgRQ9R$>AbbF!71S#F72OyX}wShnoIc*C+*i%Z;(!2gZeL#5&y zm2?6K0M=1q-Oa`REiOc$F};a)DoNLIAL`i&$OMp&Y-bpOJH9XL9X;XJw@-(6ttez= zcMoNFRjZm&`25o~uY0k}?5o(4m1D}cO+6nwv}D@c>gtJs5qZtlqabw{i5mgYkL^FK zFRp8J+9xZA`^Z*QE(V~Mq}mR%la%a#y7kRemgC+P#&6Ypf`!mgJSm685b=$~9*7Pm zx}Jpbc20#V_O7q%l=$5mj|b3_{nel@)$-c$Wv%4(mH*WlHF2h?ZT%LN%PDK_%cf+s zWvrga$y>ZwL>%#C`ENBrlnTlb7hIC2*SSbPZTO0;2m6tz5bc0*n@(6a2R45DCBIaq z?&8gEjCRh+er-$tPFXv|ZIIun4Ra*H?6SY#0ey&MmRn&qZ2Td%p-1rU7c*=}hbM9Z zqTpT+bx(ZP(Y?{kHdFvrSZLM7J4m;gVUtTbaimG3Z%i9fDjOuowg1Lp&B`!5I8O`C zhBi(s5T{5aq>`4&Y^_!chXpvfv3cuvsEv{5jW;d;CI8y(hQ|6B|=g00vr+Ku^2;> zdqQ=cuj#0QyyvPZ&5KW^#}6#N9DK!yb;#2zvBs`1^D@Wc@{c*tacWVM{AGBFOOZ2( zCY)kFp=pFD5p~S}WpaSz^<0hH3}(|y&stlqBOorgb{XM4yUC3sE(wi zdfQB26b}db8ig>9&`23TddC~~xsjz@D_*|8I2XM0Zbp~T47*l7Z7_M_<&fSWEp!nUyfM;d1$4(Y(SAC8=}vs+liy`*dI*6)mTs=Sc%+B3c84 zWHHu3TbpN>-KL=Y*XR1COoS)s9-iW3sf`)UAaRj~GK=t6F0@4AI|RpTZ9`iSivqCd zO)>pB^?bs2SRHx>r^6}C;@5FE4dVzm`-DA!MNB!_wF0evf(fGbeSFdOx& zQ43?VHO5##adch)Z#*T7ZKA4otJv<_%-Qw&4|l&hpG)f`ZE=Gt(O21>HV;pB(dA-k z_h8fBkDyBLX`Yx&JB{Uv&rcOSz_9s_nDNbCCnB_H&oUDtkwTlV^FhKhJq#%v2w zFFm-_q5LB#Wj#d)^c2~3U9Z3`0AzPkoX0(63EJIXF$2A2p4Md!ZncN`;yV6Ci!iFS?iWoI3{~!u{%yL2VKhOe zAQ}MZgyFBo&#ZUF-_LqV0l$6Ktm%;1XICt1#ZGxFZ{GFF_r6a0(O|{vBd1l|7zo8f z2}ojh2`SHc`Lfgh`n>ELUiXGps;O;KiLK-scQN#&<0 z7hP)m?D*!PXnk}xs<6aXG^S&$Aa_4`K(8}@qnK{IOwVe3<%`DrAd5R`{wh-A^Lz-L|O{sa0(<@Wtnl-posyW7n3B!`!M=Yet^n8ZoB`Jt+G z9py!z$Jy4Y7lL$ykQv-y_El?}=NDdy*WIt{>V+&36|a?_Dgyd*jY# zdlcNBj8bXDn8z5$NXW|k4Daf+pi|nw9ao_?KGiuujPc7BFC7-#)WJ$ zAYJiXo<1?R1a3>aoz}1Cn4&()rGj+_zq^T%PdBv0uQ^la>p-_LsQnTQxUye*)ZZU4 z<$Sv5(+M`Nq<>7bGhb3%JXv-i&~?FQe*D$VGJ1s;RX%3%CBs}{vQzuXC||8H*9LFv zU$Nc;7yFO)7Js}4#)-AM~ho@a*)q7}v z5jNBP6;e;?Vp1w%XVi8Z^iZ-vwvQaS?1nB53`(mZkvapLJui zwdk#?3`G;y?K7X;18HS1lockn?K0w83u8}p8yv-Kqq|Qyx~dS$Ajyog#&sK{cD=Dj z&b-$d-XMC-4&9S=16pwn9evM~ItAJuT>Cu?et`_V%nN+9Z?V2`;Pcs9+fuEW(4>19 z$KcNlEHnw)YdzC(Ipj;r7)ds16{dN;$%Q<$cPQpBuqaEDe_Wcd-mTR$?8a^hs$gN! zbY{NG2SsQfrWSqtQMqbOJN-h_fJTP7Vd00YnuAoPnL}qS%)^Lh12>bGry*AHCbzBo zD`{9?Q2Rij0S=RP|D3oOL@s-xFXgao>yfa>#<#Fb?iG-G>d|{O>kdU*LOKonD@{BE zP>3hm$q?uKInt(jg{}2{dTgVo{B?Tu2ScSUrwocIeR9t-)or0thNZ)cn9RJ8IQWCJ zoh2HuhT*po<`M|Jq{o#1iZto|5~DUM*&VDDMNT4A5KaRZx!0?CSLvnhl!H+u150y= zp}E4^k0Nrft*r$riyA4eIi%FZNH`(Fa7b^QYMydEs~1DUB#k@WRceQ=R`0I>;x?Fd zN2`=hrKC7ZUAR0hL4MprWVQtC@Jf)xDe*IkF-3BFpX$PP-w5A>-z1tbF4Q@ z-%78i-Cz4B?2$-kLti1o#_GDX8qCG{!`Zn3=OD7=pEZykC1)l}hCjfxGp8zbx+4M8Ho$CB zCQIp<`M`eByq4IV5P1_;H6k?JLKQ^3irGv-LgKylDl>uE8T|qj_U_$Da4311rUs%+ zNS=FW0U|RQO1@jFmId1g9ddDlgZ%b0JDgX>!{oku(Y-S=8Aa&2`Fr+m79EWIt-s@0 zfS8y40wYv1%gk6p7o#hWza>HZ!f|lEA;mhA=YxtYa#t<()5YZsS3V8Ly29tG1d|KK z%xiYl3=f01e+!*gPO4Eu({plE9eQYX)_lP1H;p+xI1c-$4JWF7Ndc=U8vlimpfV;A z`%V{OYHdv~x`JCXa%I>RnYBh3&i=YkRh=xW8XnZisobx6tZTH+B3S&ZVdZ2m&dLXB zyzT98bh1x>ddORQxm@J8RyQjdkP+yLp7+Z7O;)c;{^8KX^!Qj9d;cq@?}DZ7?P{Hd zqyPEI`lQGr_Y%5CWFX6Lm1F=palj-BWpFAgEkHqwp`Bu6ddU=hODuI#vK<>l#*Fhl z8;F69C67GuNJ!&i^J@avyl*$eUJ)%JHq;eu$htsv{4oSx3}f&QayG2>gaJXg)5x~2T$m$3M_=ZaM@S( zQWPTF@gV<7D(YTvzMMBXJO<_79U9f(ym}XiBjJ{1sykXPoG%88Ml%$122v?jrHVoQ zaA`XG2wuzWW+>GFpOG&=N%Bl_bKXAch0rHvAvc0Z<#+H zBJ2lK>_S~kv+u>Uo-G`cN*@c0T*mVUX$Zc8*9yq>e+I6Dr5W|1>%jor0MEF%QD5cPNmY?_BiMTauGFf_HX9CL2XxSpz!~*L;t%&=Jh- zJ@Ps^^?k-I*P1)q_%r@vfUUJ{&dOsmu&Z|8Qa2AcJ=(R)|Vbr=6UT1VeTJ4Z>bP{DAiyr{QZ2j8ST zV>II5{cw-!OE;wrogPz84XNy~kK={tXqG~(vSJ%b z3}Bkn4B)S=Cy__(f3yX}(qSmKF`L3fbXxBj4KeWmr`bX?T^Efn6<(6!n#tF^P{#dZ zJ#X|dxbWNwSA_={7FNg(gZ`zmc_7*&q|6&yjFmig61V9>q7y{{^<=wY6VP;U@spdv z!P@>-?|$7pGjrzLkqWUOrl6R*{1H$iGsNa}%->$E^yH~u%Hhd2wM4QDhd%`{lVao= z_*04UM$f<2PGE6DL%)IS3XKGEkE+uKmboR7HYuiS;IN;Jri#ihUx>D3;EwiFNSF~y zFCZZ5P}nGFsPHQi)36GE zB5KHy4RAM!pZN4e{1^}>NooP=}*i-v0&4`p4uv0oUa9%6O#**z&~KM??m$(ZFpz$mY~#i z&sAd3>t4-^9h_y{MhsQEgb z$g|<+MZ`~=$3LAJB0Ghh$!;F+a#U|y`jHqUDY+`_3`KDWbGG^%>Wx@Y&huSE-%Cl~ z9bWz`dP^GsXiKxm5D0nc*4#77VjXV{o7JUR#=WwiVXTRg5EJS^v06lw6{+WP1 zX0@e7IM}%E`{&Q9aIETmkx1DO&iBhrAAx(GL}>j0uTOTiAUQ0=&(CL8!g%|P9X(qd zRw`}Wqk7?tu%zDg=8HuRc=NH%!js{ZuoyzjRvm!Yr=HgsjCleJ$8ly!%` z7SG@drjxvRc)hBv%x4=iys@G1K{9H3M%HkSMh$a-9BF7At0QXS zB21TtN=mXQJ5;1|4Q4Kym9kX6eUI|=%kJi?`F13P=w`Lshxm@pK13hVaaWqG;?l?J zA<;3bhy&(BxDz%gVo;FCe|-{f2vXt!Y?bs9i{{%OHb|?^$}P8@TbkY(4S?t(H5IhWTSlYjq?QVI`ATYRM=`0mwpZJScxRACPG)=a!#};f(1}N`&%CD zF{?NY)@&-}MxDb-!t}r<%18B~k3K}Ck0j(em%flON<(~g2H%@1kK;7 zU0oinIv;S?djM+VXat`G`qANIh0JcE!b@$PnTAt}a>H7);t}p|7ISF1p}&Wu1>wh$ z=g%yG#>D4H>ja_OQz#x}P7$js^YaE|1W1436IHY!)mI>D6&&BsQAIvbd%p{o2T9IX zY|Se7c04swawph&(gV*iO>ZE~P^<~P-e9;lp&fa_;_}2wg=KF&$#_LzzXG|>eUcDh zKGqUe9jMKRGbbQ-E(G2x2%b>s>!#&@5fNm!YGM3?lXL3OYv+Qt6RoS83|?|bgx+BG zj&uF!zktjQt96w(D6jKno#}?+3Fk|(`mgWRhTE2p@?eVBxzsc|HE-g>$31R{13wYu z*rrh%SzH)rs_u6B^M2<6n|-`(q}LjBV6Ib;Le8cpbQ^Usq5}Xj8GW`=weOja^-7Pv za-DKZzc{7s+?+Y~f69LYyleqlf3<7jDHwSpo9&D3dR&~j%Z#PSq!MT0G1`IAilEVq z^a#@7L^qh3b|$+e;Ym4KM_)3{5`h9-3S=#o8sn@_1w%mDSFwic9{n4(*d%lZ%o*efn|wJKI~*E+Jt)d4~|rZJ9YeFRFOZtUbb zcRuM^AKhn(yZt_gD@mX1&QyvCFRgak(n``c!o~eeE{Y7P`3f2Ty#5`MXU2ymkGnlh zD9^akDQUyv5zU+r4-IBl0Z6N_@u?91An!LWQgOMvNZmN&zqzvjYkE_~55TVS{tlKQ$LXU9xD(sp`J=lIi&`A7Iczwx|tpuRXD- zOoZpx&|Y;x6(^$tva<9znr*+<4aV&&Px=T^1w#efo-vn_XQ(Rr4Lvny$zQ_27psgFrg!C_+>a`${@hf*h=?_VR#8LuBLwtA}#@Elg`_LZ~C(`&VzR4E*shR@*!-zgKm zuVFK>?y6YdLqf)Ji4xr*F&2W3_EA2NkO)*UYF$iW1+n9P!#th`I5vFxI5HS~M%e?Z z*Y-LoNAMWzB-$E6ZnPHPl|H|{&o9uXL_G8nCuqLgv85Y&aWL9!x4sUU2g|B$adSK> zGFR&vJwN}L9hvt05q9i>R<<}r5!p1S+McQl*ol^98sFktl~3=N?XP8n7o3gn*Leim zAbT^f1wLR`pxl+owD}pBmT7CrtE&B(!S2_DsX<}uh`PvPA{x6GdOzhmjYxxbd%)67 z`_DHuxiooPkC_~a-KUMjG9~B0H;sx;V_@X6j?Lypc)9eVA56fek%rb%w;6h&+`M?w z?qq*$&OwU^Z6(`fI2)KK5KqS&?=wuR^hiVd93K1jbW}5*8+IlEtPqhoW=Z1`lam}A zE_JD->tzk`?BnR8-?EG}8@2N*Ewm*fGEJVNkB3rg8? znxlG{EF3OeZ<2sYw5iG9qt&a8TlF4w>}c(#Cg2OPthA6Tm~U{~sSh(Nz{Ae1w+Pn^ z$sCC-P2{qE%)(w*7HwmU8`ZyGb35uf=fm zr&=QWt5?#-G=cbDBNcn_!cW<+vwn*XlNbvdKf{jGJP$i@YlC-ZZBase0dT-A! zsUnpN$yvJF_g>?b%DWu_IV{kzmpN*rjmwYGF%3}hxGZ1pFEr|C7fwx4ohR>KB5$|^vBn~1FuTJhrlcT07MZW!D9M)c;(AGxp2u-GP#DA?}G7%?ZwwNu3{w` zWappCRy@_RBjv6hhf6NoJ$qlHueSm7@3zX4S|}AUk3U`@nM&Ist`<&LSel)m99iSrYMip`d@cB zob%H9YWhW8pz~vDXQgXALAMvE6DpVO!~nq`nyY5tYwek5I)?+c zvW7gQ^di0ESSd#OyAtL~=ht?6eW~#X_HOztuT`NQAsv4;(QeOq7CVQFRsor@bL`V* z!w=*S#eNnW{Uan^!<8`SB0Fr{CZ0TYX+64nw3ziTHiKRRF7scbB)}K}wZ{I{KDRsm z3Km8kF7Zn5fO8&(Mk)897TqIcy}n-9>fiZbFOyeZ_y=}=dK-9eKbt{of;?5D&89Uw z_)^h|;2@!2-goLeSOJ1?ip3%CSD`t4zbG~BT*d69E$^jiQ%bKZ)z?hl#r@>Fu0&q` z>XvQ0b-Yu9ODkIh(ld z-KKSCPJE4RlxY$zA^TX8#6t=F~4cK``> z0i&Xq2%*saRtseoS2R$Yx%Q7R-ztEe(3lc4gf4ijm+kP?d4tJu_lHVU6_-uRWe5Z7 z#R2DU3~xBW0%kK>8Bgad=?lW7>7Ch=R*5py@iU^T-sR?At8-wLcyL$@o&~_%oq;N` zF>;GO_fzUh8veAsTAB0bOUY)-W=2->B3M)7noq-{K_LrORvw<=geawvnJm_8sAa0= zpCKZ%%Y8fa&sKDZrTU50-w75#YrplDIF0pZe}`_b<3=YXAQ6o8Qa-v1AlYI944ijF z-p9>cibJT1z^6el8psGOSd@-&p~mY38zn`Y9@slC9+FTlv@LXTDfZeap zWk(UEalTisW3FaouCP!N{G*xu?pUZs|HrIGKS@~WSBGrG4xd|EqEle8jU*yxMU31k zbB~bIl zH;MF4Z2_1$*9PNtT*)a^LI*KGZ9Zfi{7#c=bZCsBe9*W*_^lOCJTvzJhkrwBW=>jtFl{YXclXIewQqG)IXT!`n? zlmzcU&l7pqe0*i=m@A9F!_>!lB`S}hJl@ljVF4@1r)D&yU=40B+0nSEXbp7?cKp+WY>i31!Y#vKrQKTppayGB^Z0%~ULQx^0_)Z7bqQnJ4se!GtA(UZx3QWpY5BS-!67l)e78bV7| z728Ye-G@4YKF$`LmY;LiZE+BjIkzCvC0u66K*C4WV0gW$uvATK8-b2{ z5R`+j$SE}Jt;-D=gY^^rY~a9}g5-!&1FkyAw?W-F$EQ_n4wqN zTk?CTK(_X1mQ$-}ejeY1=C@rJo0*PWq>OrwnQ^jbWP{`ePUcC%<0fj$>a8lo+Vxq5 z!pi6&T*mRVSO%cHbnUGnZzE3K%Rwk@Tg|_u8JFK?psOq63f4r6@tM_;AwvP_skx3| zh|5M%#_#?0!!e1sMH%G7=@dDFlUs?yQN!%>Wve!<2JJ5hLl&{6-Tg8_xPGq__An4b zQUR607xsJ_gzrr47cE1NSPy9n5L?N<)L7acS!3$*V76JmuQ0K+g}j*z~ySSM*c3I#Of_nALiaUFb|l_LE~`7V(-wvnH*VGr7y z{xaEqgv)u3W&WM0MpB6ricAYe`VkQMa*m~UY;V}IAF2NX>}oG;*d2&v-6Y}Dq}AO+ zu9d$Ll`;+YF3i@*-qYwaZSUc_YA|9n@NyPY_F`lwQSE&*&yE9QoMZK~_ zlLv}}Z;p1ReUo{tC@0HV!(GV=fFa=n>i-iIegRtbmECFYl$N;e)AgoIdqD!{F(5sHMI73iphf!kps-OQl@md?VNPQRlhDhTEr?aES8tBGu_k+rI{s`d z8^ub`GVJn|%0@Su_-%$tDUFYL89A!dUVvQ5Y}!umZYc%^-9@(1lG>prxaatJGc9wi-X zzHT(R6JJN%clsCaXXR+ux@fG`83dJ%fA%#a*Vkz(wT7@<4BQ30E1C#vNT@hl%WhED z*}ckP{xMw+uo!&+XJJusEI{cE&!5Yd`Flj6VXIbzyIVU^-jOt?AhS_!ksXc^tNg_1 zMUc2D?TVECp(*9TT3564g7QcQuGfuIMz}^uN{+$;e`m8XitNp&220tIJVu}6HMXEu zrY;eK2<1yn@(7jM8qo8!4__9Ys#%yi+^IaTAxAI1!> zwov`7!jwH?=Ai5IyPTPQxcPMY93;5Q#em~Pgt^+%|Ldt{8GSVHv+UbUmA;eo=R@~X z1;)%tCrwZNB>awxSr>&xrUqXi+`}m+J{p>|zN4Y5{Z=VS5+bgxtntzrR_C*x;Juzv zYf@r1Te+y^c^^cAFHji;PIq;5i$?(c--(7roG2MEBSKC(#_G9ydrWu!@Zlam>n)vT z@N}qXx?CAt=P*Irc-~GXvB%u}+bw^B)$*^*3Lm-U4EIIu`@^Ib{fuYb@!Vgqdf8R! zC=L?CIo-ccgK1IRbi%tr?qk3bq!CV3X%_gekZAG}TA2^3beRp+G$MW{GxPSr=XOHD z#f8aoKs|_9)a8U;!?RthgC^U>?|`G}8tW9fv6N9*M`2(mrY2sL1#1PFX+ubh&MQHY zUcV~C(7?Z5bDM?AVE3Bso9?+=DKn!em;bW2M+&Mfo6~1!>0o%?GEn&OA0ZLr6In6F zMY;H&{LWGfpwET}1)3o3b*{&DTe;%yUx4M->ybVZ9KIJrF>`YYpPe0g;D@vPx9EY`E_;>)gF}x%Q*bh3ir;Bnut- zmQw09@!tCoZfCs_$y_`*ZLv4>RjlmQ^E!JM*Sjfvr!1#^#na2{7 z*};ne4xUAxwPl@Hho-ym^}DzhZ|{*-%M^P?u&1F z5cjs|y`{Sh_FXcqvvXs|%dn@|Ll~i`U+!vsyQ?sjX);g%S)t4u%&9dX(-`!Z-LlUc zsZ1G|w-`xBrl_9w5<84c@GU_|KQYd;6GFR>FhCVf6vPpsUBu+!x^4${kx{>=gwOC> zIysRmhMm)=FO6ku4Z>t4L(SgfM7+5Z3o#n`2vENm8mrh-Aq%8_tahZUqZC$R#&v)7YIbDO zGGe#`*}_D^$vB(XR>?%#J_h8*ybED2R4CY>`8moZXBEe0!&D? zYp%Q!!}r`|W~GV)GrGIAmg$#;&!Gx#7~~GdjV5&QC!3Vp4s0w0`Ya?mBs~g=H02}H z&~sN`v?{sd83mqPa${Vd=My!5na({rLkXN+amVI78WwE6V-3tUI#C!1)}m#}22N=wH|Cd?U~-v>Q!3Ro7icRCk5h zAZ1|*C)YQ7>dju9H#pg$BG;zvU*ugjM>a(m(Cj@?3((-QOv1 zo>)#8j+ve#lvoTPU1r*wN&mz3WBC0rJb}k|E8@)3Gg^0IfiL(cqblR(H?%9OoRdep+{b_Vvv)HIh@m+`ZmZ$5h66}*!c^fmGgPpAS*!1wL7_3=DT(aobp@; zm4IODLbG?+nTu&l{t_1>t&JQo#L3~ftlYa*8>(DE|B=uY%a0%H!worLZjD0|mA|HJ zYf`Gj-&1DNePL?7yQgO^*MTQoTuPb5r#AB&)V5b{;*op2#7H|Eoxe>7FkYd&(OQ3p#WA>!mhM41d+oaps zE#7zXO}o1Rp8LGxgZqV6uKUZZJLfKwjFN||cu5+I?4f6k(cd8Ee?|!yh*u`0kr4oU z33zz8@UJ1uh{ekR#(pr;|2^~-7_rJekY*zPpYLFsPW|@>fU3xs*rtOoBsz%#fDdx= zuK{Q){_g~6P4$4OB`SHqX#Tr5=(FCV{}2KmME!p>J**~z!Z7S+g01TQyE70o z`Jr*af971wK+Ne1{86av{~f>s;>&CM-wF0V2lCH>{39X%{AK>RL;m-M|L0QuN6Y-9 ucK@+M{xQt{Z6*F=sXkch|3B0HMtalMxuxmb4HDzw^G04-u2jY}@P7c2HaAZI literal 0 HcmV?d00001 diff --git a/examples/LayoutSpecExamples-Swift/Sample/LayoutExampleNode.swift b/examples/LayoutSpecExamples-Swift/Sample/LayoutExampleNode.swift index 75531d9026..8be3356839 100644 --- a/examples/LayoutSpecExamples-Swift/Sample/LayoutExampleNode.swift +++ b/examples/LayoutSpecExamples-Swift/Sample/LayoutExampleNode.swift @@ -143,3 +143,140 @@ class FlexibleSeparatorSurroundingContent : LayoutExampleNode { return "try rotating me!" } } + +class CornerLayoutSample : PhotoWithOutsetIconOverlay { + let photoNode1 = ASImageNode() + let photoNode2 = ASImageNode() + let dotNode = ASImageNode() + let badgeTextNode = ASTextNode() + let badgeImageNode = ASImageNode() + + struct ImageSize { + static let avatar = CGSize(width: 100, height: 100) + static let icon = CGSize(width: 26, height: 26) + } + + struct ImageColor { + static let avatar = UIColor.lightGray + static let icon = UIColor.red + } + + required init() { + super.init() + + let avatarImage = UIImage.draw(size: ImageSize.avatar, fillColor: ImageColor.avatar) { () -> UIBezierPath in + return UIBezierPath(roundedRect: CGRect(origin: CGPoint.zero, size: ImageSize.avatar), cornerRadius: ImageSize.avatar.width / 20) + } + + let iconImage = UIImage.draw(size: ImageSize.icon, fillColor: ImageColor.icon) { () -> UIBezierPath in + return UIBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: ImageSize.icon)) + } + + photoNode1.image = avatarImage + photoNode2.image = avatarImage + dotNode.image = iconImage + + badgeTextNode.attributedText = NSAttributedString.attributedString(string: " 999+ ", fontSize: 20, color: .white) + + badgeImageNode.image = UIImage.as_resizableRoundedImage(withCornerRadius: 12, cornerColor: .clear, fill: .red) + } + + override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec { + photoNode.style.preferredSize = ImageSize.avatar + iconNode.style.preferredSize = ImageSize.icon + + let badgeSpec = ASBackgroundLayoutSpec(child: badgeTextNode, background: badgeImageNode) + let cornerSpec1 = ASCornerLayoutSpec(child: photoNode1, corner: dotNode, location: .topRight) + let cornerSpec2 = ASCornerLayoutSpec(child: photoNode2, corner: badgeSpec, location: .topRight) + let cornerSpec3 = ASCornerLayoutSpec(child: photoNode, corner: iconNode, location: .topRight) + + cornerSpec1.offset = CGPoint(x: -3, y: 3) + + let stackSpec = ASStackLayoutSpec.vertical() + stackSpec.spacing = 40 + stackSpec.children = [cornerSpec1, cornerSpec2, cornerSpec3] + + return stackSpec + } + + override class func title() -> String { + return "Declarative way for Corner image Layout" + } + + override class func descriptionTitle() -> String? { + return nil + } +} + +class UserProfileSample : LayoutExampleNode { + + let badgeNode = ASImageNode() + let avatarNode = ASImageNode() + let usernameNode = ASTextNode() + let subtitleNode = ASTextNode() + + struct ImageSize { + static let avatar = CGSize(width: 44, height: 44) + static let badge = CGSize(width: 15, height: 15) + } + + struct ImageColor { + static let avatar = UIColor.lightGray + static let badge = UIColor.red + } + + required init() { + super.init() + + avatarNode.image = UIImage.draw(size: ImageSize.avatar, fillColor: ImageColor.avatar) { () -> UIBezierPath in + return UIBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: ImageSize.avatar)) + } + + badgeNode.image = UIImage.draw(size: ImageSize.badge, fillColor: ImageColor.badge) { () -> UIBezierPath in + return UIBezierPath(ovalIn: CGRect(origin: CGPoint.zero, size: ImageSize.badge)) + } + + makeSingleLine(for: usernameNode, with: "Hello world", fontSize: 17, textColor: .black) + makeSingleLine(for: subtitleNode, with: "This is a long long subtitle, with a long long appended string.", fontSize: 14, textColor: .lightGray) + } + + private func makeSingleLine(for node: ASTextNode, with text: String, fontSize: CGFloat, textColor: UIColor) { + node.attributedText = NSAttributedString.attributedString(string: text, fontSize: fontSize, color: textColor) + node.maximumNumberOfLines = 1 + } + + override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec { + let avatarBox = ASCornerLayoutSpec(child: avatarNode, corner: badgeNode, location: .bottomRight) + avatarBox.offset = CGPoint(x: -6, y: -6) + + let textBox = ASStackLayoutSpec.vertical() + textBox.justifyContent = .spaceAround + textBox.children = [usernameNode, subtitleNode] + + let profileBox = ASStackLayoutSpec.horizontal() + profileBox.spacing = 10 + profileBox.children = [avatarBox, textBox] + + // Apply text truncation + let elems: [ASLayoutElement] = [usernameNode, subtitleNode, textBox, profileBox] + for elem in elems { + elem.style.flexShrink = 1 + } + + let insetBox = ASInsetLayoutSpec( + insets: UIEdgeInsets(top: 120, left: 20, bottom: CGFloat.infinity, right: 20), + child: profileBox + ) + + return insetBox + } + + override class func title() -> String { + return "Common user profile layout." + } + + override class func descriptionTitle() -> String? { + return "For corner image layout and text truncation." + } + +} diff --git a/examples/LayoutSpecExamples-Swift/Sample/OverviewViewController.swift b/examples/LayoutSpecExamples-Swift/Sample/OverviewViewController.swift index 6e5240c7d2..e4b6f5d5a4 100644 --- a/examples/LayoutSpecExamples-Swift/Sample/OverviewViewController.swift +++ b/examples/LayoutSpecExamples-Swift/Sample/OverviewViewController.swift @@ -26,7 +26,9 @@ class OverviewViewController: ASViewController { HeaderWithRightAndLeftItems.self, PhotoWithInsetTextOverlay.self, PhotoWithOutsetIconOverlay.self, - FlexibleSeparatorSurroundingContent.self + FlexibleSeparatorSurroundingContent.self, + CornerLayoutSample.self, + UserProfileSample.self ] super.init(node: tableNode) diff --git a/examples/LayoutSpecExamples-Swift/Sample/Utilities.swift b/examples/LayoutSpecExamples-Swift/Sample/Utilities.swift index 683130618b..1f1bad89ce 100644 --- a/examples/LayoutSpecExamples-Swift/Sample/Utilities.swift +++ b/examples/LayoutSpecExamples-Swift/Sample/Utilities.swift @@ -74,7 +74,21 @@ extension UIImage { return roundedImage ?? self } - + + class func draw(size: CGSize, fillColor: UIColor, shapeClosure: () -> UIBezierPath) -> UIImage { + UIGraphicsBeginImageContext(size) + + let path = shapeClosure() + path.addClip() + + fillColor.setFill() + path.fill() + + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return image! + } } extension NSAttributedString { diff --git a/examples/LayoutSpecExamples/Sample.xcodeproj/project.pbxproj b/examples/LayoutSpecExamples/Sample.xcodeproj/project.pbxproj index 8027131811..3c9041a2b3 100644 --- a/examples/LayoutSpecExamples/Sample.xcodeproj/project.pbxproj +++ b/examples/LayoutSpecExamples/Sample.xcodeproj/project.pbxproj @@ -220,13 +220,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Sample-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ diff --git a/examples/LayoutSpecExamples/Sample.xcworkspace/contents.xcworkspacedata b/examples/LayoutSpecExamples/Sample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..7b5a2f3050 --- /dev/null +++ b/examples/LayoutSpecExamples/Sample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.h b/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.h index 7355285d3c..65241146ba 100644 --- a/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.h +++ b/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.h @@ -33,3 +33,9 @@ @interface FlexibleSeparatorSurroundingContent : LayoutExampleNode @end + +@interface CornerLayoutExample : PhotoWithOutsetIconOverlay +@end + +@interface UserProfileSample : LayoutExampleNode +@end diff --git a/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.m b/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.m index e7f9fbe6f0..9b84cb16e4 100644 --- a/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.m +++ b/examples/LayoutSpecExamples/Sample/LayoutExampleNodes.m @@ -260,6 +260,188 @@ @end +@interface CornerLayoutExample () +@property (nonatomic, strong) ASImageNode *dotNode; +@property (nonatomic, strong) ASImageNode *photoNode1; +@property (nonatomic, strong) ASTextNode *badgeTextNode; +@property (nonatomic, strong) ASImageNode *badgeImageNode; +@property (nonatomic, strong) ASImageNode *photoNode2; +@end + +@implementation CornerLayoutExample + +static CGFloat const kSampleAvatarSize = 100; +static CGFloat const kSampleIconSize = 26; +static CGFloat const kSampleBadgeCornerRadius = 12; + ++ (NSString *)title +{ + return @"Declarative way for Corner image Layout"; +} + ++ (NSString *)descriptionTitle +{ + return nil; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + UIImage *avatarImage = [self avatarImageWithSize:CGSizeMake(kSampleAvatarSize, kSampleAvatarSize)]; + UIImage *cornerImage = [self cornerImageWithSize:CGSizeMake(kSampleIconSize, kSampleIconSize)]; + + NSAttributedString *numberText = [NSAttributedString attributedStringWithString:@" 999+ " fontSize:20 color:UIColor.whiteColor]; + + _dotNode = [ASImageNode new]; + _dotNode.image = cornerImage; + + _photoNode1 = [ASImageNode new]; + _photoNode1.image = avatarImage; + + _badgeTextNode = [ASTextNode new]; + _badgeTextNode.attributedText = numberText; + + _badgeImageNode = [ASImageNode new]; + _badgeImageNode.image = [UIImage as_resizableRoundedImageWithCornerRadius:kSampleBadgeCornerRadius + cornerColor:UIColor.clearColor + fillColor:UIColor.redColor]; + + _photoNode2 = [ASImageNode new]; + _photoNode2.image = avatarImage; + } + return self; +} + +- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize +{ + + ASBackgroundLayoutSpec *badgeSpec = [ASBackgroundLayoutSpec backgroundLayoutSpecWithChild:_badgeTextNode + background:_badgeImageNode]; + + ASCornerLayoutSpec *cornerSpec1 = [ASCornerLayoutSpec cornerLayoutSpecWithChild:_photoNode1 corner:_dotNode location:ASCornerLayoutLocationTopRight]; + cornerSpec1.offset = CGPointMake(-3, 3); + + ASCornerLayoutSpec *cornerSpec2 = [ASCornerLayoutSpec cornerLayoutSpecWithChild:_photoNode2 corner:badgeSpec location:ASCornerLayoutLocationTopRight]; + + self.photoNode.style.preferredSize = CGSizeMake(kSampleAvatarSize, kSampleAvatarSize); + self.iconNode.style.preferredSize = CGSizeMake(kSampleIconSize, kSampleIconSize); + + ASCornerLayoutSpec *cornerSpec3 = [ASCornerLayoutSpec cornerLayoutSpecWithChild:self.photoNode corner:self.iconNode location:ASCornerLayoutLocationTopRight]; + + ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec verticalStackLayoutSpec]; + stackSpec.spacing = 40; + stackSpec.children = @[cornerSpec1, cornerSpec2, cornerSpec3]; + + return stackSpec; +} + +- (UIImage *)avatarImageWithSize:(CGSize)size +{ + return [UIImage imageWithSize:size fillColor:UIColor.lightGrayColor shapeBlock:^UIBezierPath *{ + CGRect rect = (CGRect){ CGPointZero, size }; + return [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:MIN(size.width, size.height) / 20]; + }]; +} + +- (UIImage *)cornerImageWithSize:(CGSize)size +{ + return [UIImage imageWithSize:size fillColor:UIColor.redColor shapeBlock:^UIBezierPath *{ + return [UIBezierPath bezierPathWithOvalInRect:(CGRect){ CGPointZero, size }]; + }]; +} + +@end + + +@interface UserProfileSample () +@property (nonatomic, strong) ASImageNode *badgeNode; +@property (nonatomic, strong) ASImageNode *avatarNode; +@property (nonatomic, strong) ASTextNode *usernameNode; +@property (nonatomic, strong) ASTextNode *subtitleNode; +@property (nonatomic, assign) CGFloat photoSizeValue; +@property (nonatomic, assign) CGFloat iconSizeValue; +@end + +@implementation UserProfileSample + ++ (NSString *)title +{ + return @"Common user profile layout."; +} + ++ (NSString *)descriptionTitle +{ + return @"For corner image layout and text truncation."; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + _photoSizeValue = 44; + _iconSizeValue = 15; + + CGSize iconSize = CGSizeMake(_iconSizeValue, _iconSizeValue); + CGSize photoSize = CGSizeMake(_photoSizeValue, _photoSizeValue); + + _badgeNode = [ASImageNode new]; + _badgeNode.style.preferredSize = iconSize; + _badgeNode.image = [UIImage imageWithSize:iconSize fillColor:UIColor.redColor shapeBlock:^UIBezierPath *{ + return [UIBezierPath bezierPathWithOvalInRect:(CGRect){ CGPointZero, iconSize }]; + }]; + + _avatarNode = [ASImageNode new]; + _avatarNode.style.preferredSize = photoSize; + _avatarNode.image = [UIImage imageWithSize:photoSize fillColor:UIColor.lightGrayColor shapeBlock:^UIBezierPath *{ + return [UIBezierPath bezierPathWithOvalInRect:(CGRect){ CGPointZero, photoSize }]; + }]; + + _usernameNode = [ASTextNode new]; + _usernameNode.attributedText = [NSAttributedString attributedStringWithString:@"Hello World" fontSize:17 color:UIColor.blackColor]; + _usernameNode.maximumNumberOfLines = 1; + + _subtitleNode = [ASTextNode new]; + _subtitleNode.attributedText = [NSAttributedString attributedStringWithString:@"This is a long long subtitle, with a long long appended string." fontSize:14 color:UIColor.lightGrayColor]; + _subtitleNode.maximumNumberOfLines = 1; + } + return self; +} + +- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize +{ + // Apply avatar with badge + // Normally, avatar's box size is the only photo size and it will not include the badge size. + // Otherwise, use includeCornerForSizeCalculation property to increase the box's size if needed. + ASCornerLayoutSpec *avatarBox = [ASCornerLayoutSpec new]; + avatarBox.child = _avatarNode; + avatarBox.corner = _badgeNode; + avatarBox.cornerLocation = ASCornerLayoutLocationBottomRight; + avatarBox.offset = CGPointMake(-6, -6); + + ASStackLayoutSpec *textBox = [ASStackLayoutSpec verticalStackLayoutSpec]; + textBox.justifyContent = ASStackLayoutJustifyContentSpaceAround; + textBox.children = @[_usernameNode, _subtitleNode]; + + ASStackLayoutSpec *profileBox = [ASStackLayoutSpec horizontalStackLayoutSpec]; + profileBox.spacing = 10; + profileBox.children = @[avatarBox, textBox]; + + // Apply text truncation. + NSArray *elems = @[_usernameNode, _subtitleNode, textBox, profileBox]; + for (id elem in elems) { + elem.style.flexShrink = 1; + } + + ASInsetLayoutSpec *profileInsetBox = [ASInsetLayoutSpec new]; + profileInsetBox.insets = UIEdgeInsetsMake(120, 20, INFINITY, 20); + profileInsetBox.child = profileBox; + + return profileInsetBox; +} + +@end + @implementation LayoutExampleNode + (NSString *)title diff --git a/examples/LayoutSpecExamples/Sample/OverviewViewController.m b/examples/LayoutSpecExamples/Sample/OverviewViewController.m index e3f44dfb06..c3cd7f9b6b 100644 --- a/examples/LayoutSpecExamples/Sample/OverviewViewController.m +++ b/examples/LayoutSpecExamples/Sample/OverviewViewController.m @@ -1,11 +1,18 @@ // // OverviewViewController.m -// Sample +// Texture // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. +// LICENSE file in the /ASDK-Licenses directory of this source tree. An additional +// grant of patent rights can be found in the PATENTS file in the same directory. +// +// Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present, +// Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 // #import "OverviewViewController.h" @@ -37,7 +44,10 @@ _layoutExamples = @[[HeaderWithRightAndLeftItems class], [PhotoWithInsetTextOverlay class], [PhotoWithOutsetIconOverlay class], - [FlexibleSeparatorSurroundingContent class]]; + [FlexibleSeparatorSurroundingContent class], + [CornerLayoutExample class], + [UserProfileSample class] + ]; } return self; diff --git a/examples/LayoutSpecExamples/Sample/Utilities.h b/examples/LayoutSpecExamples/Sample/Utilities.h index 0fcb0ece91..b4bf2f824a 100644 --- a/examples/LayoutSpecExamples/Sample/Utilities.h +++ b/examples/LayoutSpecExamples/Sample/Utilities.h @@ -1,11 +1,18 @@ // // Utilities.h -// Sample +// Texture // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. +// LICENSE file in the /ASDK-Licenses directory of this source tree. An additional +// grant of patent rights can be found in the PATENTS file in the same directory. +// +// Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present, +// Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 // #import @@ -18,6 +25,7 @@ @interface UIImage (Additions) - (UIImage *)makeCircularImageWithSize:(CGSize)size withBorderWidth:(CGFloat)width; ++ (UIImage *)imageWithSize:(CGSize)size fillColor:(UIColor *)fillColor shapeBlock:(UIBezierPath *(^)(void))shapeBlock; @end @interface NSAttributedString (Additions) diff --git a/examples/LayoutSpecExamples/Sample/Utilities.m b/examples/LayoutSpecExamples/Sample/Utilities.m index 74b4ae87a6..92e5c4bda7 100644 --- a/examples/LayoutSpecExamples/Sample/Utilities.m +++ b/examples/LayoutSpecExamples/Sample/Utilities.m @@ -1,11 +1,18 @@ // // Utilities.m -// Sample +// Texture // // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. +// LICENSE file in the /ASDK-Licenses directory of this source tree. An additional +// grant of patent rights can be found in the PATENTS file in the same directory. +// +// Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present, +// Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 // #import "Utilities.h" @@ -64,6 +71,21 @@ return roundedImage; } ++ (UIImage *)imageWithSize:(CGSize)size fillColor:(UIColor *)fillColor shapeBlock:(UIBezierPath *(^)(void))shapeBlock +{ + UIGraphicsBeginImageContext(size); + [fillColor setFill]; + + UIBezierPath *path = shapeBlock(); + [path addClip]; + [path fill]; + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} + @end @implementation NSAttributedString (Additions) diff --git a/examples/README.md b/examples/README.md index e56667c0ce..76c71a75d0 100644 --- a/examples/README.md +++ b/examples/README.md @@ -203,6 +203,20 @@ Featuring: - ASTableView - ASCellNode +### LayoutSpecExamples [ObjC] + +![Layout Spec Example App Screenshot](https://github.com/AsyncDisplayKit/Documentation/raw/master/docs/static/images/example-app-screenshots/ASCornerLayoutSpec.png) + +Featuring: +- ASStackLayoutSpec +- ASInsetLayoutSpec +- ASOverlayLayoutSpec +- ASAbsoluteLayoutSpec +- ASBackgroundLayoutSpec +- ASCornerLayoutSpec + +There is an associated swift version app: LayoutSpecExamples-Swift with same logic implementation. + ## License This file provided by Facebook is for non-commercial testing and evaluation @@ -214,3 +228,5 @@ Featuring: FACEBOOK 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. + +