From e170dde4190d73d1131b4c5e1f64b2cd6a4c3ea3 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 17:21:27 +0100 Subject: [PATCH 1/7] setup framework target in Xcode to support Carthage --- .../YogaKit.xcodeproj}/project.pbxproj | 201 ++++++++++++++++-- .../contents.xcworkspacedata | 2 +- .../UserInterfaceState.xcuserstate | Bin 0 -> 17371 bytes .../UserInterfaceState.xcuserstate | Bin .../xcshareddata/xcschemes/YogaKit.xcscheme | 80 +++++++ .../xcschemes/YogaKitSample.xcscheme | 91 ++++++++ .../xcschemes/xcschememanagement.plist | 32 +++ .../xcschemes/YogaKitSample.xcscheme | 0 .../xcschemes/xcschememanagement.plist | 0 YogaKit/YogaKit/YogaKit/Info.plist | 24 +++ YogaKit/YogaKit/YogaKit/YogaKit.h | 19 ++ .../YogaKitSample/AppDelegate.h | 0 .../YogaKitSample/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../YogaKitSample/Info.plist | 0 .../YogaKitSample/ViewController.h | 0 .../YogaKitSample/ViewController.m | 0 .../YogaKitSample/main.m | 0 18 files changed, 431 insertions(+), 18 deletions(-) rename YogaKit/{YogaKitSample/YogaKitSample.xcodeproj => YogaKit/YogaKit.xcodeproj}/project.pbxproj (65%) rename YogaKit/{YogaKitSample/YogaKitSample.xcodeproj => YogaKit/YogaKit.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (55%) create mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate rename YogaKit/{YogaKitSample/YogaKitSample.xcodeproj => YogaKit/YogaKit.xcodeproj}/project.xcworkspace/xcuserdata/emilsj.xcuserdatad/UserInterfaceState.xcuserstate (100%) create mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcshareddata/xcschemes/YogaKit.xcscheme create mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/YogaKitSample.xcscheme create mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist rename YogaKit/{YogaKitSample/YogaKitSample.xcodeproj => YogaKit/YogaKit.xcodeproj}/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme (100%) rename YogaKit/{YogaKitSample/YogaKitSample.xcodeproj => YogaKit/YogaKit.xcodeproj}/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist (100%) create mode 100644 YogaKit/YogaKit/YogaKit/Info.plist create mode 100644 YogaKit/YogaKit/YogaKit/YogaKit.h rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/AppDelegate.h (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/AppDelegate.m (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/Info.plist (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/ViewController.h (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/ViewController.m (100%) rename YogaKit/{YogaKitSample => YogaKit}/YogaKitSample/main.m (100%) diff --git a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.pbxproj b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj similarity index 65% rename from YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.pbxproj rename to YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj index 7232ec9f..f45f99ff 100644 --- a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.pbxproj +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj @@ -20,8 +20,29 @@ 13687D821DF87CF200E7C260 /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; 13687D851DF87D1E00E7C260 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D841DF87D1E00E7C260 /* UIKit.framework */; }; 13687D871DF87D2400E7C260 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D861DF87D2400E7C260 /* Foundation.framework */; }; + 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE08441E06ED3D00EE5F9A /* YogaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */; }; + 63EE08451E06ED3D00EE5F9A /* YogaKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D601DF8778F00E7C260 /* YGNodeList.c */; }; + 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; + 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */; }; + 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5E1DF8778F00E7C260 /* YGEnums.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D611DF8778F00E7C260 /* YGNodeList.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+Yoga.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 63EE08421E06ED3D00EE5F9A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 13687D3B1DF8748300E7C260 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63EE083C1E06ED3D00EE5F9A; + remoteInfo = YogaKit; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 13687D771DF878A000E7C260 /* yoga */ = { isa = PBXCopyFilesBuildPhase; @@ -47,6 +68,17 @@ name = YogaKit; runOnlyForDeploymentPostprocessing = 0; }; + 63EE08491E06ED3D00EE5F9A /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 63EE08451E06ED3D00EE5F9A /* YogaKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -64,10 +96,13 @@ 13687D611DF8778F00E7C260 /* YGNodeList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGNodeList.h; sourceTree = ""; }; 13687D621DF8778F00E7C260 /* Yoga.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = Yoga.c; sourceTree = ""; }; 13687D631DF8778F00E7C260 /* Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Yoga.h; sourceTree = ""; }; - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+Yoga.h"; sourceTree = ""; }; - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+Yoga.m"; sourceTree = ""; }; + 13687D691DF8778F00E7C260 /* UIView+Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+Yoga.h"; path = "../../UIView+Yoga.h"; sourceTree = ""; }; + 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+Yoga.m"; path = "../../UIView+Yoga.m"; sourceTree = ""; }; 13687D841DF87D1E00E7C260 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 13687D861DF87D2400E7C260 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YogaKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YogaKit.h; sourceTree = ""; }; + 63EE08401E06ED3D00EE5F9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +112,14 @@ files = ( 13687D871DF87D2400E7C260 /* Foundation.framework in Frameworks */, 13687D851DF87D1E00E7C260 /* UIKit.framework in Frameworks */, + 63EE08441E06ED3D00EE5F9A /* YogaKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63EE08391E06ED3D00EE5F9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( ); runOnlyForDeploymentPostprocessing = 0; }; @@ -86,9 +129,8 @@ 13687D3A1DF8748300E7C260 = { isa = PBXGroup; children = ( - 13687D5D1DF8778F00E7C260 /* yoga */, - 13687D641DF8778F00E7C260 /* YogaKit */, 13687D451DF8748400E7C260 /* YogaKitSample */, + 63EE083E1E06ED3D00EE5F9A /* YogaKit */, 13687D441DF8748400E7C260 /* Products */, 13687D831DF87D1E00E7C260 /* Frameworks */, ); @@ -98,6 +140,7 @@ isa = PBXGroup; children = ( 13687D431DF8748400E7C260 /* YogaKitSample.app */, + 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */, ); name = Products; sourceTree = ""; @@ -135,17 +178,7 @@ 13687D631DF8778F00E7C260 /* Yoga.h */, ); name = yoga; - path = ../../yoga; - sourceTree = ""; - }; - 13687D641DF8778F00E7C260 /* YogaKit */ = { - isa = PBXGroup; - children = ( - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */, - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */, - ); - name = YogaKit; - path = ..; + path = ../../../yoga; sourceTree = ""; }; 13687D831DF87D1E00E7C260 /* Frameworks */ = { @@ -157,8 +190,36 @@ name = Frameworks; sourceTree = ""; }; + 63EE083E1E06ED3D00EE5F9A /* YogaKit */ = { + isa = PBXGroup; + children = ( + 13687D5D1DF8778F00E7C260 /* yoga */, + 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */, + 13687D691DF8778F00E7C260 /* UIView+Yoga.h */, + 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */, + 63EE08401E06ED3D00EE5F9A /* Info.plist */, + ); + path = YogaKit; + sourceTree = ""; + }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + 63EE083A1E06ED3D00EE5F9A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */, + 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */, + 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */, + 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */, + 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */, + 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ 13687D421DF8748300E7C260 /* YogaKitSample */ = { isa = PBXNativeTarget; @@ -169,16 +230,36 @@ 13687D3F1DF8748300E7C260 /* Sources */, 13687D401DF8748300E7C260 /* Frameworks */, 13687D411DF8748300E7C260 /* Resources */, + 63EE08491E06ED3D00EE5F9A /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 63EE08431E06ED3D00EE5F9A /* PBXTargetDependency */, ); name = YogaKitSample; productName = YogaKitSample; productReference = 13687D431DF8748400E7C260 /* YogaKitSample.app */; productType = "com.apple.product-type.application"; }; + 63EE083C1E06ED3D00EE5F9A /* YogaKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63EE08481E06ED3D00EE5F9A /* Build configuration list for PBXNativeTarget "YogaKit" */; + buildPhases = ( + 63EE08381E06ED3D00EE5F9A /* Sources */, + 63EE08391E06ED3D00EE5F9A /* Frameworks */, + 63EE083A1E06ED3D00EE5F9A /* Headers */, + 63EE083B1E06ED3D00EE5F9A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = YogaKit; + productName = YogaKit; + productReference = 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -192,9 +273,13 @@ CreatedOnToolsVersion = 8.1; ProvisioningStyle = Automatic; }; + 63EE083C1E06ED3D00EE5F9A = { + CreatedOnToolsVersion = 8.2; + ProvisioningStyle = Automatic; + }; }; }; - buildConfigurationList = 13687D3E1DF8748300E7C260 /* Build configuration list for PBXProject "YogaKitSample" */; + buildConfigurationList = 13687D3E1DF8748300E7C260 /* Build configuration list for PBXProject "YogaKit" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -207,6 +292,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( + 63EE083C1E06ED3D00EE5F9A /* YogaKit */, 13687D421DF8748300E7C260 /* YogaKitSample */, ); }; @@ -221,6 +307,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 63EE083B1E06ED3D00EE5F9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -237,8 +330,26 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 63EE08381E06ED3D00EE5F9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */, + 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */, + 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 63EE08431E06ED3D00EE5F9A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63EE083C1E06ED3D00EE5F9A /* YogaKit */; + targetProxy = 63EE08421E06ED3D00EE5F9A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 13687D581DF8748400E7C260 /* Debug */ = { isa = XCBuildConfiguration; @@ -350,10 +461,56 @@ }; name = Release; }; + 63EE08461E06ED3D00EE5F9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = YogaKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.YogaKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 63EE08471E06ED3D00EE5F9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = YogaKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.YogaKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 13687D3E1DF8748300E7C260 /* Build configuration list for PBXProject "YogaKitSample" */ = { + 13687D3E1DF8748300E7C260 /* Build configuration list for PBXProject "YogaKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 13687D581DF8748400E7C260 /* Debug */, @@ -369,6 +526,16 @@ 13687D5C1DF8748400E7C260 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63EE08481E06ED3D00EE5F9A /* Build configuration list for PBXNativeTarget "YogaKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63EE08461E06ED3D00EE5F9A /* Debug */, + 63EE08471E06ED3D00EE5F9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 55% rename from YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata index b8f12e0b..40735f9b 100644 --- a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:/Users/david/Projects/yoga/YogaKit/YogaKit/YogaKit.xcodeproj"> diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..0dc901d6216607cbef2d34b50cb95ba680df8b0c GIT binary patch literal 17371 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/YogaKitSample.xcscheme b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/YogaKitSample.xcscheme new file mode 100644 index 00000000..4e3a92d9 --- /dev/null +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/YogaKitSample.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..9ee20b37 --- /dev/null +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + YogaKit.xcscheme_^#shared#^_ + + orderHint + 1 + + YogaKitSample.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 13687D421DF8748300E7C260 + + primary + + + 63EE083C1E06ED3D00EE5F9A + + primary + + + + + diff --git a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme rename to YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme diff --git a/YogaKit/YogaKitSample/YogaKitSample.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist rename to YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/YogaKit/YogaKit/YogaKit/Info.plist b/YogaKit/YogaKit/YogaKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/YogaKit/YogaKit/YogaKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/YogaKit/YogaKit/YogaKit/YogaKit.h b/YogaKit/YogaKit/YogaKit/YogaKit.h new file mode 100644 index 00000000..37dff23a --- /dev/null +++ b/YogaKit/YogaKit/YogaKit/YogaKit.h @@ -0,0 +1,19 @@ +// +// YogaKit.h +// YogaKit +// +// Created by David Hart on 18.12.16. +// Copyright © 2016 facebook. All rights reserved. +// + +#import + +//! Project version number for YogaKit. +FOUNDATION_EXPORT double YogaKitVersionNumber; + +//! Project version string for YogaKit. +FOUNDATION_EXPORT const unsigned char YogaKitVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/YogaKit/YogaKitSample/YogaKitSample/AppDelegate.h b/YogaKit/YogaKit/YogaKitSample/AppDelegate.h similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/AppDelegate.h rename to YogaKit/YogaKit/YogaKitSample/AppDelegate.h diff --git a/YogaKit/YogaKitSample/YogaKitSample/AppDelegate.m b/YogaKit/YogaKit/YogaKitSample/AppDelegate.m similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/AppDelegate.m rename to YogaKit/YogaKit/YogaKitSample/AppDelegate.m diff --git a/YogaKit/YogaKitSample/YogaKitSample/Assets.xcassets/AppIcon.appiconset/Contents.json b/YogaKit/YogaKit/YogaKitSample/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/Assets.xcassets/AppIcon.appiconset/Contents.json rename to YogaKit/YogaKit/YogaKitSample/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/YogaKit/YogaKitSample/YogaKitSample/Info.plist b/YogaKit/YogaKit/YogaKitSample/Info.plist similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/Info.plist rename to YogaKit/YogaKit/YogaKitSample/Info.plist diff --git a/YogaKit/YogaKitSample/YogaKitSample/ViewController.h b/YogaKit/YogaKit/YogaKitSample/ViewController.h similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/ViewController.h rename to YogaKit/YogaKit/YogaKitSample/ViewController.h diff --git a/YogaKit/YogaKitSample/YogaKitSample/ViewController.m b/YogaKit/YogaKit/YogaKitSample/ViewController.m similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/ViewController.m rename to YogaKit/YogaKit/YogaKitSample/ViewController.m diff --git a/YogaKit/YogaKitSample/YogaKitSample/main.m b/YogaKit/YogaKit/YogaKitSample/main.m similarity index 100% rename from YogaKit/YogaKitSample/YogaKitSample/main.m rename to YogaKit/YogaKit/YogaKitSample/main.m -- 2.50.1.windows.1 From 45b7ec95dcdb3783cdc0c6b91a3994c842e7b710 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 21:05:43 +0100 Subject: [PATCH 2/7] first step in replacing the prefix in objc from YG to YK to allow redefining enums without the Count item --- YogaKit/UIView+Yoga.h | 72 --------- YogaKit/UIView+YogaKit.h | 72 +++++++++ YogaKit/{UIView+Yoga.m => UIView+YogaKit.m} | 144 +++++++++--------- YogaKit/YKEnums.h | 96 ++++++++++++ .../YogaKit/YogaKit.xcodeproj/project.pbxproj | 70 +++------ .../UserInterfaceState.xcuserstate | Bin 17371 -> 24126 bytes YogaKit/YogaKit/YogaKit/YogaKit.h | 4 +- .../YogaKit/YogaKitSample/ViewController.m | 21 ++- enums.py | 25 ++- 9 files changed, 293 insertions(+), 211 deletions(-) delete mode 100644 YogaKit/UIView+Yoga.h create mode 100644 YogaKit/UIView+YogaKit.h rename YogaKit/{UIView+Yoga.m => UIView+YogaKit.m} (62%) create mode 100644 YogaKit/YKEnums.h diff --git a/YogaKit/UIView+Yoga.h b/YogaKit/UIView+Yoga.h deleted file mode 100644 index 386416b2..00000000 --- a/YogaKit/UIView+Yoga.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * 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. - */ - -#import -#import - -@interface UIView (Yoga) - -/** - The property that decides if we should include this view when calculating layout. Defaults to YES. - */ -@property (nonatomic, readwrite, assign, setter=yg_setIncludeInLayout:) BOOL yg_includeInLayout; - -/** - The property that decides during layout/sizing whether or not yg_* properties should be applied. Defaults to NO. - */ -@property (nonatomic, readwrite, assign, setter=yg_setUsesYoga:) BOOL yg_usesYoga; - -- (void)yg_setDirection:(YGDirection)direction; -- (void)yg_setFlexDirection:(YGFlexDirection)flexDirection; -- (void)yg_setJustifyContent:(YGJustify)justifyContent; -- (void)yg_setAlignContent:(YGAlign)alignContent; -- (void)yg_setAlignItems:(YGAlign)alignItems; -- (void)yg_setAlignSelf:(YGAlign)alignSelf; -- (void)yg_setPositionType:(YGPositionType)positionType; -- (void)yg_setFlexWrap:(YGWrap)flexWrap; - -- (void)yg_setFlexGrow:(CGFloat)flexGrow; -- (void)yg_setFlexShrink:(CGFloat)flexShrink; -- (void)yg_setFlexBasis:(CGFloat)flexBasis; - -- (void)yg_setPosition:(CGFloat)position forEdge:(YGEdge)edge; -- (void)yg_setMargin:(CGFloat)margin forEdge:(YGEdge)edge; -- (void)yg_setPadding:(CGFloat)padding forEdge:(YGEdge)edge; - -- (void)yg_setWidth:(CGFloat)width; -- (void)yg_setHeight:(CGFloat)height; -- (void)yg_setMinWidth:(CGFloat)minWidth; -- (void)yg_setMinHeight:(CGFloat)minHeight; -- (void)yg_setMaxWidth:(CGFloat)maxWidth; -- (void)yg_setMaxHeight:(CGFloat)maxHeight; - -// Yoga specific properties, not compatible with flexbox specification -- (void)yg_setAspectRatio:(CGFloat)aspectRatio; - -/** - Get the resolved direction of this node. This won't be YGDirectionInherit - */ -- (YGDirection)yg_resolvedDirection; - -/** - Perform a layout calculation and update the frames of the views in the hierarchy with the results - */ -- (void)yg_applyLayout; - -/** - Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; - */ -- (CGSize)yg_intrinsicSize; - -/** - Returns the number of children that are using Flexbox. - */ -- (NSUInteger)yg_numberOfChildren; - -@end diff --git a/YogaKit/UIView+YogaKit.h b/YogaKit/UIView+YogaKit.h new file mode 100644 index 00000000..08fc4bd0 --- /dev/null +++ b/YogaKit/UIView+YogaKit.h @@ -0,0 +1,72 @@ +/** + * 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. + */ + +#import +#import "YKEnums.h" + +@interface UIView (YogaKit) + +/** + The property that decides if we should include this view when calculating layout. Defaults to YES. + */ +@property (nonatomic, readwrite, assign, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout; + +/** + The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. + */ +@property (nonatomic, readwrite, assign, setter=yk_setUsesYoga:) BOOL yk_usesYoga; + +- (void)yk_setDirection:(YKDirection)direction; +- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection; +- (void)yk_setJustifyContent:(YKJustify)justifyContent; +- (void)yk_setAlignContent:(YKAlign)alignContent; +- (void)yk_setAlignItems:(YKAlign)alignItems; +- (void)yk_setAlignSelf:(YKAlign)alignSelf; +- (void)yk_setPositionType:(YKPositionType)positionType; +- (void)yk_setFlexWrap:(YKWrap)flexWrap; + +- (void)yk_setFlexGrow:(CGFloat)flexGrow; +- (void)yk_setFlexShrink:(CGFloat)flexShrink; +- (void)yk_setFlexBasis:(CGFloat)flexBasis; + +- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge; +- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge; +- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge; + +- (void)yk_setWidth:(CGFloat)width; +- (void)yk_setHeight:(CGFloat)height; +- (void)yk_setMinWidth:(CGFloat)minWidth; +- (void)yk_setMinHeight:(CGFloat)minHeight; +- (void)yk_setMaxWidth:(CGFloat)maxWidth; +- (void)yk_setMaxHeight:(CGFloat)maxHeight; + +// Yoga specific properties, not compatible with flexbox specification +- (void)yk_setAspectRatio:(CGFloat)aspectRatio; + +/** + Get the resolved direction of this node. This won't be YGDirectionInherit + */ +- (YKDirection)yk_resolvedDirection; + +/** + Perform a layout calculation and update the frames of the views in the hierarchy with the results + */ +- (void)yk_applyLayout; + +/** + Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; + */ +- (CGSize)yk_intrinsicSize; + +/** + Returns the number of children that are using Flexbox. + */ +- (NSUInteger)yk_numberOfChildren; + +@end diff --git a/YogaKit/UIView+Yoga.m b/YogaKit/UIView+YogaKit.m similarity index 62% rename from YogaKit/UIView+Yoga.m rename to YogaKit/UIView+YogaKit.m index 241ad33e..46239f8f 100644 --- a/YogaKit/UIView+Yoga.m +++ b/YogaKit/UIView+YogaKit.m @@ -7,8 +7,8 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "UIView+Yoga.h" - +#import +#import #import @interface YGNodeBridge : NSObject @@ -37,164 +37,164 @@ } @end -@implementation UIView (Yoga) +@implementation UIView (YogaKit) -- (BOOL)yg_usesYoga +- (BOOL)yk_usesYoga { - NSNumber *usesYoga = objc_getAssociatedObject(self, @selector(yg_usesYoga)); + NSNumber *usesYoga = objc_getAssociatedObject(self, @selector(yk_usesYoga)); return [usesYoga boolValue]; } -- (BOOL)yg_includeInLayout +- (BOOL)yk_includeInLayout { - NSNumber *includeInLayout = objc_getAssociatedObject(self, @selector(yg_includeInLayout)); + NSNumber *includeInLayout = objc_getAssociatedObject(self, @selector(yk_includeInLayout)); return (includeInLayout != nil) ? [includeInLayout boolValue] : YES; } -- (NSUInteger)yg_numberOfChildren +- (NSUInteger)yk_numberOfChildren { return YGNodeGetChildCount([self ygNode]); } #pragma mark - Setters -- (void)yg_setIncludeInLayout:(BOOL)includeInLayout +- (void)yk_setIncludeInLayout:(BOOL)includeInLayout { objc_setAssociatedObject( self, - @selector(yg_includeInLayout), + @selector(yk_includeInLayout), @(includeInLayout), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -- (void)yg_setUsesYoga:(BOOL)enabled +- (void)yk_setUsesYoga:(BOOL)enabled { objc_setAssociatedObject( self, - @selector(yg_usesYoga), + @selector(yk_usesYoga), @(enabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -- (void)yg_setDirection:(YGDirection)direction +- (void)yk_setDirection:(YKDirection)direction { - YGNodeStyleSetDirection([self ygNode], direction); + YGNodeStyleSetDirection([self ygNode], (YGDirection)direction); } -- (void)yg_setFlexDirection:(YGFlexDirection)flexDirection +- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection { - YGNodeStyleSetFlexDirection([self ygNode], flexDirection); + YGNodeStyleSetFlexDirection([self ygNode], (YGFlexDirection)flexDirection); } -- (void)yg_setJustifyContent:(YGJustify)justifyContent +- (void)yk_setJustifyContent:(YKJustify)justifyContent { - YGNodeStyleSetJustifyContent([self ygNode], justifyContent); + YGNodeStyleSetJustifyContent([self ygNode], (YGJustify)justifyContent); } -- (void)yg_setAlignContent:(YGAlign)alignContent +- (void)yk_setAlignContent:(YKAlign)alignContent { - YGNodeStyleSetAlignContent([self ygNode], alignContent); + YGNodeStyleSetAlignContent([self ygNode], (YGAlign)alignContent); } -- (void)yg_setAlignItems:(YGAlign)alignItems +- (void)yk_setAlignItems:(YKAlign)alignItems { - YGNodeStyleSetAlignItems([self ygNode], alignItems); + YGNodeStyleSetAlignItems([self ygNode], (YGAlign)alignItems); } -- (void)yg_setAlignSelf:(YGAlign)alignSelf +- (void)yk_setAlignSelf:(YKAlign)alignSelf { - YGNodeStyleSetAlignSelf([self ygNode], alignSelf); + YGNodeStyleSetAlignSelf([self ygNode], (YGAlign)alignSelf); } -- (void)yg_setPositionType:(YGPositionType)positionType +- (void)yk_setPositionType:(YKPositionType)positionType { - YGNodeStyleSetPositionType([self ygNode], positionType); + YGNodeStyleSetPositionType([self ygNode], (YGPositionType)positionType); } -- (void)yg_setFlexWrap:(YGWrap)flexWrap +- (void)yk_setFlexWrap:(YKWrap)flexWrap { - YGNodeStyleSetFlexWrap([self ygNode], flexWrap); + YGNodeStyleSetFlexWrap([self ygNode], (YGWrap)flexWrap); } -- (void)yg_setFlexGrow:(CGFloat)flexGrow +- (void)yk_setFlexGrow:(CGFloat)flexGrow { YGNodeStyleSetFlexGrow([self ygNode], flexGrow); } -- (void)yg_setFlexShrink:(CGFloat)flexShrink +- (void)yk_setFlexShrink:(CGFloat)flexShrink { YGNodeStyleSetFlexShrink([self ygNode], flexShrink); } -- (void)yg_setFlexBasis:(CGFloat)flexBasis +- (void)yk_setFlexBasis:(CGFloat)flexBasis { YGNodeStyleSetFlexBasis([self ygNode], flexBasis); } -- (void)yg_setPosition:(CGFloat)position forEdge:(YGEdge)edge +- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge { - YGNodeStyleSetPosition([self ygNode], edge, position); + YGNodeStyleSetPosition([self ygNode], (YGEdge)edge, position); } -- (void)yg_setMargin:(CGFloat)margin forEdge:(YGEdge)edge +- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge { - YGNodeStyleSetMargin([self ygNode], edge, margin); + YGNodeStyleSetMargin([self ygNode], (YGEdge)edge, margin); } -- (void)yg_setPadding:(CGFloat)padding forEdge:(YGEdge)edge +- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge { - YGNodeStyleSetPadding([self ygNode], edge, padding); + YGNodeStyleSetPadding([self ygNode], (YGEdge)edge, padding); } -- (void)yg_setWidth:(CGFloat)width +- (void)yk_setWidth:(CGFloat)width { YGNodeStyleSetWidth([self ygNode], width); } -- (void)yg_setHeight:(CGFloat)height +- (void)yk_setHeight:(CGFloat)height { YGNodeStyleSetHeight([self ygNode], height); } -- (void)yg_setMinWidth:(CGFloat)minWidth +- (void)yk_setMinWidth:(CGFloat)minWidth { YGNodeStyleSetMinWidth([self ygNode], minWidth); } -- (void)yg_setMinHeight:(CGFloat)minHeight +- (void)yk_setMinHeight:(CGFloat)minHeight { YGNodeStyleSetMinHeight([self ygNode], minHeight); } -- (void)yg_setMaxWidth:(CGFloat)maxWidth +- (void)yk_setMaxWidth:(CGFloat)maxWidth { YGNodeStyleSetMaxWidth([self ygNode], maxWidth); } -- (void)yg_setMaxHeight:(CGFloat)maxHeight +- (void)yk_setMaxHeight:(CGFloat)maxHeight { YGNodeStyleSetMaxHeight([self ygNode], maxHeight); } -- (void)yg_setAspectRatio:(CGFloat)aspectRatio +- (void)yk_setAspectRatio:(CGFloat)aspectRatio { YGNodeStyleSetAspectRatio([self ygNode], aspectRatio); } #pragma mark - Layout and Sizing -- (YGDirection)yg_resolvedDirection +- (YKDirection)yk_resolvedDirection { - return YGNodeLayoutGetDirection([self ygNode]); + return (YKDirection)YGNodeLayoutGetDirection([self ygNode]); } -- (void)yg_applyLayout +- (void)yk_applyLayout { [self calculateLayoutWithSize:self.bounds.size]; - YGApplyLayoutToViewHierarchy(self); + YKApplyLayoutToViewHierarchy(self); } -- (CGSize)yg_intrinsicSize +- (CGSize)yk_intrinsicSize { const CGSize constrainedSize = { .width = YGUndefined, @@ -220,9 +220,9 @@ - (CGSize)calculateLayoutWithSize:(CGSize)size { NSAssert([NSThread isMainThread], @"YG Layout calculation must be done on main."); - NSAssert([self yg_usesYoga], @"YG Layout is not enabled for this view."); + NSAssert([self yk_usesYoga], @"YG Layout is not enabled for this view."); - YGAttachNodesFromViewHierachy(self); + YKAttachNodesFromViewHierachy(self); const YGNodeRef node = [self ygNode]; YGNodeCalculateLayout( @@ -237,7 +237,7 @@ }; } -static YGSize YGMeasureView( +static YGSize YKMeasureView( YGNodeRef node, float width, YGMeasureMode widthMode, @@ -254,12 +254,12 @@ static YGSize YGMeasureView( }]; return (YGSize) { - .width = YGSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), - .height = YGSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), + .width = YKSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), + .height = YKSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), }; } -static CGFloat YGSanitizeMeasurement( +static CGFloat YKSanitizeMeasurement( CGFloat constrainedSize, CGFloat measuredSize, YGMeasureMode measureMode) @@ -276,20 +276,20 @@ static CGFloat YGSanitizeMeasurement( return result; } -static void YGAttachNodesFromViewHierachy(UIView *view) { +static void YKAttachNodesFromViewHierachy(UIView *view) { YGNodeRef node = [view ygNode]; // Only leaf nodes should have a measure function - if (![view yg_usesYoga] || view.subviews.count == 0) { - YGNodeSetMeasureFunc(node, YGMeasureView); - YGRemoveAllChildren(node); + if (![view yk_usesYoga] || view.subviews.count == 0) { + YGNodeSetMeasureFunc(node, YKMeasureView); + YKRemoveAllChildren(node); } else { YGNodeSetMeasureFunc(node, NULL); // Create a list of all the subviews that we are going to use for layout. NSMutableArray *subviewsToInclude = [[NSMutableArray alloc] initWithCapacity:view.subviews.count]; for (UIView *subview in view.subviews) { - if ([subview yg_includeInLayout]) { + if ([subview yk_includeInLayout]) { [subviewsToInclude addObject:subview]; } } @@ -307,18 +307,18 @@ static void YGAttachNodesFromViewHierachy(UIView *view) { } if (shouldReconstructChildList) { - YGRemoveAllChildren(node); + YKRemoveAllChildren(node); for (int i = 0 ; i < subviewsToInclude.count; i++) { UIView *const subview = subviewsToInclude[i]; YGNodeInsertChild(node, [subview ygNode], i); - YGAttachNodesFromViewHierachy(subview); + YKAttachNodesFromViewHierachy(subview); } } } } -static void YGRemoveAllChildren(const YGNodeRef node) +static void YKRemoveAllChildren(const YGNodeRef node) { if (node == NULL) { return; @@ -329,7 +329,7 @@ static void YGRemoveAllChildren(const YGNodeRef node) } } -static CGFloat YGRoundPixelValue(CGFloat value) +static CGFloat YKRoundPixelValue(CGFloat value) { static CGFloat scale; static dispatch_once_t onceToken; @@ -340,9 +340,9 @@ static CGFloat YGRoundPixelValue(CGFloat value) return round(value * scale) / scale; } -static void YGApplyLayoutToViewHierarchy(UIView *view) { +static void YKApplyLayoutToViewHierarchy(UIView *view) { NSCAssert([NSThread isMainThread], @"Framesetting should only be done on the main thread."); - if (![view yg_includeInLayout]) { + if (![view yk_includeInLayout]) { return; } @@ -359,19 +359,19 @@ static void YGApplyLayoutToViewHierarchy(UIView *view) { view.frame = (CGRect) { .origin = { - .x = YGRoundPixelValue(topLeft.x), - .y = YGRoundPixelValue(topLeft.y), + .x = YKRoundPixelValue(topLeft.x), + .y = YKRoundPixelValue(topLeft.y), }, .size = { - .width = YGRoundPixelValue(bottomRight.x) - YGRoundPixelValue(topLeft.x), - .height = YGRoundPixelValue(bottomRight.y) - YGRoundPixelValue(topLeft.y), + .width = YKRoundPixelValue(bottomRight.x) - YKRoundPixelValue(topLeft.x), + .height = YKRoundPixelValue(bottomRight.y) - YKRoundPixelValue(topLeft.y), }, }; - const BOOL isLeaf = ![view yg_usesYoga] || view.subviews.count == 0; + const BOOL isLeaf = ![view yk_usesYoga] || view.subviews.count == 0; if (!isLeaf) { for (NSUInteger i = 0; i < view.subviews.count; i++) { - YGApplyLayoutToViewHierarchy(view.subviews[i]); + YKApplyLayoutToViewHierarchy(view.subviews[i]); } } } diff --git a/YogaKit/YKEnums.h b/YogaKit/YKEnums.h new file mode 100644 index 00000000..cc148d2b --- /dev/null +++ b/YogaKit/YKEnums.h @@ -0,0 +1,96 @@ +/** + * 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. + */ + +typedef NS_ENUM(NSInteger, YKFlexDirection) { + YKFlexDirectionColumn, + YKFlexDirectionColumnReverse, + YKFlexDirectionRow, + YKFlexDirectionRowReverse, +}; + +typedef NS_ENUM(NSInteger, YKMeasureMode) { + YKMeasureModeUndefined, + YKMeasureModeExactly, + YKMeasureModeAtMost, +}; + +typedef NS_ENUM(NSInteger, YKPrintOptions) { + YKPrintOptionsLayout = 1, + YKPrintOptionsStyle = 2, + YKPrintOptionsChildren = 4, +}; + +typedef NS_ENUM(NSInteger, YKEdge) { + YKEdgeLeft, + YKEdgeTop, + YKEdgeRight, + YKEdgeBottom, + YKEdgeStart, + YKEdgeEnd, + YKEdgeHorizontal, + YKEdgeVertical, + YKEdgeAll, +}; + +typedef NS_ENUM(NSInteger, YKPositionType) { + YKPositionTypeRelative, + YKPositionTypeAbsolute, +}; + +typedef NS_ENUM(NSInteger, YKDimension) { + YKDimensionWidth, + YKDimensionHeight, +}; + +typedef NS_ENUM(NSInteger, YKJustify) { + YKJustifyFlexStart, + YKJustifyCenter, + YKJustifyFlexEnd, + YKJustifySpaceBetween, + YKJustifySpaceAround, +}; + +typedef NS_ENUM(NSInteger, YKDirection) { + YKDirectionInherit, + YKDirectionLeftToRight, + YKDirectionRightToLeft, +}; + +typedef NS_ENUM(NSInteger, YKLogLevel) { + YKLogLevelError, + YKLogLevelWarn, + YKLogLevelInfo, + YKLogLevelDebug, + YKLogLevelVerbose, +}; + +typedef NS_ENUM(NSInteger, YKWrap) { + YKWrapNoWrap, + YKWrapWrap, +}; + +typedef NS_ENUM(NSInteger, YKOverflow) { + YKOverflowVisible, + YKOverflowHidden, + YKOverflowScroll, +}; + +typedef NS_ENUM(NSInteger, YKExperimentalFeature) { + YKExperimentalFeatureRounding, + YKExperimentalFeatureWebFlexBasis, +}; + +typedef NS_ENUM(NSInteger, YKAlign) { + YKAlignAuto, + YKAlignFlexStart, + YKAlignCenter, + YKAlignFlexEnd, + YKAlignStretch, +}; + diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj index f45f99ff..011a3824 100644 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj @@ -11,13 +11,6 @@ 13687D4B1DF8748400E7C260 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D4A1DF8748400E7C260 /* AppDelegate.m */; }; 13687D4E1DF8748400E7C260 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D4D1DF8748400E7C260 /* ViewController.m */; }; 13687D531DF8748400E7C260 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13687D521DF8748400E7C260 /* Assets.xcassets */; }; - 13687D781DF878C600E7C260 /* YGEnums.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D5E1DF8778F00E7C260 /* YGEnums.h */; }; - 13687D791DF878C600E7C260 /* YGMacros.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; }; - 13687D7A1DF878C600E7C260 /* Yoga.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; }; - 13687D7C1DF878DD00E7C260 /* UIView+Yoga.h in YogaKit */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+Yoga.h */; }; - 13687D801DF87CEC00E7C260 /* UIView+Yoga.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */; }; - 13687D811DF87CF200E7C260 /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D601DF8778F00E7C260 /* YGNodeList.c */; }; - 13687D821DF87CF200E7C260 /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; 13687D851DF87D1E00E7C260 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D841DF87D1E00E7C260 /* UIKit.framework */; }; 13687D871DF87D2400E7C260 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D861DF87D2400E7C260 /* Foundation.framework */; }; 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -25,12 +18,12 @@ 63EE08451E06ED3D00EE5F9A /* YogaKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D601DF8778F00E7C260 /* YGNodeList.c */; }; 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; - 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */; }; - 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5E1DF8778F00E7C260 /* YGEnums.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D611DF8778F00E7C260 /* YGNodeList.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+Yoga.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE084C1E06EEB700EE5F9A /* UIView+YogaKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */; }; + 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; }; + 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D611DF8778F00E7C260 /* YGNodeList.h */; }; + 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; }; + 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE08521E06F3D100EE5F9A /* YKEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,30 +37,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 13687D771DF878A000E7C260 /* yoga */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/yoga; - dstSubfolderSpec = 16; - files = ( - 13687D781DF878C600E7C260 /* YGEnums.h in yoga */, - 13687D791DF878C600E7C260 /* YGMacros.h in yoga */, - 13687D7A1DF878C600E7C260 /* Yoga.h in yoga */, - ); - name = yoga; - runOnlyForDeploymentPostprocessing = 0; - }; - 13687D7B1DF878CE00E7C260 /* YogaKit */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/YogaKit; - dstSubfolderSpec = 16; - files = ( - 13687D7C1DF878DD00E7C260 /* UIView+Yoga.h in YogaKit */, - ); - name = YogaKit; - runOnlyForDeploymentPostprocessing = 0; - }; 63EE08491E06ED3D00EE5F9A /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -90,19 +59,19 @@ 13687D4D1DF8748400E7C260 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 13687D521DF8748400E7C260 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 13687D571DF8748400E7C260 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 13687D5E1DF8778F00E7C260 /* YGEnums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGEnums.h; sourceTree = ""; }; 13687D5F1DF8778F00E7C260 /* YGMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGMacros.h; sourceTree = ""; }; 13687D601DF8778F00E7C260 /* YGNodeList.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = YGNodeList.c; sourceTree = ""; }; 13687D611DF8778F00E7C260 /* YGNodeList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGNodeList.h; sourceTree = ""; }; 13687D621DF8778F00E7C260 /* Yoga.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = Yoga.c; sourceTree = ""; }; 13687D631DF8778F00E7C260 /* Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Yoga.h; sourceTree = ""; }; - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+Yoga.h"; path = "../../UIView+Yoga.h"; sourceTree = ""; }; - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+Yoga.m"; path = "../../UIView+Yoga.m"; sourceTree = ""; }; + 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+YogaKit.h"; path = "../../UIView+YogaKit.h"; sourceTree = ""; }; + 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+YogaKit.m"; path = "../../UIView+YogaKit.m"; sourceTree = ""; }; 13687D841DF87D1E00E7C260 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 13687D861DF87D2400E7C260 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YogaKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YogaKit.h; sourceTree = ""; }; 63EE08401E06ED3D00EE5F9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63EE08521E06F3D100EE5F9A /* YKEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YKEnums.h; path = ../../YKEnums.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -170,7 +139,6 @@ 13687D5D1DF8778F00E7C260 /* yoga */ = { isa = PBXGroup; children = ( - 13687D5E1DF8778F00E7C260 /* YGEnums.h */, 13687D5F1DF8778F00E7C260 /* YGMacros.h */, 13687D601DF8778F00E7C260 /* YGNodeList.c */, 13687D611DF8778F00E7C260 /* YGNodeList.h */, @@ -195,8 +163,9 @@ children = ( 13687D5D1DF8778F00E7C260 /* yoga */, 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */, - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */, - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */, + 63EE08521E06F3D100EE5F9A /* YKEnums.h */, + 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */, + 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */, 63EE08401E06ED3D00EE5F9A /* Info.plist */, ); path = YogaKit; @@ -210,8 +179,8 @@ buildActionMask = 2147483647; files = ( 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */, - 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */, - 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */, + 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */, + 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */, 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */, 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */, 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */, @@ -225,8 +194,6 @@ isa = PBXNativeTarget; buildConfigurationList = 13687D5A1DF8748400E7C260 /* Build configuration list for PBXNativeTarget "YogaKitSample" */; buildPhases = ( - 13687D771DF878A000E7C260 /* yoga */, - 13687D7B1DF878CE00E7C260 /* YogaKit */, 13687D3F1DF8748300E7C260 /* Sources */, 13687D401DF8748300E7C260 /* Frameworks */, 13687D411DF8748300E7C260 /* Resources */, @@ -266,7 +233,7 @@ 13687D3B1DF8748300E7C260 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = facebook; TargetAttributes = { 13687D421DF8748300E7C260 = { @@ -321,11 +288,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 13687D801DF87CEC00E7C260 /* UIView+Yoga.m in Sources */, 13687D4E1DF8748400E7C260 /* ViewController.m in Sources */, 13687D4B1DF8748400E7C260 /* AppDelegate.m in Sources */, - 13687D821DF87CF200E7C260 /* Yoga.c in Sources */, - 13687D811DF87CF200E7C260 /* YGNodeList.c in Sources */, 13687D481DF8748400E7C260 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -336,7 +300,7 @@ files = ( 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */, 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */, - 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */, + 63EE084C1E06EEB700EE5F9A /* UIView+YogaKit.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -369,6 +333,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -416,6 +381,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index 0dc901d6216607cbef2d34b50cb95ba680df8b0c..33536713a50be1596623da79b922b35bc5b5f981 100644 GIT binary patch literal 24126 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 - - +#import diff --git a/YogaKit/YogaKit/YogaKitSample/ViewController.m b/YogaKit/YogaKit/YogaKitSample/ViewController.m index a13dae6f..40ab77b0 100644 --- a/YogaKit/YogaKit/YogaKitSample/ViewController.m +++ b/YogaKit/YogaKit/YogaKitSample/ViewController.m @@ -7,8 +7,7 @@ */ #import "ViewController.h" - -#import +#import @interface ViewController () @@ -20,17 +19,17 @@ { UIView *root = self.view; root.backgroundColor = [UIColor redColor]; - [root yg_setUsesYoga:YES]; - [root yg_setWidth:self.view.bounds.size.width]; - [root yg_setHeight:self.view.bounds.size.height]; - [root yg_setAlignItems:YGAlignCenter]; - [root yg_setJustifyContent:YGJustifyCenter]; + [root yk_setUsesYoga:YES]; + [root yk_setWidth:self.view.bounds.size.width]; + [root yk_setHeight:self.view.bounds.size.height]; + [root yk_setAlignItems:YKAlignCenter]; + [root yk_setJustifyContent:YKJustifyCenter]; UIView *child1 = [UIView new]; child1.backgroundColor = [UIColor blueColor]; - [child1 yg_setUsesYoga:YES]; - [child1 yg_setWidth:100]; - [child1 yg_setHeight:100]; + [child1 yk_setUsesYoga:YES]; + [child1 yk_setWidth:100]; + [child1 yk_setHeight:100]; UIView *child2 = [UIView new]; child2.backgroundColor = [UIColor greenColor]; @@ -53,7 +52,7 @@ [child2 addSubview:child3]; [root addSubview:child1]; [root addSubview:child2]; - [root yg_applyLayout]; + [root yk_applyLayout]; } diff --git a/enums.py b/enums.py index d2fc6dc0..b12203f0 100644 --- a/enums.py +++ b/enums.py @@ -89,6 +89,14 @@ ENUMS = { ], } +OBJC_ENUMS = { + 'Direction': [ + 'Inherit', + 'LeftToRight', + 'RightToLeft', + ] +} + LICENSE = """/** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. @@ -111,7 +119,7 @@ def to_java_upper(symbol): return out -root = os.path.dirname(__file__) +root = os.path.dirname(os.path.abspath(__file__)) # write out C header with open(root + '/yoga/YGEnums.h', 'w') as f: @@ -187,3 +195,18 @@ for name, values in ENUMS.items(): f.write(' %s,\n' % value) f.write(' }\n') f.write('}\n') + +# write out objc files +with open(root + '/YogaKit/YKEnums.h', 'w') as f: + objc_enums = ENUMS + objc_enums.update(OBJC_ENUMS) + f.write(LICENSE) + for name, values in objc_enums.items(): + f.write('typedef NS_ENUM(NSInteger, YK%s) {\n' % name) + for value in values: + if isinstance(value, tuple): + f.write(' YK%s%s = %d,\n' % (name, value[0], value[1])) + else: + f.write(' YK%s%s,\n' % (name, value)) + f.write('};\n') + f.write('\n') -- 2.50.1.windows.1 From 4be38891d89b60a4f8e8d5f268036f904f55a509 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 21:53:53 +0100 Subject: [PATCH 3/7] transformed style values into properties and removed enums that were implementation details --- YogaKit/UIView+YogaKit.h | 49 ++++---- YogaKit/UIView+YogaKit.m | 105 ++++++++++++++++++ YogaKit/YKEnums.h | 36 ------ .../UserInterfaceState.xcuserstate | Bin 24126 -> 24187 bytes YogaKit/YogaKit/YogaKit/YogaKit.h | 1 + enums.py | 25 +++-- 6 files changed, 148 insertions(+), 68 deletions(-) diff --git a/YogaKit/UIView+YogaKit.h b/YogaKit/UIView+YogaKit.h index 08fc4bd0..9d6b1f27 100644 --- a/YogaKit/UIView+YogaKit.h +++ b/YogaKit/UIView+YogaKit.h @@ -15,44 +15,47 @@ /** The property that decides if we should include this view when calculating layout. Defaults to YES. */ -@property (nonatomic, readwrite, assign, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout; +@property (nonatomic, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout; /** The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. */ -@property (nonatomic, readwrite, assign, setter=yk_setUsesYoga:) BOOL yk_usesYoga; +@property (nonatomic, setter=yk_setUsesYoga:) BOOL yk_usesYoga; -- (void)yk_setDirection:(YKDirection)direction; -- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection; -- (void)yk_setJustifyContent:(YKJustify)justifyContent; -- (void)yk_setAlignContent:(YKAlign)alignContent; -- (void)yk_setAlignItems:(YKAlign)alignItems; -- (void)yk_setAlignSelf:(YKAlign)alignSelf; -- (void)yk_setPositionType:(YKPositionType)positionType; -- (void)yk_setFlexWrap:(YKWrap)flexWrap; +@property (nonatomic, setter=yk_setDirection:) YKDirection yk_direction; +@property (nonatomic, setter=yk_setFlexDirection:) YKFlexDirection yk_flexDirection; +@property (nonatomic, setter=yk_setJustifyContent:) YKJustify yk_justifyContent; +@property (nonatomic, setter=yk_setAlignContent:) YKAlign yk_alignContent; +@property (nonatomic, setter=yk_setAlignItems:) YKAlign yk_alignItems; +@property (nonatomic, setter=yk_setAlignSelf:) YKAlign yk_alignSelf; +@property (nonatomic, setter=yk_setPositionType:) YKPositionType yk_positionType; +@property (nonatomic, setter=yk_setFlexWrap:) YKWrap yk_flexWrap; -- (void)yk_setFlexGrow:(CGFloat)flexGrow; -- (void)yk_setFlexShrink:(CGFloat)flexShrink; -- (void)yk_setFlexBasis:(CGFloat)flexBasis; +@property (nonatomic, setter=yk_setFlexGrow:) CGFloat yk_flexGrow; +@property (nonatomic, setter=yk_setFlexShrink:) CGFloat yk_flexShrink; +@property (nonatomic, setter=yk_setFlexBasis:) CGFloat yk_flexBasis; +- (void)yk_positionForEdge:(YKEdge)edge; - (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge; +- (void)yk_marginForEdge:(YKEdge)edge; - (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge; +- (void)yk_paddingForEdge:(YKEdge)edge; - (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge; -- (void)yk_setWidth:(CGFloat)width; -- (void)yk_setHeight:(CGFloat)height; -- (void)yk_setMinWidth:(CGFloat)minWidth; -- (void)yk_setMinHeight:(CGFloat)minHeight; -- (void)yk_setMaxWidth:(CGFloat)maxWidth; -- (void)yk_setMaxHeight:(CGFloat)maxHeight; +@property (nonatomic, setter=yk_setWidth:) CGFloat yk_width; +@property (nonatomic, setter=yk_setHeight:) CGFloat yk_height; +@property (nonatomic, setter=yk_setMinWidth:) CGFloat yk_minWidth; +@property (nonatomic, setter=yk_setMinHeight:) CGFloat yk_minHeight; +@property (nonatomic, setter=yk_setMaxWidth:) CGFloat yk_maxWidth; +@property (nonatomic, setter=yk_setMaxHeight:) CGFloat yk_maxHeight; // Yoga specific properties, not compatible with flexbox specification -- (void)yk_setAspectRatio:(CGFloat)aspectRatio; +@property (nonatomic, setter=yk_setAspectRatio:) CGFloat yk_aspectRatio; /** Get the resolved direction of this node. This won't be YGDirectionInherit */ -- (YKDirection)yk_resolvedDirection; +@property (nonatomic, readonly) CGFloat yk_resolvedDirection; /** Perform a layout calculation and update the frames of the views in the hierarchy with the results @@ -62,11 +65,11 @@ /** Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; */ -- (CGSize)yk_intrinsicSize; +@property (nonatomic, readonly) CGSize yk_intrinsicSize; /** Returns the number of children that are using Flexbox. */ -- (NSUInteger)yk_numberOfChildren; +@property (nonatomic, readonly) NSUInteger yk_numberOfChildren; @end diff --git a/YogaKit/UIView+YogaKit.m b/YogaKit/UIView+YogaKit.m index 46239f8f..e56e7689 100644 --- a/YogaKit/UIView+YogaKit.m +++ b/YogaKit/UIView+YogaKit.m @@ -76,106 +76,211 @@ OBJC_ASSOCIATION_RETAIN_NONATOMIC); } +- (YKDirection)yk_direction +{ + return (YKDirection)YGNodeStyleGetDirection([self ygNode]); +} + - (void)yk_setDirection:(YKDirection)direction { YGNodeStyleSetDirection([self ygNode], (YGDirection)direction); } +- (YKFlexDirection)yk_flexDirection +{ + return (YKFlexDirection)YGNodeStyleGetFlexDirection([self ygNode]); +} + - (void)yk_setFlexDirection:(YKFlexDirection)flexDirection { YGNodeStyleSetFlexDirection([self ygNode], (YGFlexDirection)flexDirection); } +- (YKJustify)yk_justifyContent +{ + return (YKJustify)YGNodeStyleGetJustifyContent([self ygNode]); +} + - (void)yk_setJustifyContent:(YKJustify)justifyContent { YGNodeStyleSetJustifyContent([self ygNode], (YGJustify)justifyContent); } +- (YKAlign)yk_alignContent +{ + return (YKAlign)YGNodeStyleGetAlignContent([self ygNode]); +} + - (void)yk_setAlignContent:(YKAlign)alignContent { YGNodeStyleSetAlignContent([self ygNode], (YGAlign)alignContent); } +- (YKAlign)yk_alignItems +{ + return (YKAlign)YGNodeStyleGetAlignItems([self ygNode]); +} + - (void)yk_setAlignItems:(YKAlign)alignItems { YGNodeStyleSetAlignItems([self ygNode], (YGAlign)alignItems); } +- (YKAlign)yk_alignSelf +{ + return (YKAlign)YGNodeStyleGetAlignSelf([self ygNode]); +} + - (void)yk_setAlignSelf:(YKAlign)alignSelf { YGNodeStyleSetAlignSelf([self ygNode], (YGAlign)alignSelf); } +- (YKPositionType)yk_positionType +{ + return (YKPositionType)YGNodeStyleGetPositionType([self ygNode]); +} + - (void)yk_setPositionType:(YKPositionType)positionType { YGNodeStyleSetPositionType([self ygNode], (YGPositionType)positionType); } +- (YKWrap)yk_flexWrap +{ + return (YKWrap)YGNodeStyleGetFlexWrap([self ygNode]); +} + - (void)yk_setFlexWrap:(YKWrap)flexWrap { YGNodeStyleSetFlexWrap([self ygNode], (YGWrap)flexWrap); } +- (CGFloat)yk_flexGrow +{ + return YGNodeStyleGetFlexGrow([self ygNode]); +} + - (void)yk_setFlexGrow:(CGFloat)flexGrow { YGNodeStyleSetFlexGrow([self ygNode], flexGrow); } +- (CGFloat)yk_flexShrink +{ + return YGNodeStyleGetFlexShrink([self ygNode]); +} + - (void)yk_setFlexShrink:(CGFloat)flexShrink { YGNodeStyleSetFlexShrink([self ygNode], flexShrink); } +- (CGFloat)yk_flexBasis +{ + return YGNodeStyleGetFlexBasis([self ygNode]); +} + - (void)yk_setFlexBasis:(CGFloat)flexBasis { YGNodeStyleSetFlexBasis([self ygNode], flexBasis); } +- (CGFloat)yk_positionForEdge:(YKEdge)edge +{ + return YGNodeStyleGetPosition([self ygNode], (YGEdge)edge); +} + - (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge { YGNodeStyleSetPosition([self ygNode], (YGEdge)edge, position); } +- (CGFloat)yk_marginForEdge:(YKEdge)edge +{ + return YGNodeStyleGetMargin([self ygNode], (YGEdge)edge); +} + - (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge { YGNodeStyleSetMargin([self ygNode], (YGEdge)edge, margin); } +- (CGFloat)yk_paddingForEdge:(YKEdge)edge +{ + return YGNodeStyleGetPadding([self ygNode], (YGEdge)edge); +} + - (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge { YGNodeStyleSetPadding([self ygNode], (YGEdge)edge, padding); } +- (CGFloat)yk_width +{ + return YGNodeStyleGetWidth([self ygNode]); +} + - (void)yk_setWidth:(CGFloat)width { YGNodeStyleSetWidth([self ygNode], width); } +- (CGFloat)yk_height +{ + return YGNodeStyleGetHeight([self ygNode]); +} + - (void)yk_setHeight:(CGFloat)height { YGNodeStyleSetHeight([self ygNode], height); } +- (CGFloat)yk_minWidth +{ + return YGNodeStyleGetMinWidth([self ygNode]); +} + - (void)yk_setMinWidth:(CGFloat)minWidth { YGNodeStyleSetMinWidth([self ygNode], minWidth); } +- (CGFloat)yk_minHeight +{ + return YGNodeStyleGetMinHeight([self ygNode]); +} + - (void)yk_setMinHeight:(CGFloat)minHeight { YGNodeStyleSetMinHeight([self ygNode], minHeight); } +- (CGFloat)yk_maxWidth +{ + return YGNodeStyleGetMaxWidth([self ygNode]); +} + - (void)yk_setMaxWidth:(CGFloat)maxWidth { YGNodeStyleSetMaxWidth([self ygNode], maxWidth); } +- (CGFloat)yk_maxHeight +{ + return YGNodeStyleGetMaxHeight([self ygNode]); +} + - (void)yk_setMaxHeight:(CGFloat)maxHeight { YGNodeStyleSetMaxHeight([self ygNode], maxHeight); } +- (CGFloat)yk_aspectRatio +{ + return YGNodeStyleGetAspectRatio([self ygNode]); +} + - (void)yk_setAspectRatio:(CGFloat)aspectRatio { YGNodeStyleSetAspectRatio([self ygNode], aspectRatio); diff --git a/YogaKit/YKEnums.h b/YogaKit/YKEnums.h index cc148d2b..3e684fdc 100644 --- a/YogaKit/YKEnums.h +++ b/YogaKit/YKEnums.h @@ -14,18 +14,6 @@ typedef NS_ENUM(NSInteger, YKFlexDirection) { YKFlexDirectionRowReverse, }; -typedef NS_ENUM(NSInteger, YKMeasureMode) { - YKMeasureModeUndefined, - YKMeasureModeExactly, - YKMeasureModeAtMost, -}; - -typedef NS_ENUM(NSInteger, YKPrintOptions) { - YKPrintOptionsLayout = 1, - YKPrintOptionsStyle = 2, - YKPrintOptionsChildren = 4, -}; - typedef NS_ENUM(NSInteger, YKEdge) { YKEdgeLeft, YKEdgeTop, @@ -43,11 +31,6 @@ typedef NS_ENUM(NSInteger, YKPositionType) { YKPositionTypeAbsolute, }; -typedef NS_ENUM(NSInteger, YKDimension) { - YKDimensionWidth, - YKDimensionHeight, -}; - typedef NS_ENUM(NSInteger, YKJustify) { YKJustifyFlexStart, YKJustifyCenter, @@ -62,30 +45,11 @@ typedef NS_ENUM(NSInteger, YKDirection) { YKDirectionRightToLeft, }; -typedef NS_ENUM(NSInteger, YKLogLevel) { - YKLogLevelError, - YKLogLevelWarn, - YKLogLevelInfo, - YKLogLevelDebug, - YKLogLevelVerbose, -}; - typedef NS_ENUM(NSInteger, YKWrap) { YKWrapNoWrap, YKWrapWrap, }; -typedef NS_ENUM(NSInteger, YKOverflow) { - YKOverflowVisible, - YKOverflowHidden, - YKOverflowScroll, -}; - -typedef NS_ENUM(NSInteger, YKExperimentalFeature) { - YKExperimentalFeatureRounding, - YKExperimentalFeatureWebFlexBasis, -}; - typedef NS_ENUM(NSInteger, YKAlign) { YKAlignAuto, YKAlignFlexStart, diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index 33536713a50be1596623da79b922b35bc5b5f981..a338638b9bc1097d2c7c479e8bb6f41b64c5f9d7 100644 GIT binary patch delta 13533 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 R?}A|0d)@ym`9J6S{|DM=ap(X5 diff --git a/YogaKit/YogaKit/YogaKit/YogaKit.h b/YogaKit/YogaKit/YogaKit/YogaKit.h index c059a0de..6b4620b9 100644 --- a/YogaKit/YogaKit/YogaKit/YogaKit.h +++ b/YogaKit/YogaKit/YogaKit/YogaKit.h @@ -15,3 +15,4 @@ FOUNDATION_EXPORT double YogaKitVersionNumber; FOUNDATION_EXPORT const unsigned char YogaKitVersionString[]; #import +#import diff --git a/enums.py b/enums.py index b12203f0..2a3c7c01 100644 --- a/enums.py +++ b/enums.py @@ -94,7 +94,13 @@ OBJC_ENUMS = { 'Inherit', 'LeftToRight', 'RightToLeft', - ] + ], + 'MeasureMode': None, + 'PrintOptions': None, + 'Dimension': None, + 'LogLevel': None, + 'Overflow': None, + 'ExperimentalFeature': None } LICENSE = """/** @@ -202,11 +208,12 @@ with open(root + '/YogaKit/YKEnums.h', 'w') as f: objc_enums.update(OBJC_ENUMS) f.write(LICENSE) for name, values in objc_enums.items(): - f.write('typedef NS_ENUM(NSInteger, YK%s) {\n' % name) - for value in values: - if isinstance(value, tuple): - f.write(' YK%s%s = %d,\n' % (name, value[0], value[1])) - else: - f.write(' YK%s%s,\n' % (name, value)) - f.write('};\n') - f.write('\n') + if values is not None: + f.write('typedef NS_ENUM(NSInteger, YK%s) {\n' % name) + for value in values: + if isinstance(value, tuple): + f.write(' YK%s%s = %d,\n' % (name, value[0], value[1])) + else: + f.write(' YK%s%s,\n' % (name, value)) + f.write('};\n') + f.write('\n') -- 2.50.1.windows.1 From ec31ea0bc99da5eefa08a807961e249157bf1ed8 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 22:06:07 +0100 Subject: [PATCH 4/7] rename properties and methods in Swift to remove the yk_ prefix --- YogaKit/UIView+YogaKit.h | 48 +++++++++--------- .../YogaKit/YogaKit.xcodeproj/project.pbxproj | 10 ++++ .../UserInterfaceState.xcuserstate | Bin 24187 -> 27531 bytes .../YogaKitSample/SwiftViewController.swift | 41 +++++++++++++++ .../YogaKit/YogaKitSample/ViewController.h | 1 - 5 files changed, 75 insertions(+), 25 deletions(-) create mode 100644 YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift diff --git a/YogaKit/UIView+YogaKit.h b/YogaKit/UIView+YogaKit.h index 9d6b1f27..d6f0b8bf 100644 --- a/YogaKit/UIView+YogaKit.h +++ b/YogaKit/UIView+YogaKit.h @@ -15,25 +15,25 @@ /** The property that decides if we should include this view when calculating layout. Defaults to YES. */ -@property (nonatomic, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout; +@property (nonatomic, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout NS_SWIFT_NAME(includeInLayout); /** The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. */ -@property (nonatomic, setter=yk_setUsesYoga:) BOOL yk_usesYoga; +@property (nonatomic, setter=yk_setUsesYoga:) BOOL yk_usesYoga NS_SWIFT_NAME(usesYoga); -@property (nonatomic, setter=yk_setDirection:) YKDirection yk_direction; -@property (nonatomic, setter=yk_setFlexDirection:) YKFlexDirection yk_flexDirection; -@property (nonatomic, setter=yk_setJustifyContent:) YKJustify yk_justifyContent; -@property (nonatomic, setter=yk_setAlignContent:) YKAlign yk_alignContent; -@property (nonatomic, setter=yk_setAlignItems:) YKAlign yk_alignItems; -@property (nonatomic, setter=yk_setAlignSelf:) YKAlign yk_alignSelf; -@property (nonatomic, setter=yk_setPositionType:) YKPositionType yk_positionType; -@property (nonatomic, setter=yk_setFlexWrap:) YKWrap yk_flexWrap; +@property (nonatomic, setter=yk_setDirection:) YKDirection yk_direction NS_SWIFT_NAME(layoutDirection); +@property (nonatomic, setter=yk_setFlexDirection:) YKFlexDirection yk_flexDirection NS_SWIFT_NAME(layoutFlexDirection); +@property (nonatomic, setter=yk_setJustifyContent:) YKJustify yk_justifyContent NS_SWIFT_NAME(layoutJustifyContent); +@property (nonatomic, setter=yk_setAlignContent:) YKAlign yk_alignContent NS_SWIFT_NAME(layoutAlignContent); +@property (nonatomic, setter=yk_setAlignItems:) YKAlign yk_alignItems NS_SWIFT_NAME(layoutAlignItems); +@property (nonatomic, setter=yk_setAlignSelf:) YKAlign yk_alignSelf NS_SWIFT_NAME(layoutAlignSelf); +@property (nonatomic, setter=yk_setPositionType:) YKPositionType yk_positionType NS_SWIFT_NAME(layoutPositionType); +@property (nonatomic, setter=yk_setFlexWrap:) YKWrap yk_flexWrap NS_SWIFT_NAME(layoutFlexWrap); -@property (nonatomic, setter=yk_setFlexGrow:) CGFloat yk_flexGrow; -@property (nonatomic, setter=yk_setFlexShrink:) CGFloat yk_flexShrink; -@property (nonatomic, setter=yk_setFlexBasis:) CGFloat yk_flexBasis; +@property (nonatomic, setter=yk_setFlexGrow:) CGFloat yk_flexGrow NS_SWIFT_NAME(layoutFlexGrow); +@property (nonatomic, setter=yk_setFlexShrink:) CGFloat yk_flexShrink NS_SWIFT_NAME(layoutFlexShrink); +@property (nonatomic, setter=yk_setFlexBasis:) CGFloat yk_flexBasis NS_SWIFT_NAME(layoutFlexBasis); - (void)yk_positionForEdge:(YKEdge)edge; - (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge; @@ -42,34 +42,34 @@ - (void)yk_paddingForEdge:(YKEdge)edge; - (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge; -@property (nonatomic, setter=yk_setWidth:) CGFloat yk_width; -@property (nonatomic, setter=yk_setHeight:) CGFloat yk_height; -@property (nonatomic, setter=yk_setMinWidth:) CGFloat yk_minWidth; -@property (nonatomic, setter=yk_setMinHeight:) CGFloat yk_minHeight; -@property (nonatomic, setter=yk_setMaxWidth:) CGFloat yk_maxWidth; -@property (nonatomic, setter=yk_setMaxHeight:) CGFloat yk_maxHeight; +@property (nonatomic, setter=yk_setWidth:) CGFloat yk_width NS_SWIFT_NAME(layoutWidth); +@property (nonatomic, setter=yk_setHeight:) CGFloat yk_height NS_SWIFT_NAME(layoutHeight); +@property (nonatomic, setter=yk_setMinWidth:) CGFloat yk_minWidth NS_SWIFT_NAME(layoutMinWidth); +@property (nonatomic, setter=yk_setMinHeight:) CGFloat yk_minHeight NS_SWIFT_NAME(layoutMinHeight); +@property (nonatomic, setter=yk_setMaxWidth:) CGFloat yk_maxWidth NS_SWIFT_NAME(layoutMaxWidth); +@property (nonatomic, setter=yk_setMaxHeight:) CGFloat yk_maxHeight NS_SWIFT_NAME(layoutMaxHeight); // Yoga specific properties, not compatible with flexbox specification -@property (nonatomic, setter=yk_setAspectRatio:) CGFloat yk_aspectRatio; +@property (nonatomic, setter=yk_setAspectRatio:) CGFloat yk_aspectRatio NS_SWIFT_NAME(layoutAspectRatio); /** Get the resolved direction of this node. This won't be YGDirectionInherit */ -@property (nonatomic, readonly) CGFloat yk_resolvedDirection; +@property (nonatomic, readonly) CGFloat yk_resolvedDirection NS_SWIFT_NAME(layoutResolvedDirection); /** Perform a layout calculation and update the frames of the views in the hierarchy with the results */ -- (void)yk_applyLayout; +- (void)yk_applyLayout NS_SWIFT_NAME(applyLayout()); /** Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; */ -@property (nonatomic, readonly) CGSize yk_intrinsicSize; +@property (nonatomic, readonly) CGSize yk_intrinsicSize NS_SWIFT_NAME(layoutIntrinsicSize); /** Returns the number of children that are using Flexbox. */ -@property (nonatomic, readonly) NSUInteger yk_numberOfChildren; +@property (nonatomic, readonly) NSUInteger yk_numberOfChildren NS_SWIFT_NAME(layoutNumberOfChildren); @end diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj index 011a3824..a3eb674e 100644 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; }; 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE08521E06F3D100EE5F9A /* YKEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE08551E072EF800EE5F9A /* SwiftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EE08541E072EF800EE5F9A /* SwiftViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -72,6 +73,7 @@ 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YogaKit.h; sourceTree = ""; }; 63EE08401E06ED3D00EE5F9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63EE08521E06F3D100EE5F9A /* YKEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YKEnums.h; path = ../../YKEnums.h; sourceTree = ""; }; + 63EE08541E072EF800EE5F9A /* SwiftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -121,6 +123,7 @@ 13687D4A1DF8748400E7C260 /* AppDelegate.m */, 13687D4C1DF8748400E7C260 /* ViewController.h */, 13687D4D1DF8748400E7C260 /* ViewController.m */, + 63EE08541E072EF800EE5F9A /* SwiftViewController.swift */, 13687D521DF8748400E7C260 /* Assets.xcassets */, 13687D571DF8748400E7C260 /* Info.plist */, 13687D461DF8748400E7C260 /* Supporting Files */, @@ -238,6 +241,7 @@ TargetAttributes = { 13687D421DF8748300E7C260 = { CreatedOnToolsVersion = 8.1; + LastSwiftMigration = 0820; ProvisioningStyle = Automatic; }; 63EE083C1E06ED3D00EE5F9A = { @@ -288,6 +292,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 63EE08551E072EF800EE5F9A /* SwiftViewController.swift in Sources */, 13687D4E1DF8748400E7C260 /* ViewController.m in Sources */, 13687D4B1DF8748400E7C260 /* AppDelegate.m in Sources */, 13687D481DF8748400E7C260 /* main.m in Sources */, @@ -409,10 +414,13 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; INFOPLIST_FILE = YogaKitSample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.YogaKitSample; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -420,10 +428,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; INFOPLIST_FILE = YogaKitSample/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.YogaKitSample; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index a338638b9bc1097d2c7c479e8bb6f41b64c5f9d7..daec9dbcd36a9da7cc3f181201a4fa0f0275100b 100644 GIT binary patch delta 11438 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 delta 9488 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 diff --git a/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift b/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift new file mode 100644 index 00000000..40c032ef --- /dev/null +++ b/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift @@ -0,0 +1,41 @@ +// +// SwiftViewController.swift +// YogaKit +// +// Created by David Hart on 18.12.16. +// Copyright © 2016 facebook. All rights reserved. +// + +import UIKit +import YogaKit + +class SwiftViewController : UIViewController { + override func viewDidLoad() { + let root = view! + root.backgroundColor = .red + root.usesYoga = true + root.layoutWidth = view.bounds.size.width + root.layoutHeight = view.bounds.size.height + root.layoutAlignItems = .center + root.layoutJustifyContent = .center + + let child1 = UIView() + child1.backgroundColor = .blue + child1.usesYoga = true + child1.layoutWidth = 100 + child1.layoutHeight = 100 + + let child2 = UIView() + child2.backgroundColor = .green + child2.frame = CGRect(origin: .zero, size: CGSize(width: 200, height: 100)) + + let child3 = UIView() + child3.backgroundColor = .yellow + child3.frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 100)) + + child2.addSubview(child3) + root.addSubview(child1) + root.addSubview(child2) + root.applyLayout() + } +} diff --git a/YogaKit/YogaKit/YogaKitSample/ViewController.h b/YogaKit/YogaKit/YogaKitSample/ViewController.h index f5642871..e9c49504 100644 --- a/YogaKit/YogaKit/YogaKitSample/ViewController.h +++ b/YogaKit/YogaKit/YogaKitSample/ViewController.h @@ -10,6 +10,5 @@ @interface ViewController : UIViewController - @end -- 2.50.1.windows.1 From f24baffffab98cc0d4e813be9d7d0c6271f1bb29 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 22:34:54 +0100 Subject: [PATCH 5/7] removed Xcode userdata and added to gitignore --- .gitignore | 3 + .../UserInterfaceState.xcuserstate | Bin 27531 -> 27486 bytes .../UserInterfaceState.xcuserstate | Bin 20985 -> 0 bytes .../xcschemes/YogaKitSample.xcscheme | 91 ------------------ .../xcschemes/xcschememanagement.plist | 32 ------ .../xcschemes/YogaKitSample.xcscheme | 91 ------------------ .../xcschemes/xcschememanagement.plist | 22 ----- 7 files changed, 3 insertions(+), 236 deletions(-) delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/emilsj.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/YogaKitSample.xcscheme delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index 5b346768..8a2620f5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ # Visual studio code .vscode + +# Xcode +xcuserdata \ No newline at end of file diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index daec9dbcd36a9da7cc3f181201a4fa0f0275100b..b9c1ca19bf172ab3d32b354f7ab67f6ec17cd296 100644 GIT binary patch delta 9110 zcmZ`-2UrtX*PcQN1kyu78VMvJAqi~^4MU04wh+th6H8ZQL?%Eyet_`qY z@4eU6RoA+<&$X^??XIh?^`C&~`uyKVo(wbRzV|)%y!YI5=Vtr`@alPRN?rK(z)E24 z)Me8kU@VpaP7E%9>Y$}i1GEfU1+9ZNL0h5S(0=FubQU@X{RW+fEI2?|EBVhtegvl@sX2NWk3ya`nSPg4nEo_D@a0c8OZUc9O z3t&H72p7Sf;LdO{+!O8vm%{_Z@Hg-fcsM))M&WPaaq#!>M0f`L6TASfhnK=D;q~xl zc;|)+=nn|Y$K2tgVJ{Nca3Opt2&<6*hDM&?#CyLf?=i4rdD%CutNIS?U)85iS^v}l zAsbdguu?5ZJfg-w-I0+<5DE3(MxcO^Mg%}4h#5N-)e|-%>6j(DGD?TY5Cf8osIj%t z)sp|sO9?vzqyYwC5wIBRN=(2y5mRM0U?Gxobu z1%v=voO%T@HC&IRApmwdyEDd(*&1%bhmww6jJZb0s0DsQGV!?f#F`0NwZIi58wpG! zaTqyB3#4T|a2sd2i?qVsbVKs7R8l$E8kei>cv`Hq_fT}_LOYxyb0nq>vB!U!xwg`*? zV?h!~MjVI}aUt$SAQhwm5|Dv-kUU&QA3lJM6u1u8KA2NSD{QiRQ+B((i3-6yd?W20D|LTVO#Qu8dZ z9#?S#uo2h<)F6%e6%WRzyiIv`dsU#jOpbM-I^eE|9$QUq50+vtsX9&>(gW#<^jZY^ z!9uVI?1YpfRY(mo9M_-~&B5u7R3Lqj%0++#uz|e+F&>l}>5FGe09!_zPN=R0hamm% zhYAJme@0 z0~(N8qz*|9J>VbwA@m8jn|ok~SQ<|LCnX>iq{fwi7|4QJNP{fFosik=&q6_FC z<|8S!jZ^`wC7VtA+`BE*4v;Qf7}AgJW2%v@$U)=~au_*+|38S&<{^B=pJP{t%12x7 z*a)Bw7z@qE&Tuo7$o|G<3@wCeODGhl*B$5|=-EF|-OD?0XrHn=Xd#f^1gM7=VO@B< z@Oo%5v;^zSYe`%V5TU-%3ZM>Ji8b(qJyt_&ikx0+-|l5Yyk!IHptV5yzn;%RgK_*f z(0XVnv=KRq96)|KgBylJBcLtFcJI)Nl4dEkK|26iE%Y6-vliNk97FQYL6e}#&=ed! z721QP@{Q($&@n)|1UdvAhJJ>QKu4ipkYACL$SLGBat1lO1du={@Qju~r=ZjLgq_2` zUgSJ-0oP|9e^>NnFjx!y2l)*dhIJSCg4e;|!q4de-GZI~(iM2Ay$#)g?n3vV`_P}z z1Lz_22zrcMLM|i!L9QUbBUh1Y$aUlfaud0=0(bNb|NaHN0E?iP(5pt*Z*Z4?;NRQG zU3|UWL+&>Y;!h+{LSb9mv~AnJe^vi><$VU0VWxzS!6-O-A#$ftX*dRs?dr;j+S&v&tKzhE@i$64GHcV+8a??HiQ&+rf!Eyh(k8iyHBr42<@w}`B2P4(Ba02r1 z(-MIb!C*a{1S`d`1bKu!MgICM1T2FU|6V7s5>_FPktg_~xFHnB>tMrItwz{{JVT!2 ztpZU(FcZ%Cs&@(Ov4{DZtf-Xiao0%F(&yI~KU2YX>3p4abDC|Z61Xey5&3|8M7q?&rEqt+3gMv{ZfALtcEFNniju8F;=xX8dC>V{9ehZa#coMK4o(xaH znR)PFcskZYtRT*WXW`R28=eFIh|Lvif^+ewdGP!Kr#H2GU|^tCXppf@X|oWnE&iM~ zZScl=cp+Q|q<3_BLr+bhMeyQIpVp{5FtAr0yaY)9x1kBu052<{#NiWVuj<*Rs&r6g zS>J*7s?xwfLU~o+dU!d!0`p4D!By~@F9EJaL27eWZ3u<75d~@gEwmbV2a0d0009NV zP>_BWZi;aiyc_|T7mpD?qhMU9P)b>*e`|-p zXPO;EpdkB;gLCkYC>Z~l{sKH7E0!AAUrp(q(Db1ouY{6|^-DHmPjwO4eJM8*w+Tup zF5ITYZ33()nF4mjDw4m&w};2cr||0@8B^T6bA^$@sQ+F7VYDzh3d&J11z#YqWi7~! zo8!4KK7uEJ61TONZwSM)LxD|Iu{JPMR)SzOwqKDf4!A#s9#$OIrK!X>8vy$5VFSK43=aF|Ys0Xxny(Eb!-8KMz6~4o zwShAxZ0y&TAHv2r8L&snDtwT|s)6|RjOsWT*svf~2x^;`f7mJfeezR*3OkE}WuI~> z>^#1Shg}G}h=M&(umUgHPt{_48=FKIVMdJyzZ<6+hEw)ZNHCf9D7Tp}oE%PR^4wS@ z!|^JK#pn{7bkhGXox+9TqOSr77l%te1u#jswJ`ucwm{FLefE8D9Or66DjIg%1iJ@^1)uE__%hU1s3vVltE~ zKaXHqIQI3JXNJ#eGBkz$BOdy3gV`832mQ~u8^V`;&9O3k)u*sBj4MN_nTSzL@mQFt zk_Hx`;A#|Hi@zy`J~j9f9A)|g9ESBuAA(0^5pB$u(ma zEY#4-+FnBW3A;gLU?W@RWAAeW*n-vsY-9#63~$?sJt^!E5n*U7s}D0a;;XJUvvsIt zKi-mw^)8ITG+E&xnu8^j){TpHo-qm=nMK8+Q?eSNN3a$}5^R?>5`(ijxLJ^08tQPo zgkr!uq+*-1S-ADr>?*M9hU}chQK7~&B^39k5)g^?$t7cED>dZy+-I&~R!#_bzJ#K| zJXSgOeI}jIxFw+AMI2nL~w z@uJ{OT-bIt(-*|Ni1|2TAqxJ1g11A6J2>J;n?CrNV`aoD9I*xk@1Y?6!hwSL`$kgB z-I0dtgL)q8Tw_Qx=1o(nJ6rmh<5I+BoZ|`#zCgjhLmV%gIEJ#W#o*9=LA;81jU(Qm;5!t2A3}V<5u+XHpAnG}k&%ETOpihU3V|U+ z4vx6w_~Ip!5y@;qz$g^fj1W5IUpNvYlbR3_C=}U@=;2KHJUNk?NG%|V#JxnJP&AH! zh)qGISFCw}&qwp=@yp?{d1@lfk=g%kY9ezYTi}eXP$(9KNFhdY6Qlb5$q_S}7|j^j zCH^u>XQT`7;XxrP3eiG6=y;@V*B7-SizB-<#lb|OxaK$(xc;R@MPwhGqb~}vQ7Asd z!NEE1xYE8vIxMmVM~pxr9t!b82tm`h(q=z?P|`FmolZBRsK%f%;AdvN@pGi3BFFvL zNWYK#0cV_mLP8W0g%}e*CB&t`zUfVj`WETh5&jyZR;v_hJ`+xh#B1UI&+5q8k#lgu zpHN7QLXr@n6c6HxTmMC>rI8IyLdZ}^jw2eALg`WBTTY>;oQiibp-?&snNcY8^Gg1P zvz{yv-vFrI@pu)S=S>Y&K`9pS3$RDt2E1XWF9*M#_jTX|l5(B`jen(pPyzwM#`hgU z5*yeT~P263Ux)HZYa11g}UQ!vnY5H1y7^k0em0&@)}F%*jSRG z68y)Qo>7EOO;3SO)ipM}Yg6ehbmPS_t0)`{_9B!M1{1y~j3-PaOeRbvV1yZjS%f)+ zp9rf7YYFQK8wr~UTM63ni7$vRWAb7;#q^6A95W$iM$F!rLorWdqhg7%v9aV>YAh#~ADa*> zicN|2#TLenik%R?C(1k0j3}H;{LekCD%j&yz2bFO#p3Zdn&?o#ek9#CFW z-ca6AK2V9&SSp!HrN&dGR2emes-#+|rPONb5b9{^80t9c4^)gghdQ6Sl)8(0ka~i8 zih726j{1oDh6dAu;j~Cv6pct@(Bf!p8i&TC324c*99k~TM+?w;)B4c*(yD3wX*IMF zv>*+ojiP-=tEcUy-J-pthtnhI1Ui$>rgP|gdIDWUH_)@`t?6y)?deu}M|vlEF};M| zo!*1qi{6_)gg%}=oj#AgoW6#>j=q7umA;+6Gf3Y}KSDoEzf8YRe@cJP02mM>oDs>0 zV(=L$3Fp-(e zlrt4f6*HA-VzyygnKq__naA`oJ2L&u0JAT1D6@t+f*E9@%u&oq%qh%i%<0UT%-PHz znY)ls%bR}ohkR~6SUZa~}*adYBU#GQ=$ zz~Zw~SSps9rDLVBjI0hpRzAzmDq~9_IcqR$1S`lwS)*7#uqLo3v8J%5u`t$8 ztPQNatOKk=tRt*nSjSnHSXWqASvOd>ShrcvS%0%$vEH!Wu|BYgY!aKorn8xB7F*0t zX3N=1b}C!L&SGb?bJ#7}PIei)C%c?o!LDRivHP(Hu!Dox->`?WYuMA+)7dlGv)Mng z=d$Os7qaWvi`Yxp4eaIY)9hFAN%5KS?)YKx%i{OOUyuKXlfuz+T5wu%Y@8BK56&>o zcbsXQpEwPi<(!qA)toJyeVhZFlbnm3KRM4hZ@7`%7%quR;WD`_ZakOEP2?K5?YItZ zM{aSD+k;!qt>9L2zvYhSPUFtvHgGp^_i%4;Z*gyPAM-$71dq&9@N_&UuasBDtKuQN z@x1B0nY;zO<-9e#?Yy6PM|sD1CwS+17kO8B_jwO_k9p5{fARk2NARQgM1Cw^!_VU9 z^6h*l-_6hC`}iICrTj8}PkuSSf*-8pSMmGtr}LNd5Az=ir~;WlD@YR<1?hsmf-!>0 zf+>P&f(3%jf~|t>f}Mihg1v(Mf`fv?f+K=o1jhxp1h)lu1@{FH1djwy1kVJ23H}zm z68s~0n-G^ENobScPpD1^CSVCm6LutANO&j=6UGWjLW(e6C>5%NdSPZzm?g{+b`V;H zHla_LFDwvt6$XT*!fN3F;UM7<;V|KF;djCb!b!p@!fC?k!dl@HVS{kFaE)-CaD#A@ z@QCoV@T%~Z@V4--@S*Ur@Tu^*2oOby;zV2#Uz8vci=-l%C`FVd$`uugI*E!!C8B_+ zR8%JFDH<#qA_@)@jSwNCQKB)T??vN9b)r3@g|kOU=>lc-7bq_`wol0T^^sdG|E()6U- zr23@ANexNAC;gf9DCud^Ur8^MUW*xGzE~(u5=+Duu_Guh5EqF%i;Klw#iinE@o4c( z@oe!=;`!pG;x*#+;!Wb+;^X48;>+S&;wR!4`0s#Gl0=DI(n{i&lu3F?DkOa+{Uie< z!zDq}Sar0%VaBLTZ6J)vOThWvcs~Yvg5K}WzS`A9_3!;KIMU+^0@M(@{IDF^0xAc^11SF(^NB5vs8;zi&aZh4XSmj)2fTA*QumbS*jtmRchPR4ym?O zXR0UFml{azp4v0DcWPy7b?SiBL8OV#=6@6^-OK}0 zyG46Ydnl+qtUaRrO?zH@L3>GiQ+r!`Py46#mG+JHy$;a9x^SIZ*Fx7y=hC@#9-UX$ zRTt28({Z)}Ebc1wbbl>YH=qBr?>2B*D>)z@ieYl>WC+cZ>rk<_m>iK%HUZHpD zd+Dq7L-oV;K|QLUq@S#xqMxQ;pkJsD*6Qo^YxTSId-VtOhxJGG$Mq-mSM=BPH}$vm z_w*0+kM&Q}glW#Sk!iEj7N<3&El*pOwl-~j+K#lnX$R5{ryWWAE$wpJm9(pAx6U^Unc#fGkiQbUiRq1@2N zP-Wu-vf9u*R^@@T=jp;hf=u;j-b1;gR8q z;ho{V;e!z{#u`aRvXN@!82Lt_G0~_u8jWUSrZLAj#yHtH*H~{{Vq9iiY20AkY}{tt zY20nRW&CI&n208liDC-!O(`Z7es0y9j3%=w(_}T-O)iti163*>1wI8R9X6223l5Ic35^<_E`33bj_&D zsLJSxR%PAFdYbh->qXY9?DpBd?2g&~>`vKO_QLGC>_yp2bKo3G z4lRd~!|JfC!{!cKJ8bW;%Sy5GtqE3xoST>H0XOq}; zwoIGVmS^+XI@_DXw=eXM=DeV%=Rz1CiDUu<7(UuWNF-)!Gz-(f#!|J8oM{)hdM{fYgV z{V)69_74uw5$1?+L^+5KhJ){rI`ocAN4BGdqm`qL!{Kl{ypDW_-%;c!byPcQ9OE2Q z9hhT=W0qr%qt3C|(GYYjcdT-(acp($cbs%wbX;~^aa?s=cieY8bUbl9bG&f8bbNFY zoJ^;{DRd?}#ZIYH?bJC9PLtE(%yhPOx}2SzWzL??a%Y9J(mB{U)H&Qa(uq1pIVU)0 zI%}P)om-sSoI9MmoO_%{oX4EMI!`&zI)8Isb>4G6cLqPY2(D;XjEm%=xZ+(rSAt9A z61$`>wJY7#(&cm&xC&jJT*a;uS1(tEtFNotHNZ8dTH{*p z+T_~e+V0xvI^;U(y5zd!dg6NK`pfmV>y;aD!|n(-!A*3>y5rnJx5Az7Zs~6AZtHFz zbX(nd?tHi3UF0rym$-Ym`@3u0(;9l-tfY}@=Dz5@ z;lAa*?Y`^2?|$z7+x^=8#{J&?(L?Z1Jpzx&BlaYFQannJ#nZu)@9E(w_w?~pdHQ<> zd4_muJR?1mJ<~kXJu^LXJaaw41)e(3BF_@fTF(y8InRSUAdi`+%4?U`Id5LxqP!J( zoAUPO9nCwQcQWrx-le=NdDrr8=KbMid39c!*XJ$qcJr2bdwDCoeZAG*5#G_>vECoN z6TQ>Dv%Eig=Xn=+k9c4D5`7Av&S&wp_c?tYpU+p|>*5Rey8C+i%7ecCzJb1BzOlYZ zzNxtEn+@UQT%@>|#VxB5@`Px;UK&-*X=ulTR|Z~AZh@A)72ANk+--}yfjf`!F} vy$kyk_ATsJxVmsh;jY3xh5HLX7R3~iiYP_&B5P5nqOL_fu!@QVu-E?q3Vg;k delta 9092 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 WZfT3s!KD*Qr diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/emilsj.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/emilsj.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 47db969a47042b4903b4e9d2c32d6e0280b8de55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20985 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 9ee20b37..00000000 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/david.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - YogaKit.xcscheme_^#shared#^_ - - orderHint - 1 - - YogaKitSample.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 13687D421DF8748300E7C260 - - primary - - - 63EE083C1E06ED3D00EE5F9A - - primary - - - - - diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme deleted file mode 100644 index e785e85e..00000000 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/YogaKitSample.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist b/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 336f995f..00000000 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/xcuserdata/emilsj.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - YogaKitSample.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 13687D421DF8748300E7C260 - - primary - - - - - -- 2.50.1.windows.1 From 5f5e5df32808c773fe1c2615388d49f6eb4c40f0 Mon Sep 17 00:00:00 2001 From: David Hart Date: Mon, 19 Dec 2016 01:13:16 +0100 Subject: [PATCH 6/7] Moved properties to a YKLayout object --- YogaKit/UIView+YogaKit.h | 62 +-- YogaKit/UIView+YogaKit.m | 474 +----------------- YogaKit/YKEnums.h | 24 +- YogaKit/YKLayout+Private.h | 16 + YogaKit/YKLayout.h | 97 ++++ YogaKit/YKLayout.m | 294 +++++++++++ .../YogaKit/YogaKit.xcodeproj/project.pbxproj | 12 + .../UserInterfaceState.xcuserstate | Bin 27486 -> 33058 bytes .../YogaKitSample/SwiftViewController.swift | 18 +- .../YogaKit/YogaKitSample/ViewController.m | 18 +- enums.py | 3 +- 11 files changed, 456 insertions(+), 562 deletions(-) create mode 100644 YogaKit/YKLayout+Private.h create mode 100644 YogaKit/YKLayout.h create mode 100644 YogaKit/YKLayout.m diff --git a/YogaKit/UIView+YogaKit.h b/YogaKit/UIView+YogaKit.h index d6f0b8bf..d5b17514 100644 --- a/YogaKit/UIView+YogaKit.h +++ b/YogaKit/UIView+YogaKit.h @@ -8,68 +8,10 @@ */ #import -#import "YKEnums.h" +#import @interface UIView (YogaKit) -/** - The property that decides if we should include this view when calculating layout. Defaults to YES. - */ -@property (nonatomic, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout NS_SWIFT_NAME(includeInLayout); - -/** - The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. - */ -@property (nonatomic, setter=yk_setUsesYoga:) BOOL yk_usesYoga NS_SWIFT_NAME(usesYoga); - -@property (nonatomic, setter=yk_setDirection:) YKDirection yk_direction NS_SWIFT_NAME(layoutDirection); -@property (nonatomic, setter=yk_setFlexDirection:) YKFlexDirection yk_flexDirection NS_SWIFT_NAME(layoutFlexDirection); -@property (nonatomic, setter=yk_setJustifyContent:) YKJustify yk_justifyContent NS_SWIFT_NAME(layoutJustifyContent); -@property (nonatomic, setter=yk_setAlignContent:) YKAlign yk_alignContent NS_SWIFT_NAME(layoutAlignContent); -@property (nonatomic, setter=yk_setAlignItems:) YKAlign yk_alignItems NS_SWIFT_NAME(layoutAlignItems); -@property (nonatomic, setter=yk_setAlignSelf:) YKAlign yk_alignSelf NS_SWIFT_NAME(layoutAlignSelf); -@property (nonatomic, setter=yk_setPositionType:) YKPositionType yk_positionType NS_SWIFT_NAME(layoutPositionType); -@property (nonatomic, setter=yk_setFlexWrap:) YKWrap yk_flexWrap NS_SWIFT_NAME(layoutFlexWrap); - -@property (nonatomic, setter=yk_setFlexGrow:) CGFloat yk_flexGrow NS_SWIFT_NAME(layoutFlexGrow); -@property (nonatomic, setter=yk_setFlexShrink:) CGFloat yk_flexShrink NS_SWIFT_NAME(layoutFlexShrink); -@property (nonatomic, setter=yk_setFlexBasis:) CGFloat yk_flexBasis NS_SWIFT_NAME(layoutFlexBasis); - -- (void)yk_positionForEdge:(YKEdge)edge; -- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge; -- (void)yk_marginForEdge:(YKEdge)edge; -- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge; -- (void)yk_paddingForEdge:(YKEdge)edge; -- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge; - -@property (nonatomic, setter=yk_setWidth:) CGFloat yk_width NS_SWIFT_NAME(layoutWidth); -@property (nonatomic, setter=yk_setHeight:) CGFloat yk_height NS_SWIFT_NAME(layoutHeight); -@property (nonatomic, setter=yk_setMinWidth:) CGFloat yk_minWidth NS_SWIFT_NAME(layoutMinWidth); -@property (nonatomic, setter=yk_setMinHeight:) CGFloat yk_minHeight NS_SWIFT_NAME(layoutMinHeight); -@property (nonatomic, setter=yk_setMaxWidth:) CGFloat yk_maxWidth NS_SWIFT_NAME(layoutMaxWidth); -@property (nonatomic, setter=yk_setMaxHeight:) CGFloat yk_maxHeight NS_SWIFT_NAME(layoutMaxHeight); - -// Yoga specific properties, not compatible with flexbox specification -@property (nonatomic, setter=yk_setAspectRatio:) CGFloat yk_aspectRatio NS_SWIFT_NAME(layoutAspectRatio); - -/** - Get the resolved direction of this node. This won't be YGDirectionInherit - */ -@property (nonatomic, readonly) CGFloat yk_resolvedDirection NS_SWIFT_NAME(layoutResolvedDirection); - -/** - Perform a layout calculation and update the frames of the views in the hierarchy with the results - */ -- (void)yk_applyLayout NS_SWIFT_NAME(applyLayout()); - -/** - Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; - */ -@property (nonatomic, readonly) CGSize yk_intrinsicSize NS_SWIFT_NAME(layoutIntrinsicSize); - -/** - Returns the number of children that are using Flexbox. - */ -@property (nonatomic, readonly) NSUInteger yk_numberOfChildren NS_SWIFT_NAME(layoutNumberOfChildren); +@property (nonatomic, readonly) YKLayout* layout; @end diff --git a/YogaKit/UIView+YogaKit.m b/YogaKit/UIView+YogaKit.m index e56e7689..a5221310 100644 --- a/YogaKit/UIView+YogaKit.m +++ b/YogaKit/UIView+YogaKit.m @@ -7,478 +7,22 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import -#import +#import +#import #import -@interface YGNodeBridge : NSObject -@property (nonatomic, assign, readonly) YGNodeRef cnode; -@end - -@implementation YGNodeBridge - -+ (void)initialize -{ - YGSetExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis, true); -} - -- (instancetype)init -{ - if ([super init]) { - _cnode = YGNodeNew(); - } - - return self; -} - -- (void)dealloc -{ - YGNodeFree(_cnode); -} -@end - @implementation UIView (YogaKit) -- (BOOL)yk_usesYoga +- (YKLayout *)layout { - NSNumber *usesYoga = objc_getAssociatedObject(self, @selector(yk_usesYoga)); - return [usesYoga boolValue]; -} - -- (BOOL)yk_includeInLayout -{ - NSNumber *includeInLayout = objc_getAssociatedObject(self, @selector(yk_includeInLayout)); - return (includeInLayout != nil) ? [includeInLayout boolValue] : YES; -} - -- (NSUInteger)yk_numberOfChildren -{ - return YGNodeGetChildCount([self ygNode]); -} - -#pragma mark - Setters - -- (void)yk_setIncludeInLayout:(BOOL)includeInLayout -{ - objc_setAssociatedObject( - self, - @selector(yk_includeInLayout), - @(includeInLayout), - OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (void)yk_setUsesYoga:(BOOL)enabled -{ - objc_setAssociatedObject( - self, - @selector(yk_usesYoga), - @(enabled), - OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (YKDirection)yk_direction -{ - return (YKDirection)YGNodeStyleGetDirection([self ygNode]); -} - -- (void)yk_setDirection:(YKDirection)direction -{ - YGNodeStyleSetDirection([self ygNode], (YGDirection)direction); -} - -- (YKFlexDirection)yk_flexDirection -{ - return (YKFlexDirection)YGNodeStyleGetFlexDirection([self ygNode]); -} - -- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection -{ - YGNodeStyleSetFlexDirection([self ygNode], (YGFlexDirection)flexDirection); -} - -- (YKJustify)yk_justifyContent -{ - return (YKJustify)YGNodeStyleGetJustifyContent([self ygNode]); -} - -- (void)yk_setJustifyContent:(YKJustify)justifyContent -{ - YGNodeStyleSetJustifyContent([self ygNode], (YGJustify)justifyContent); -} - -- (YKAlign)yk_alignContent -{ - return (YKAlign)YGNodeStyleGetAlignContent([self ygNode]); -} - -- (void)yk_setAlignContent:(YKAlign)alignContent -{ - YGNodeStyleSetAlignContent([self ygNode], (YGAlign)alignContent); -} - -- (YKAlign)yk_alignItems -{ - return (YKAlign)YGNodeStyleGetAlignItems([self ygNode]); -} - -- (void)yk_setAlignItems:(YKAlign)alignItems -{ - YGNodeStyleSetAlignItems([self ygNode], (YGAlign)alignItems); -} - -- (YKAlign)yk_alignSelf -{ - return (YKAlign)YGNodeStyleGetAlignSelf([self ygNode]); -} - -- (void)yk_setAlignSelf:(YKAlign)alignSelf -{ - YGNodeStyleSetAlignSelf([self ygNode], (YGAlign)alignSelf); -} - -- (YKPositionType)yk_positionType -{ - return (YKPositionType)YGNodeStyleGetPositionType([self ygNode]); -} - -- (void)yk_setPositionType:(YKPositionType)positionType -{ - YGNodeStyleSetPositionType([self ygNode], (YGPositionType)positionType); -} - -- (YKWrap)yk_flexWrap -{ - return (YKWrap)YGNodeStyleGetFlexWrap([self ygNode]); -} - -- (void)yk_setFlexWrap:(YKWrap)flexWrap -{ - YGNodeStyleSetFlexWrap([self ygNode], (YGWrap)flexWrap); -} - -- (CGFloat)yk_flexGrow -{ - return YGNodeStyleGetFlexGrow([self ygNode]); -} - -- (void)yk_setFlexGrow:(CGFloat)flexGrow -{ - YGNodeStyleSetFlexGrow([self ygNode], flexGrow); -} - -- (CGFloat)yk_flexShrink -{ - return YGNodeStyleGetFlexShrink([self ygNode]); -} - -- (void)yk_setFlexShrink:(CGFloat)flexShrink -{ - YGNodeStyleSetFlexShrink([self ygNode], flexShrink); -} - -- (CGFloat)yk_flexBasis -{ - return YGNodeStyleGetFlexBasis([self ygNode]); -} - -- (void)yk_setFlexBasis:(CGFloat)flexBasis -{ - YGNodeStyleSetFlexBasis([self ygNode], flexBasis); -} - -- (CGFloat)yk_positionForEdge:(YKEdge)edge -{ - return YGNodeStyleGetPosition([self ygNode], (YGEdge)edge); -} - -- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge -{ - YGNodeStyleSetPosition([self ygNode], (YGEdge)edge, position); -} - -- (CGFloat)yk_marginForEdge:(YKEdge)edge -{ - return YGNodeStyleGetMargin([self ygNode], (YGEdge)edge); -} - -- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge -{ - YGNodeStyleSetMargin([self ygNode], (YGEdge)edge, margin); -} - -- (CGFloat)yk_paddingForEdge:(YKEdge)edge -{ - return YGNodeStyleGetPadding([self ygNode], (YGEdge)edge); -} - -- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge -{ - YGNodeStyleSetPadding([self ygNode], (YGEdge)edge, padding); -} - -- (CGFloat)yk_width -{ - return YGNodeStyleGetWidth([self ygNode]); -} - -- (void)yk_setWidth:(CGFloat)width -{ - YGNodeStyleSetWidth([self ygNode], width); -} - -- (CGFloat)yk_height -{ - return YGNodeStyleGetHeight([self ygNode]); -} - -- (void)yk_setHeight:(CGFloat)height -{ - YGNodeStyleSetHeight([self ygNode], height); -} - -- (CGFloat)yk_minWidth -{ - return YGNodeStyleGetMinWidth([self ygNode]); -} - -- (void)yk_setMinWidth:(CGFloat)minWidth -{ - YGNodeStyleSetMinWidth([self ygNode], minWidth); -} - -- (CGFloat)yk_minHeight -{ - return YGNodeStyleGetMinHeight([self ygNode]); -} - -- (void)yk_setMinHeight:(CGFloat)minHeight -{ - YGNodeStyleSetMinHeight([self ygNode], minHeight); -} - -- (CGFloat)yk_maxWidth -{ - return YGNodeStyleGetMaxWidth([self ygNode]); -} - -- (void)yk_setMaxWidth:(CGFloat)maxWidth -{ - YGNodeStyleSetMaxWidth([self ygNode], maxWidth); -} - -- (CGFloat)yk_maxHeight -{ - return YGNodeStyleGetMaxHeight([self ygNode]); -} - -- (void)yk_setMaxHeight:(CGFloat)maxHeight -{ - YGNodeStyleSetMaxHeight([self ygNode], maxHeight); -} - -- (CGFloat)yk_aspectRatio -{ - return YGNodeStyleGetAspectRatio([self ygNode]); -} - -- (void)yk_setAspectRatio:(CGFloat)aspectRatio -{ - YGNodeStyleSetAspectRatio([self ygNode], aspectRatio); -} - -#pragma mark - Layout and Sizing - -- (YKDirection)yk_resolvedDirection -{ - return (YKDirection)YGNodeLayoutGetDirection([self ygNode]); -} - -- (void)yk_applyLayout -{ - [self calculateLayoutWithSize:self.bounds.size]; - YKApplyLayoutToViewHierarchy(self); -} - -- (CGSize)yk_intrinsicSize -{ - const CGSize constrainedSize = { - .width = YGUndefined, - .height = YGUndefined, - }; - return [self calculateLayoutWithSize:constrainedSize]; -} - -#pragma mark - Private - -- (YGNodeRef)ygNode -{ - YGNodeBridge *node = objc_getAssociatedObject(self, @selector(ygNode)); - if (!node) { - node = [YGNodeBridge new]; - YGNodeSetContext(node.cnode, (__bridge void *) self); - objc_setAssociatedObject(self, @selector(ygNode), node, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + YKLayout *layout = objc_getAssociatedObject(self, @selector(layout)); + if (!layout) { + layout = [[YKLayout alloc] initWithView:self]; + objc_setAssociatedObject(self, @selector(layout), layout, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - - return node.cnode; + + return layout; } -- (CGSize)calculateLayoutWithSize:(CGSize)size -{ - NSAssert([NSThread isMainThread], @"YG Layout calculation must be done on main."); - NSAssert([self yk_usesYoga], @"YG Layout is not enabled for this view."); - - YKAttachNodesFromViewHierachy(self); - - const YGNodeRef node = [self ygNode]; - YGNodeCalculateLayout( - node, - size.width, - size.height, - YGNodeStyleGetDirection(node)); - - return (CGSize) { - .width = YGNodeLayoutGetWidth(node), - .height = YGNodeLayoutGetHeight(node), - }; -} - -static YGSize YKMeasureView( - YGNodeRef node, - float width, - YGMeasureMode widthMode, - float height, - YGMeasureMode heightMode) -{ - const CGFloat constrainedWidth = (widthMode == YGMeasureModeUndefined) ? CGFLOAT_MAX : width; - const CGFloat constrainedHeight = (heightMode == YGMeasureModeUndefined) ? CGFLOAT_MAX: height; - - UIView *view = (__bridge UIView*) YGNodeGetContext(node); - const CGSize sizeThatFits = [view sizeThatFits:(CGSize) { - .width = constrainedWidth, - .height = constrainedHeight, - }]; - - return (YGSize) { - .width = YKSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), - .height = YKSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), - }; -} - -static CGFloat YKSanitizeMeasurement( - CGFloat constrainedSize, - CGFloat measuredSize, - YGMeasureMode measureMode) -{ - CGFloat result; - if (measureMode == YGMeasureModeExactly) { - result = constrainedSize; - } else if (measureMode == YGMeasureModeAtMost) { - result = MIN(constrainedSize, measuredSize); - } else { - result = measuredSize; - } - - return result; -} - -static void YKAttachNodesFromViewHierachy(UIView *view) { - YGNodeRef node = [view ygNode]; - - // Only leaf nodes should have a measure function - if (![view yk_usesYoga] || view.subviews.count == 0) { - YGNodeSetMeasureFunc(node, YKMeasureView); - YKRemoveAllChildren(node); - } else { - YGNodeSetMeasureFunc(node, NULL); - - // Create a list of all the subviews that we are going to use for layout. - NSMutableArray *subviewsToInclude = [[NSMutableArray alloc] initWithCapacity:view.subviews.count]; - for (UIView *subview in view.subviews) { - if ([subview yk_includeInLayout]) { - [subviewsToInclude addObject:subview]; - } - } - - BOOL shouldReconstructChildList = NO; - if (YGNodeGetChildCount(node) != subviewsToInclude.count) { - shouldReconstructChildList = YES; - } else { - for (int i = 0; i < subviewsToInclude.count; i++) { - if (YGNodeGetChild(node, i) != [subviewsToInclude[i] ygNode]) { - shouldReconstructChildList = YES; - break; - } - } - } - - if (shouldReconstructChildList) { - YKRemoveAllChildren(node); - - for (int i = 0 ; i < subviewsToInclude.count; i++) { - UIView *const subview = subviewsToInclude[i]; - YGNodeInsertChild(node, [subview ygNode], i); - YKAttachNodesFromViewHierachy(subview); - } - } - } -} - -static void YKRemoveAllChildren(const YGNodeRef node) -{ - if (node == NULL) { - return; - } - - while (YGNodeGetChildCount(node) > 0) { - YGNodeRemoveChild(node, YGNodeGetChild(node, YGNodeGetChildCount(node) - 1)); - } -} - -static CGFloat YKRoundPixelValue(CGFloat value) -{ - static CGFloat scale; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^(){ - scale = [UIScreen mainScreen].scale; - }); - - return round(value * scale) / scale; -} - -static void YKApplyLayoutToViewHierarchy(UIView *view) { - NSCAssert([NSThread isMainThread], @"Framesetting should only be done on the main thread."); - if (![view yk_includeInLayout]) { - return; - } - - YGNodeRef node = [view ygNode]; - const CGPoint topLeft = { - YGNodeLayoutGetLeft(node), - YGNodeLayoutGetTop(node), - }; - - const CGPoint bottomRight = { - topLeft.x + YGNodeLayoutGetWidth(node), - topLeft.y + YGNodeLayoutGetHeight(node), - }; - - view.frame = (CGRect) { - .origin = { - .x = YKRoundPixelValue(topLeft.x), - .y = YKRoundPixelValue(topLeft.y), - }, - .size = { - .width = YKRoundPixelValue(bottomRight.x) - YKRoundPixelValue(topLeft.x), - .height = YKRoundPixelValue(bottomRight.y) - YKRoundPixelValue(topLeft.y), - }, - }; - - const BOOL isLeaf = ![view yk_usesYoga] || view.subviews.count == 0; - if (!isLeaf) { - for (NSUInteger i = 0; i < view.subviews.count; i++) { - YKApplyLayoutToViewHierarchy(view.subviews[i]); - } - } -} @end diff --git a/YogaKit/YKEnums.h b/YogaKit/YKEnums.h index 3e684fdc..fdfb8721 100644 --- a/YogaKit/YKEnums.h +++ b/YogaKit/YKEnums.h @@ -12,24 +12,12 @@ typedef NS_ENUM(NSInteger, YKFlexDirection) { YKFlexDirectionColumnReverse, YKFlexDirectionRow, YKFlexDirectionRowReverse, -}; - -typedef NS_ENUM(NSInteger, YKEdge) { - YKEdgeLeft, - YKEdgeTop, - YKEdgeRight, - YKEdgeBottom, - YKEdgeStart, - YKEdgeEnd, - YKEdgeHorizontal, - YKEdgeVertical, - YKEdgeAll, -}; +} NS_SWIFT_NAME(FlexDirection); typedef NS_ENUM(NSInteger, YKPositionType) { YKPositionTypeRelative, YKPositionTypeAbsolute, -}; +} NS_SWIFT_NAME(PositionType); typedef NS_ENUM(NSInteger, YKJustify) { YKJustifyFlexStart, @@ -37,18 +25,18 @@ typedef NS_ENUM(NSInteger, YKJustify) { YKJustifyFlexEnd, YKJustifySpaceBetween, YKJustifySpaceAround, -}; +} NS_SWIFT_NAME(Justify); typedef NS_ENUM(NSInteger, YKDirection) { YKDirectionInherit, YKDirectionLeftToRight, YKDirectionRightToLeft, -}; +} NS_SWIFT_NAME(Direction); typedef NS_ENUM(NSInteger, YKWrap) { YKWrapNoWrap, YKWrapWrap, -}; +} NS_SWIFT_NAME(Wrap); typedef NS_ENUM(NSInteger, YKAlign) { YKAlignAuto, @@ -56,5 +44,5 @@ typedef NS_ENUM(NSInteger, YKAlign) { YKAlignCenter, YKAlignFlexEnd, YKAlignStretch, -}; +} NS_SWIFT_NAME(Align); diff --git a/YogaKit/YKLayout+Private.h b/YogaKit/YKLayout+Private.h new file mode 100644 index 00000000..c51d3ec3 --- /dev/null +++ b/YogaKit/YKLayout+Private.h @@ -0,0 +1,16 @@ +/** + * 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. + */ + +#import + +@interface YKLayout () + +- (instancetype)initWithView:(UIView*)view; + +@end diff --git a/YogaKit/YKLayout.h b/YogaKit/YKLayout.h new file mode 100644 index 00000000..15ebadc7 --- /dev/null +++ b/YogaKit/YKLayout.h @@ -0,0 +1,97 @@ +/** + * 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. + */ + +#import "YKEnums.h" + +@interface YKLayout : NSObject + +/** + The property that decides if we should include this view when calculating layout. Defaults to YES. + */ +@property (nonatomic, setter=setIncluded:) BOOL isIncluded; + +/** + The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. + */ +@property (nonatomic, setter=setEnabled:) BOOL isEnabled; + +@property (nonatomic) YKDirection direction; +@property (nonatomic) YKFlexDirection flexDirection; +@property (nonatomic) YKJustify justifyContent; +@property (nonatomic) YKAlign alignContent; +@property (nonatomic) YKAlign alignItems; +@property (nonatomic) YKAlign alignSelf; +@property (nonatomic) YKPositionType positionType; +@property (nonatomic) YKWrap flexWrap; + +@property (nonatomic) CGFloat flexGrow; +@property (nonatomic) CGFloat flexShrink; +@property (nonatomic) CGFloat flexBasis; + +@property (nonatomic) CGFloat positionLeft; +@property (nonatomic) CGFloat positionTop; +@property (nonatomic) CGFloat positionRight; +@property (nonatomic) CGFloat positionBottom; +@property (nonatomic) CGFloat positionStart; +@property (nonatomic) CGFloat positionEnd; +@property (nonatomic) CGFloat positionHorizontal; +@property (nonatomic) CGFloat positionVertical; +@property (nonatomic) CGFloat positionAll; + +@property (nonatomic) CGFloat marginLeft; +@property (nonatomic) CGFloat marginTop; +@property (nonatomic) CGFloat marginRight; +@property (nonatomic) CGFloat marginBottom; +@property (nonatomic) CGFloat marginStart; +@property (nonatomic) CGFloat marginEnd; +@property (nonatomic) CGFloat marginHorizontal; +@property (nonatomic) CGFloat marginVertical; +@property (nonatomic) CGFloat marginAll; + +@property (nonatomic) CGFloat paddingLeft; +@property (nonatomic) CGFloat paddingTop; +@property (nonatomic) CGFloat paddingRight; +@property (nonatomic) CGFloat paddingBottom; +@property (nonatomic) CGFloat paddingStart; +@property (nonatomic) CGFloat paddingEnd; +@property (nonatomic) CGFloat paddingHorizontal; +@property (nonatomic) CGFloat paddingVertical; +@property (nonatomic) CGFloat paddingAll; + +@property (nonatomic) CGFloat width; +@property (nonatomic) CGFloat height; +@property (nonatomic) CGFloat minWidth; +@property (nonatomic) CGFloat minHeight; +@property (nonatomic) CGFloat maxWidth; +@property (nonatomic) CGFloat maxHeight; + +// Yoga specific properties, not compatible with flexbox specification +@property (nonatomic) CGFloat aspectRatio; + +/** + Get the resolved direction of this node. This won't be YGDirectionInherit + */ +@property (nonatomic, readonly) YKDirection resolvedDirection; + +/** + Perform a layout calculation and update the frames of the views in the hierarchy with the results + */ +- (void)apply; + +/** + Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; + */ +@property (nonatomic, readonly) CGSize intrinsicSize; + +/** + Returns the number of children that are using Flexbox. + */ +@property (nonatomic, readonly) NSUInteger numberOfChildren; + +@end diff --git a/YogaKit/YKLayout.m b/YogaKit/YKLayout.m new file mode 100644 index 00000000..bd4b32ff --- /dev/null +++ b/YogaKit/YKLayout.m @@ -0,0 +1,294 @@ +/** + * 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. + */ + +#import +#import +#import +#import + +#define YK_STYLE_PROPERTY_IMPL(objc_type, c_type, lowercased_name, capitalized_name) \ +- (objc_type)lowercased_name \ +{ \ +return (objc_type)YGNodeStyleGet##capitalized_name(_node); \ +} \ +\ +- (void)set##capitalized_name:(objc_type)lowercased_name \ +{ \ +YGNodeStyleSet##capitalized_name(_node, (c_type)lowercased_name); \ +} + +#define _YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, edge) \ +- (CGFloat)lowercased_name##edge \ +{ \ +return YGNodeStyleGet##capitalized_name(_node, YGEdge##edge); \ +} \ +\ +- (void)set##capitalized_name##edge:(CGFloat)lowercased_name##edge \ +{ \ +YGNodeStyleSet##capitalized_name(_node, YGEdge##edge, lowercased_name##edge); \ +} + +#define YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Left) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Top) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Right) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Bottom) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Start) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, End) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Horizontal) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, Vertical) \ +_YK_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, All) + +@interface YKLayout () +@property (nonatomic, weak, readonly) UIView* view; +@property (nonatomic, assign, readonly) YGNodeRef node; +@end + +@implementation YKLayout + +@synthesize isEnabled=_isEnabled; +@synthesize isIncluded=_isIncluded; + ++ (void)initialize +{ + YGSetExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis, true); +} + +- (instancetype)initWithView:(UIView*)view +{ + if ([super init]) { + _view = view; + _node = YGNodeNew(); + YGNodeSetContext(_node, (__bridge void *) view); + _isEnabled = NO; + _isIncluded = YES; + } + + return self; +} + +- (void)dealloc +{ + YGNodeFree(_node); +} + +- (NSUInteger)numberOfChildren +{ + return YGNodeGetChildCount(_node); +} + +YK_STYLE_PROPERTY_IMPL(YKDirection, YGDirection, direction, Direction) +YK_STYLE_PROPERTY_IMPL(YKFlexDirection, YGFlexDirection, flexDirection, FlexDirection) +YK_STYLE_PROPERTY_IMPL(YKJustify, YGJustify, justifyContent, JustifyContent) +YK_STYLE_PROPERTY_IMPL(YKAlign, YGAlign, alignContent, AlignContent) +YK_STYLE_PROPERTY_IMPL(YKAlign, YGAlign, alignItems, AlignItems) +YK_STYLE_PROPERTY_IMPL(YKAlign, YGAlign, alignSelf, AlignSelf) +YK_STYLE_PROPERTY_IMPL(YKPositionType, YGPositionType, positionType, PositionType) +YK_STYLE_PROPERTY_IMPL(YKWrap, YGWrap, flexWrap, FlexWrap) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, flexGrow, FlexGrow) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, flexShrink, FlexShrink) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, flexBasis, FlexBasis) +YK_STYLE_EDGE_PROPERTY_IMPL(position, Position) +YK_STYLE_EDGE_PROPERTY_IMPL(margin, Margin) +YK_STYLE_EDGE_PROPERTY_IMPL(padding, Padding) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, width, Width) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, height, Height) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, minWidth, MinWidth) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, minHeight, MinHeight) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, maxWidth, MaxWidth) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, maxHeight, MaxHeight) +YK_STYLE_PROPERTY_IMPL(CGFloat, CGFloat, aspectRatio, AspectRatio) + +#pragma mark - Layout and Sizing + +- (YKDirection)resolvedDirection +{ + return (YKDirection)YGNodeLayoutGetDirection(_node); +} + +- (void)apply +{ + [self calculateLayoutWithSize:self.view.bounds.size]; + YKApplyLayoutToViewHierarchy(self); +} + +- (CGSize)intrinsicSize +{ + const CGSize constrainedSize = { + .width = YGUndefined, + .height = YGUndefined, + }; + return [self calculateLayoutWithSize:constrainedSize]; +} + +#pragma mark - Private + +- (CGSize)calculateLayoutWithSize:(CGSize)size +{ + NSAssert([NSThread isMainThread], @"YG Layout calculation must be done on main."); + NSAssert([self isEnabled], @"YG Layout is not enabled for this view."); + + YKAttachNodesFromViewHierachy(self); + + const YGNodeRef node = _node; + YGNodeCalculateLayout( + node, + size.width, + size.height, + YGNodeStyleGetDirection(node)); + + return (CGSize) { + .width = YGNodeLayoutGetWidth(node), + .height = YGNodeLayoutGetHeight(node), + }; +} + +static YGSize YKMeasureView( + YGNodeRef node, + float width, + YGMeasureMode widthMode, + float height, + YGMeasureMode heightMode) +{ + const CGFloat constrainedWidth = (widthMode == YGMeasureModeUndefined) ? CGFLOAT_MAX : width; + const CGFloat constrainedHeight = (heightMode == YGMeasureModeUndefined) ? CGFLOAT_MAX: height; + + UIView *view = (__bridge UIView*) YGNodeGetContext(node); + const CGSize sizeThatFits = [view sizeThatFits:(CGSize) { + .width = constrainedWidth, + .height = constrainedHeight, + }]; + + return (YGSize) { + .width = YKSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), + .height = YKSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), + }; +} + +static CGFloat YKSanitizeMeasurement( + CGFloat constrainedSize, + CGFloat measuredSize, + YGMeasureMode measureMode) +{ + CGFloat result; + if (measureMode == YGMeasureModeExactly) { + result = constrainedSize; + } else if (measureMode == YGMeasureModeAtMost) { + result = MIN(constrainedSize, measuredSize); + } else { + result = measuredSize; + } + + return result; +} + +static void YKAttachNodesFromViewHierachy(YKLayout *layout) { + YGNodeRef node = layout.node; + UIView *view = layout.view; + + // Only leaf nodes should have a measure function + if (![layout isEnabled] || view.subviews.count == 0) { + YGNodeSetMeasureFunc(node, YKMeasureView); + YKRemoveAllChildren(node); + } else { + YGNodeSetMeasureFunc(node, NULL); + + // Create a list of all the subviews that we are going to use for layout. + NSMutableArray *subviewsToInclude = [[NSMutableArray alloc] initWithCapacity:view.subviews.count]; + for (UIView *subview in view.subviews) { + if (subview.layout.isIncluded) { + [subviewsToInclude addObject:subview]; + } + } + + BOOL shouldReconstructChildList = NO; + if (YGNodeGetChildCount(node) != subviewsToInclude.count) { + shouldReconstructChildList = YES; + } else { + for (int i = 0; i < subviewsToInclude.count; i++) { + if (YGNodeGetChild(node, i) != subviewsToInclude[i].layout.node) { + shouldReconstructChildList = YES; + break; + } + } + } + + if (shouldReconstructChildList) { + YKRemoveAllChildren(node); + + for (int i = 0 ; i < subviewsToInclude.count; i++) { + UIView *const subview = subviewsToInclude[i]; + YGNodeInsertChild(node, subview.layout.node, i); + YKAttachNodesFromViewHierachy(subview.layout); + } + } + } +} + +static void YKRemoveAllChildren(const YGNodeRef node) +{ + if (node == NULL) { + return; + } + + while (YGNodeGetChildCount(node) > 0) { + YGNodeRemoveChild(node, YGNodeGetChild(node, YGNodeGetChildCount(node) - 1)); + } +} + +static CGFloat YKRoundPixelValue(CGFloat value) +{ + static CGFloat scale; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^(){ + scale = [UIScreen mainScreen].scale; + }); + + return round(value * scale) / scale; +} + +static void YKApplyLayoutToViewHierarchy(YKLayout *layout) { + NSCAssert([NSThread isMainThread], @"Framesetting should only be done on the main thread."); + + if (!layout.isIncluded) { + return; + } + + YGNodeRef node = layout.node; + const CGPoint topLeft = { + YGNodeLayoutGetLeft(node), + YGNodeLayoutGetTop(node), + }; + + const CGPoint bottomRight = { + topLeft.x + YGNodeLayoutGetWidth(node), + topLeft.y + YGNodeLayoutGetHeight(node), + }; + + UIView *view = layout.view; + view.frame = (CGRect) { + .origin = { + .x = YKRoundPixelValue(topLeft.x), + .y = YKRoundPixelValue(topLeft.y), + }, + .size = { + .width = YKRoundPixelValue(bottomRight.x) - YKRoundPixelValue(topLeft.x), + .height = YKRoundPixelValue(bottomRight.y) - YKRoundPixelValue(topLeft.y), + }, + }; + + const BOOL isLeaf = !layout.isEnabled || view.subviews.count == 0; + if (!isLeaf) { + for (NSUInteger i = 0; i < view.subviews.count; i++) { + YKApplyLayoutToViewHierarchy(view.subviews[i].layout); + } + } +} + +@end diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj index a3eb674e..ae667b6f 100644 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj @@ -25,6 +25,9 @@ 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE08521E06F3D100EE5F9A /* YKEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; 63EE08551E072EF800EE5F9A /* SwiftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EE08541E072EF800EE5F9A /* SwiftViewController.swift */; }; + 63EE08571E07590C00EE5F9A /* YKLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 63EE08561E07590C00EE5F9A /* YKLayout.m */; }; + 63EE08591E07598A00EE5F9A /* YKLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE08581E07591A00EE5F9A /* YKLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE085B1E075B0B00EE5F9A /* YKLayout+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE085A1E075AAA00EE5F9A /* YKLayout+Private.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,6 +77,9 @@ 63EE08401E06ED3D00EE5F9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63EE08521E06F3D100EE5F9A /* YKEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YKEnums.h; path = ../../YKEnums.h; sourceTree = ""; }; 63EE08541E072EF800EE5F9A /* SwiftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftViewController.swift; sourceTree = ""; }; + 63EE08561E07590C00EE5F9A /* YKLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = YKLayout.m; path = ../../YKLayout.m; sourceTree = ""; }; + 63EE08581E07591A00EE5F9A /* YKLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = YKLayout.h; path = ../../YKLayout.h; sourceTree = ""; }; + 63EE085A1E075AAA00EE5F9A /* YKLayout+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "YKLayout+Private.h"; path = "../../YKLayout+Private.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -169,6 +175,9 @@ 63EE08521E06F3D100EE5F9A /* YKEnums.h */, 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */, 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */, + 63EE08581E07591A00EE5F9A /* YKLayout.h */, + 63EE085A1E075AAA00EE5F9A /* YKLayout+Private.h */, + 63EE08561E07590C00EE5F9A /* YKLayout.m */, 63EE08401E06ED3D00EE5F9A /* Info.plist */, ); path = YogaKit; @@ -181,6 +190,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 63EE085B1E075B0B00EE5F9A /* YKLayout+Private.h in Headers */, + 63EE08591E07598A00EE5F9A /* YKLayout.h in Headers */, 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */, 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */, 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */, @@ -306,6 +317,7 @@ 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */, 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */, 63EE084C1E06EEB700EE5F9A /* UIView+YogaKit.m in Sources */, + 63EE08571E07590C00EE5F9A /* YKLayout.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index b9c1ca19bf172ab3d32b354f7ab67f6ec17cd296..f71eca1f940daa91844f18bc12a3bfac99a8171f 100644 GIT binary patch literal 33058 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 Gr2hwT2AORD delta 15283 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 Y1%sL{t|{`?dDA~(sN=i&|AN8)52r_CF#rGn diff --git a/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift b/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift index 40c032ef..60e6c3d2 100644 --- a/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift +++ b/YogaKit/YogaKit/YogaKitSample/SwiftViewController.swift @@ -13,17 +13,17 @@ class SwiftViewController : UIViewController { override func viewDidLoad() { let root = view! root.backgroundColor = .red - root.usesYoga = true - root.layoutWidth = view.bounds.size.width - root.layoutHeight = view.bounds.size.height - root.layoutAlignItems = .center - root.layoutJustifyContent = .center + root.layout.isEnabled = true + root.layout.width = view.bounds.size.width + root.layout.height = view.bounds.size.height + root.layout.alignItems = .center + root.layout.justifyContent = .center let child1 = UIView() child1.backgroundColor = .blue - child1.usesYoga = true - child1.layoutWidth = 100 - child1.layoutHeight = 100 + child1.layout.isEnabled = true + child1.layout.width = 100 + child1.layout.height = 100 let child2 = UIView() child2.backgroundColor = .green @@ -36,6 +36,6 @@ class SwiftViewController : UIViewController { child2.addSubview(child3) root.addSubview(child1) root.addSubview(child2) - root.applyLayout() + root.layout.apply() } } diff --git a/YogaKit/YogaKit/YogaKitSample/ViewController.m b/YogaKit/YogaKit/YogaKitSample/ViewController.m index 40ab77b0..02e565ee 100644 --- a/YogaKit/YogaKit/YogaKitSample/ViewController.m +++ b/YogaKit/YogaKit/YogaKitSample/ViewController.m @@ -19,17 +19,17 @@ { UIView *root = self.view; root.backgroundColor = [UIColor redColor]; - [root yk_setUsesYoga:YES]; - [root yk_setWidth:self.view.bounds.size.width]; - [root yk_setHeight:self.view.bounds.size.height]; - [root yk_setAlignItems:YKAlignCenter]; - [root yk_setJustifyContent:YKJustifyCenter]; + root.layout.isEnabled = YES; + root.layout.width = self.view.bounds.size.width; + root.layout.height = self.view.bounds.size.height; + root.layout.alignItems = YKAlignCenter; + root.layout.justifyContent = YKJustifyCenter; UIView *child1 = [UIView new]; child1.backgroundColor = [UIColor blueColor]; - [child1 yk_setUsesYoga:YES]; - [child1 yk_setWidth:100]; - [child1 yk_setHeight:100]; + child1.layout.isEnabled = YES; + child1.layout.width = 100; + child1.layout.height = 100; UIView *child2 = [UIView new]; child2.backgroundColor = [UIColor greenColor]; @@ -52,7 +52,7 @@ [child2 addSubview:child3]; [root addSubview:child1]; [root addSubview:child2]; - [root yk_applyLayout]; + [root.layout apply]; } diff --git a/enums.py b/enums.py index 2a3c7c01..8584f81c 100644 --- a/enums.py +++ b/enums.py @@ -95,6 +95,7 @@ OBJC_ENUMS = { 'LeftToRight', 'RightToLeft', ], + 'Edge': None, 'MeasureMode': None, 'PrintOptions': None, 'Dimension': None, @@ -215,5 +216,5 @@ with open(root + '/YogaKit/YKEnums.h', 'w') as f: f.write(' YK%s%s = %d,\n' % (name, value[0], value[1])) else: f.write(' YK%s%s,\n' % (name, value)) - f.write('};\n') + f.write('} NS_SWIFT_NAME(%s);\n' % name) f.write('\n') -- 2.50.1.windows.1 From 7158fc24a3c50ef89dd849ec591c22a174035f42 Mon Sep 17 00:00:00 2001 From: David Hart Date: Mon, 19 Dec 2016 19:53:08 +0100 Subject: [PATCH 7/7] removed userdata file --- .../UserInterfaceState.xcuserstate | Bin 33058 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f71eca1f940daa91844f18bc12a3bfac99a8171f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33058 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 Gr2hwT2AORD -- 2.50.1.windows.1