├── .gitignore ├── .swift-version ├── .travis.yml ├── CONTRIBUTING.md ├── Cartfile ├── Example └── UserInterfaceDemo │ ├── Podfile │ ├── Podfile.lock │ ├── UserInterfaceDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── UserInterfaceDemo.xcscheme │ ├── UserInterfaceDemo.xcworkspace │ └── contents.xcworkspacedata │ └── UserInterfaceDemo │ ├── Base.lproj │ └── LaunchScreen.storyboard │ ├── Info.plist │ ├── Resources │ └── Assets.xcassets │ │ └── AppIcon.appiconset │ │ └── Contents.json │ └── Sources │ ├── AppDelegate.swift │ └── ViewController.swift ├── Images └── UserInterface-icon.png ├── Info ├── Info-iOS.plist ├── Info-macOS.plist ├── Info-tvOS.plist └── Info-watchOS.plist ├── LICENSE.md ├── Playground-iOS.playground ├── Contents.swift ├── contents.xcplayground └── timeline.xctimeline ├── Playground-macOS.playground ├── Contents.swift ├── contents.xcplayground └── timeline.xctimeline ├── README.md ├── Source ├── Shared │ ├── .gitkeep │ ├── Extensions │ │ ├── NSLayoutConstraint+Extensions.swift │ │ └── View+Extensions.swift │ ├── Structs │ │ └── Shadow.swift │ └── TypeAlias │ │ └── TypeAlias.swift ├── iOS+tvOS │ ├── .gitkeep │ └── Extensions │ │ ├── NSLayoutConstraints+iOS.swift │ │ ├── UIButton+Extensions.swift │ │ ├── UICollectionView+Extensions.swift │ │ ├── UICollectionViewCell+Extensions.swift │ │ ├── UIImageView+Extensions.swift │ │ ├── UILabel+Extensions.swift │ │ ├── UIStackView+Extensions.swift │ │ ├── UITableView+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ ├── UITextField+Extensions.swift │ │ └── UIView+Extensions.swift ├── macOS │ ├── .gitkeep │ ├── Classes │ │ ├── UserInterfaceItem.swift │ │ ├── UserInterfaceLabel.swift │ │ └── UserInterfaceView.swift │ └── Extensions │ │ ├── NSCollectionView+Extensions.swift │ │ ├── NSCollectionViewItem+Extensions.swift │ │ ├── NSStackView+Extensions.swift │ │ ├── NSTableRowView+Extensions.swift │ │ └── NSTableView+Extensions.swift └── watchOS │ └── .gitkeep ├── Tests ├── Info-iOS-Tests.plist ├── Info-macOS-Tests.plist ├── Info-tvOS-Tests.plist ├── Shared │ └── SharedTests.swift ├── iOS+tvOS │ ├── NSLayoutConstraintsTests.swift │ ├── UIButtonTests.swift │ ├── UICollectionViewTests.swift │ ├── UIImageViewTests.swift │ ├── UILabelTests.swift │ ├── UIStackViewTests.swift │ ├── UITableViewTests.swift │ └── UIViewTests.swift └── macOS │ ├── NSCollectionViewTests.swift │ ├── NSLayoutConstraintsTests.swift │ ├── NSStackViewViewTests.swift │ ├── NSTableViewTests.swift │ └── NSViewTests.swift ├── UserInterface.podspec ├── UserInterface.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── UserInterface-iOS.xcscheme │ ├── UserInterface-macOS.xcscheme │ ├── UserInterface-tvOS.xcscheme │ └── UserInterface-watchOS.xcscheme ├── bin ├── bootstrap └── bootstrap-if-needed └── circle.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | Icon 6 | ._* 7 | .Spotlight-V100 8 | .Trashes 9 | 10 | # Xcode 11 | # 12 | build/ 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata 22 | *.xccheckout 23 | *.moved-aside 24 | DerivedData 25 | *.hmap 26 | *.ipa 27 | *.xcuserstate 28 | 29 | # CocoaPods 30 | Pods 31 | 32 | # Carthage 33 | Carthage 34 | 35 | # SPM 36 | .build/ 37 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.2 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode10 2 | language: objective-c 3 | 4 | script: 5 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-macOS" -sdk macosx clean build | xcpretty 6 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-macOS" -sdk macosx -enableCodeCoverage YES test | xcpretty 7 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-iOS" -sdk iphonesimulator -destination name="iPhone 8" clean build | xcpretty 8 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-iOS" -sdk iphonesimulator -destination name="iPhone 8" -enableCodeCoverage YES test | xcpretty 9 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-tvOS" -destination 'platform=tvOS Simulator,name=Apple TV,OS=11.4' clean build | xcpretty 10 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-tvOS" -destination 'platform=tvOS Simulator,name=Apple TV,OS=11.4' -enableCodeCoverage YES test | xcpretty 11 | 12 | after_success: 13 | - bash <(curl -s https://codecov.io/bash) 14 | 15 | notifications: 16 | email: false 17 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | GitHub Issues is for reporting bugs, discussing features and general feedback in **UserInterface**. Be sure to check our [documentation](http://cocoadocs.org/docsets/UserInterface), [FAQ](https://github.com/zenangst/UserInterface/wiki/FAQ) and [past issues](https://github.com/zenangst/UserInterface/issues?state=closed) before opening any new issues. 2 | 3 | If you are posting about a crash in your application, a stack trace is helpful, but additional context, in the form of code and explanation, is necessary to be of any use. 4 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | # https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#example-cartfile -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '9.0' 4 | 5 | target 'UserInterfaceDemo' do 6 | pod 'UserInterface', path: '../../' 7 | end 8 | 9 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - UserInterface (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - UserInterface (from `../../`) 6 | 7 | EXTERNAL SOURCES: 8 | UserInterface: 9 | :path: "../../" 10 | 11 | SPEC CHECKSUMS: 12 | UserInterface: de0e1fa7d730d30e4edb6c7f6b6f72f95b210c82 13 | 14 | PODFILE CHECKSUM: 51ed765bc6f1315e658ac9c1af39c9a5cb562e70 15 | 16 | COCOAPODS: 1.5.0 17 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */; }; 11 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */; }; 12 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */; }; 13 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */; }; 14 | EC030DCF7F0BA591234A6571 /* Pods_UserInterfaceDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23C3F11D902C54A1579DAD56 /* Pods_UserInterfaceDemo.framework */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 23C3F11D902C54A1579DAD56 /* Pods_UserInterfaceDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_UserInterfaceDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | 7268314F1AB084CE3DF7302E /* Pods-UserInterfaceDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UserInterfaceDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-UserInterfaceDemo/Pods-UserInterfaceDemo.release.xcconfig"; sourceTree = ""; }; 20 | D5C7F7401C3BC9CE008CDDBA /* UserInterfaceDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UserInterfaceDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | D5C7F74D1C3BC9CE008CDDBA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 22 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 24 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 25 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 26 | F764BDDCE295029D594C94C6 /* Pods-UserInterfaceDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UserInterfaceDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-UserInterfaceDemo/Pods-UserInterfaceDemo.debug.xcconfig"; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | EC030DCF7F0BA591234A6571 /* Pods_UserInterfaceDemo.framework in Frameworks */, 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 1538A6432DBA29DE3E47C07E /* Pods */ = { 42 | isa = PBXGroup; 43 | children = ( 44 | F764BDDCE295029D594C94C6 /* Pods-UserInterfaceDemo.debug.xcconfig */, 45 | 7268314F1AB084CE3DF7302E /* Pods-UserInterfaceDemo.release.xcconfig */, 46 | ); 47 | name = Pods; 48 | sourceTree = ""; 49 | }; 50 | 3C2E4A8F85EBA182E277A2A2 /* Frameworks */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 23C3F11D902C54A1579DAD56 /* Pods_UserInterfaceDemo.framework */, 54 | ); 55 | name = Frameworks; 56 | sourceTree = ""; 57 | }; 58 | D5C7F7371C3BC9CE008CDDBA = { 59 | isa = PBXGroup; 60 | children = ( 61 | D5C7F7421C3BC9CE008CDDBA /* UserInterfaceDemo */, 62 | D5C7F7411C3BC9CE008CDDBA /* Products */, 63 | 1538A6432DBA29DE3E47C07E /* Pods */, 64 | 3C2E4A8F85EBA182E277A2A2 /* Frameworks */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | D5C7F7411C3BC9CE008CDDBA /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | D5C7F7401C3BC9CE008CDDBA /* UserInterfaceDemo.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | D5C7F7421C3BC9CE008CDDBA /* UserInterfaceDemo */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | D5C7F7561C3BCA1E008CDDBA /* Resources */, 80 | D5C7F7581C3BCA1E008CDDBA /* Sources */, 81 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */, 82 | ); 83 | path = UserInterfaceDemo; 84 | sourceTree = ""; 85 | }; 86 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */, 90 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */, 91 | ); 92 | name = "Supporting Files"; 93 | sourceTree = ""; 94 | }; 95 | D5C7F7561C3BCA1E008CDDBA /* Resources */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */, 99 | ); 100 | path = Resources; 101 | sourceTree = ""; 102 | }; 103 | D5C7F7581C3BCA1E008CDDBA /* Sources */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */, 107 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */, 108 | ); 109 | path = Sources; 110 | sourceTree = ""; 111 | }; 112 | /* End PBXGroup section */ 113 | 114 | /* Begin PBXNativeTarget section */ 115 | D5C7F73F1C3BC9CE008CDDBA /* UserInterfaceDemo */ = { 116 | isa = PBXNativeTarget; 117 | buildConfigurationList = D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "UserInterfaceDemo" */; 118 | buildPhases = ( 119 | 88ECC64725A21F267FB1A8CA /* [CP] Check Pods Manifest.lock */, 120 | D5C7F73C1C3BC9CE008CDDBA /* Sources */, 121 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */, 122 | D5C7F73E1C3BC9CE008CDDBA /* Resources */, 123 | ); 124 | buildRules = ( 125 | ); 126 | dependencies = ( 127 | ); 128 | name = UserInterfaceDemo; 129 | productName = UserInterfaceDemo; 130 | productReference = D5C7F7401C3BC9CE008CDDBA /* UserInterfaceDemo.app */; 131 | productType = "com.apple.product-type.application"; 132 | }; 133 | /* End PBXNativeTarget section */ 134 | 135 | /* Begin PBXProject section */ 136 | D5C7F7381C3BC9CE008CDDBA /* Project object */ = { 137 | isa = PBXProject; 138 | attributes = { 139 | LastSwiftUpdateCheck = 0720; 140 | LastUpgradeCheck = 0900; 141 | ORGANIZATIONNAME = "Hyper Interaktiv AS"; 142 | TargetAttributes = { 143 | D5C7F73F1C3BC9CE008CDDBA = { 144 | CreatedOnToolsVersion = 7.2; 145 | LastSwiftMigration = 0800; 146 | }; 147 | }; 148 | }; 149 | buildConfigurationList = D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "UserInterfaceDemo" */; 150 | compatibilityVersion = "Xcode 3.2"; 151 | developmentRegion = English; 152 | hasScannedForEncodings = 0; 153 | knownRegions = ( 154 | en, 155 | Base, 156 | ); 157 | mainGroup = D5C7F7371C3BC9CE008CDDBA; 158 | productRefGroup = D5C7F7411C3BC9CE008CDDBA /* Products */; 159 | projectDirPath = ""; 160 | projectRoot = ""; 161 | targets = ( 162 | D5C7F73F1C3BC9CE008CDDBA /* UserInterfaceDemo */, 163 | ); 164 | }; 165 | /* End PBXProject section */ 166 | 167 | /* Begin PBXResourcesBuildPhase section */ 168 | D5C7F73E1C3BC9CE008CDDBA /* Resources */ = { 169 | isa = PBXResourcesBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */, 173 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */, 174 | ); 175 | runOnlyForDeploymentPostprocessing = 0; 176 | }; 177 | /* End PBXResourcesBuildPhase section */ 178 | 179 | /* Begin PBXShellScriptBuildPhase section */ 180 | 88ECC64725A21F267FB1A8CA /* [CP] Check Pods Manifest.lock */ = { 181 | isa = PBXShellScriptBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | ); 185 | inputPaths = ( 186 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 187 | "${PODS_ROOT}/Manifest.lock", 188 | ); 189 | name = "[CP] Check Pods Manifest.lock"; 190 | outputPaths = ( 191 | "$(DERIVED_FILE_DIR)/Pods-UserInterfaceDemo-checkManifestLockResult.txt", 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | shellPath = /bin/sh; 195 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 196 | showEnvVarsInLog = 0; 197 | }; 198 | /* End PBXShellScriptBuildPhase section */ 199 | 200 | /* Begin PBXSourcesBuildPhase section */ 201 | D5C7F73C1C3BC9CE008CDDBA /* Sources */ = { 202 | isa = PBXSourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */, 206 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | /* End PBXSourcesBuildPhase section */ 211 | 212 | /* Begin PBXVariantGroup section */ 213 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */ = { 214 | isa = PBXVariantGroup; 215 | children = ( 216 | D5C7F74D1C3BC9CE008CDDBA /* Base */, 217 | ); 218 | name = LaunchScreen.storyboard; 219 | sourceTree = ""; 220 | }; 221 | /* End PBXVariantGroup section */ 222 | 223 | /* Begin XCBuildConfiguration section */ 224 | D5C7F7501C3BC9CE008CDDBA /* Debug */ = { 225 | isa = XCBuildConfiguration; 226 | buildSettings = { 227 | ALWAYS_SEARCH_USER_PATHS = NO; 228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 229 | CLANG_CXX_LIBRARY = "libc++"; 230 | CLANG_ENABLE_MODULES = YES; 231 | CLANG_ENABLE_OBJC_ARC = YES; 232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 233 | CLANG_WARN_BOOL_CONVERSION = YES; 234 | CLANG_WARN_COMMA = YES; 235 | CLANG_WARN_CONSTANT_CONVERSION = YES; 236 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 237 | CLANG_WARN_EMPTY_BODY = YES; 238 | CLANG_WARN_ENUM_CONVERSION = YES; 239 | CLANG_WARN_INFINITE_RECURSION = YES; 240 | CLANG_WARN_INT_CONVERSION = YES; 241 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 242 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 244 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 245 | CLANG_WARN_STRICT_PROTOTYPES = YES; 246 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 247 | CLANG_WARN_UNREACHABLE_CODE = YES; 248 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 249 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 250 | COPY_PHASE_STRIP = NO; 251 | DEBUG_INFORMATION_FORMAT = dwarf; 252 | ENABLE_STRICT_OBJC_MSGSEND = YES; 253 | ENABLE_TESTABILITY = YES; 254 | GCC_C_LANGUAGE_STANDARD = gnu99; 255 | GCC_DYNAMIC_NO_PIC = NO; 256 | GCC_NO_COMMON_BLOCKS = YES; 257 | GCC_OPTIMIZATION_LEVEL = 0; 258 | GCC_PREPROCESSOR_DEFINITIONS = ( 259 | "DEBUG=1", 260 | "$(inherited)", 261 | ); 262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 263 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 264 | GCC_WARN_UNDECLARED_SELECTOR = YES; 265 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 266 | GCC_WARN_UNUSED_FUNCTION = YES; 267 | GCC_WARN_UNUSED_VARIABLE = YES; 268 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 269 | MTL_ENABLE_DEBUG_INFO = YES; 270 | ONLY_ACTIVE_ARCH = YES; 271 | SDKROOT = iphoneos; 272 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 273 | SWIFT_VERSION = 4.0; 274 | }; 275 | name = Debug; 276 | }; 277 | D5C7F7511C3BC9CE008CDDBA /* Release */ = { 278 | isa = XCBuildConfiguration; 279 | buildSettings = { 280 | ALWAYS_SEARCH_USER_PATHS = NO; 281 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 282 | CLANG_CXX_LIBRARY = "libc++"; 283 | CLANG_ENABLE_MODULES = YES; 284 | CLANG_ENABLE_OBJC_ARC = YES; 285 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 286 | CLANG_WARN_BOOL_CONVERSION = YES; 287 | CLANG_WARN_COMMA = YES; 288 | CLANG_WARN_CONSTANT_CONVERSION = YES; 289 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 290 | CLANG_WARN_EMPTY_BODY = YES; 291 | CLANG_WARN_ENUM_CONVERSION = YES; 292 | CLANG_WARN_INFINITE_RECURSION = YES; 293 | CLANG_WARN_INT_CONVERSION = YES; 294 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 295 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 297 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 298 | CLANG_WARN_STRICT_PROTOTYPES = YES; 299 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 300 | CLANG_WARN_UNREACHABLE_CODE = YES; 301 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 302 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 303 | COPY_PHASE_STRIP = NO; 304 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 305 | ENABLE_NS_ASSERTIONS = NO; 306 | ENABLE_STRICT_OBJC_MSGSEND = YES; 307 | GCC_C_LANGUAGE_STANDARD = gnu99; 308 | GCC_NO_COMMON_BLOCKS = YES; 309 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 311 | GCC_WARN_UNDECLARED_SELECTOR = YES; 312 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 313 | GCC_WARN_UNUSED_FUNCTION = YES; 314 | GCC_WARN_UNUSED_VARIABLE = YES; 315 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 316 | MTL_ENABLE_DEBUG_INFO = NO; 317 | SDKROOT = iphoneos; 318 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 319 | SWIFT_VERSION = 4.0; 320 | VALIDATE_PRODUCT = YES; 321 | }; 322 | name = Release; 323 | }; 324 | D5C7F7531C3BC9CE008CDDBA /* Debug */ = { 325 | isa = XCBuildConfiguration; 326 | baseConfigurationReference = F764BDDCE295029D594C94C6 /* Pods-UserInterfaceDemo.debug.xcconfig */; 327 | buildSettings = { 328 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 329 | INFOPLIST_FILE = UserInterfaceDemo/Info.plist; 330 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 331 | PRODUCT_BUNDLE_IDENTIFIER = com.zenangst.UserInterfaceDemo; 332 | PRODUCT_NAME = "$(TARGET_NAME)"; 333 | }; 334 | name = Debug; 335 | }; 336 | D5C7F7541C3BC9CE008CDDBA /* Release */ = { 337 | isa = XCBuildConfiguration; 338 | baseConfigurationReference = 7268314F1AB084CE3DF7302E /* Pods-UserInterfaceDemo.release.xcconfig */; 339 | buildSettings = { 340 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 341 | INFOPLIST_FILE = UserInterfaceDemo/Info.plist; 342 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 343 | PRODUCT_BUNDLE_IDENTIFIER = com.zenangst.UserInterfaceDemo; 344 | PRODUCT_NAME = "$(TARGET_NAME)"; 345 | }; 346 | name = Release; 347 | }; 348 | /* End XCBuildConfiguration section */ 349 | 350 | /* Begin XCConfigurationList section */ 351 | D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "UserInterfaceDemo" */ = { 352 | isa = XCConfigurationList; 353 | buildConfigurations = ( 354 | D5C7F7501C3BC9CE008CDDBA /* Debug */, 355 | D5C7F7511C3BC9CE008CDDBA /* Release */, 356 | ); 357 | defaultConfigurationIsVisible = 0; 358 | defaultConfigurationName = Release; 359 | }; 360 | D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "UserInterfaceDemo" */ = { 361 | isa = XCConfigurationList; 362 | buildConfigurations = ( 363 | D5C7F7531C3BC9CE008CDDBA /* Debug */, 364 | D5C7F7541C3BC9CE008CDDBA /* Release */, 365 | ); 366 | defaultConfigurationIsVisible = 0; 367 | defaultConfigurationName = Release; 368 | }; 369 | /* End XCConfigurationList section */ 370 | }; 371 | rootObject = D5C7F7381C3BC9CE008CDDBA /* Project object */; 372 | } 373 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo.xcodeproj/xcshareddata/xcschemes/UserInterfaceDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import UserInterface 3 | 4 | @UIApplicationMain 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | 7 | var window: UIWindow? 8 | 9 | lazy var navigationController: UINavigationController = { [unowned self] in 10 | let controller = UINavigationController(rootViewController: self.viewController) 11 | return controller 12 | }() 13 | 14 | lazy var viewController: ViewController = { 15 | let controller = ViewController() 16 | return controller 17 | }() 18 | 19 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 20 | window = UIWindow(frame: UIScreen.main.bounds) 21 | window?.rootViewController = navigationController 22 | window?.makeKeyAndVisible() 23 | 24 | return true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Example/UserInterfaceDemo/UserInterfaceDemo/Sources/ViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import UserInterface 3 | 4 | class ViewController: UIViewController { 5 | 6 | override func viewDidLoad() { 7 | super.viewDidLoad() 8 | view.backgroundColor = UIColor.white 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /Images/UserInterface-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zenangst/UserInterface/79811947c669824739a3c7e189e5040a07f339d4/Images/UserInterface-icon.png -------------------------------------------------------------------------------- /Info/Info-iOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2018 Christoffer Winterkvist. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Info/Info-macOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2018 Christoffer Winterkvist. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Info/Info-tvOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2018 Christoffer Winterkvist. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Info/Info-watchOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2018 Christoffer Winterkvist. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Licensed under the **MIT** license 2 | 3 | > Copyright (c) 2015 Christoffer Winterkvist 4 | > 5 | > Permission is hereby granted, free of charge, to any person obtaining 6 | > a copy of this software and associated documentation files (the 7 | > "Software"), to deal in the Software without restriction, including 8 | > without limitation the rights to use, copy, modify, merge, publish, 9 | > distribute, sublicense, and/or sell copies of the Software, and to 10 | > permit persons to whom the Software is furnished to do so, subject to 11 | > the following conditions: 12 | > 13 | > The above copyright notice and this permission notice shall be 14 | > included in all copies or substantial portions of the Software. 15 | > 16 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Playground-iOS.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | // UserInterface iOS Playground 2 | 3 | import UIKit 4 | import UserInterface 5 | 6 | var str = "Hello, playground" 7 | -------------------------------------------------------------------------------- /Playground-iOS.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Playground-iOS.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Playground-macOS.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | // UserInterface Mac Playground 2 | 3 | import Cocoa 4 | import UserInterface 5 | 6 | var str = "Hello, playground" 7 | -------------------------------------------------------------------------------- /Playground-macOS.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Playground-macOS.playground/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UserInterface 2 | 3 | [![CI Status](https://travis-ci.org/zenangst/UserInterface.svg?branch=master)](https://travis-ci.org/zenangst/UserInterface) 4 | [![Version](https://img.shields.io/cocoapods/v/UserInterface.svg?style=flat)](http://cocoadocs.org/docsets/UserInterface) 5 | [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 6 | [![License](https://img.shields.io/cocoapods/l/UserInterface.svg?style=flat)](http://cocoadocs.org/docsets/UserInterface) 7 | [![Platform](https://img.shields.io/cocoapods/p/UserInterface.svg?style=flat)](http://cocoadocs.org/docsets/UserInterface) 8 | ![Swift](https://img.shields.io/badge/%20in-swift%204.0-orange.svg) 9 | 10 | ## Description 11 | 12 | UserInterface Icon 13 | 14 | **UserInteface** is a collection of convenience extensions specifically tailored to building user interfaces in Swift. It acts as your faithful sidekick boosting your superpowers up to eleven. It covers things like registering cells on your reusable components, setting up constraints without reinventing the wheel and making stack views easier to build and maintain when building them in code. 15 | The framework does not aim to solve everything, it aims to fix the most common hurdles based on personal experience. 16 | 17 | ## Features 18 | 19 | - [x] 🍭Packed with goodies for table & collection views. 20 | - [x] 🏎Write less and do more. 21 | - [x] 📐Tamed constraints without reinventing the wheel. 22 | - [x] 📱iOS support. 23 | - [x] 💻macOS support. 24 | - [x] 📺tvOS support. 25 | 26 | ## Usage 27 | 28 | The methods described below use `UITableView` as the example, it works the same way for `UICollectionView`'s. 29 | It has some additional properties for collection view layouts. To make life even easier, the methods also have macOS 30 | equivalent so that you don't need to context switch when writing macOS code. 31 | 32 | ### Setting up and registering cells on reusable components 33 | ```swift 34 | import UserInterface 35 | let dataSource = DataSource() 36 | let tableView = UITableView(dataSource: dataSource, register: Cell.self) 37 | ``` 38 | ### Dequeuing cells in your data source 39 | ```swift 40 | import UserInterface 41 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 42 | let model = model(at: indexPath) // Retrieves the model from an array. 43 | return tableView.dequeue(Cell.self, with: model(at: indexPath), for: indexPath) { view, model in 44 | view.textLabel?.text = model.name 45 | } 46 | } 47 | ``` 48 | 49 | ### Setting up constraints 50 | ```swift 51 | NSLayoutConstraint.constrain(activate: true) { 52 | customView.centerXAnchor.constraint(equalTo: centerXAnchor), 53 | customView.centerYAnchor.constraint(equalTo: centerYAnchor) 54 | } 55 | ``` 56 | 57 | ### Pinning a custom view to its super view using constraints 58 | ```swift 59 | superview.addSubview(customView, pin: true, insets: .init(top: 0, left: 30, bottom: 0, right: -30)) 60 | ``` 61 | 62 | ### Adding multiple views 63 | ```swift 64 | view.addSubviews(view1, view2, view3) 65 | ``` 66 | 67 | ### Setting up buttons with title and a type. 68 | ```swift 69 | let button = UIButton(title: "A", type: .system) 70 | ``` 71 | 72 | ### Creating image views with content mode. 73 | ```swift 74 | let imageView = UIImageView(image: image, contentMode: .scaleAspectFit) 75 | ``` 76 | 77 | ### Creating labels 78 | ```swift 79 | let label = UILabel(text: "A", 80 | font: font, 81 | textColor: color, 82 | textAlignment: .center, 83 | numberOfLines: 2) 84 | ``` 85 | 86 | ## Installation 87 | 88 | **UserInterface** is available through [CocoaPods](http://cocoapods.org). To install 89 | it, simply add the following line to your Podfile: 90 | 91 | ```ruby 92 | pod 'UserInterface' 93 | ``` 94 | 95 | **UserInterface** is also available through [Carthage](https://github.com/Carthage/Carthage). 96 | To install just write into your Cartfile: 97 | 98 | ```ruby 99 | github "zenangst/UserInterface" 100 | ``` 101 | 102 | **UserInterface** can also be installed manually. Just download and drop `Sources` folders in your project. 103 | 104 | ## Author 105 | 106 | - Christoffer Winterkvist, christoffer@winterkvist.com 107 | - Vadym Markov, markov.vadym@gmail.com 108 | - Khoa Pham, onmyway133@gmail.com 109 | 110 | ## Contributing 111 | 112 | We would love you to contribute to **UserInterface**, check the [CONTRIBUTING](https://github.com/zenangst/UserInterface/blob/master/CONTRIBUTING.md) file for more info. 113 | 114 | ## License 115 | 116 | **UserInterface** is available under the MIT license. See the [LICENSE](https://github.com/zenangst/UserInterface/blob/master/LICENSE.md) file for more info. 117 | -------------------------------------------------------------------------------- /Source/Shared/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zenangst/UserInterface/79811947c669824739a3c7e189e5040a07f339d4/Source/Shared/.gitkeep -------------------------------------------------------------------------------- /Source/Shared/Extensions/NSLayoutConstraint+Extensions.swift: -------------------------------------------------------------------------------- 1 | #if os(macOS) 2 | import Cocoa 3 | #else 4 | import UIKit 5 | #endif 6 | 7 | public extension NSLayoutConstraint { 8 | /// Add layout constraints to a view. 9 | /// 10 | /// - Parameters: 11 | /// - activate: Indicates if the constraints should be activated or not. 12 | /// - constraints: The constraints that should be applied. 13 | /// - Returns: The constraints that was applied to the view. 14 | @discardableResult public static func constrain(activate: Bool = true, _ constraints: NSLayoutConstraint?...) -> [NSLayoutConstraint] { 15 | for constraint in constraints { 16 | (constraint?.firstItem as? View)?.translatesAutoresizingMaskIntoConstraints = false 17 | } 18 | 19 | if activate { 20 | NSLayoutConstraint.activate(constraints.compactMap { $0 }) 21 | } 22 | 23 | return constraints.compactMap { $0 } 24 | } 25 | 26 | /// Add view as a sub view an pin constraints to parent view. 27 | /// 28 | /// - Parameters: 29 | /// - view: The view that should be added as a subview and pinned. 30 | /// - toView: The view that the should act as the parent for constraints. 31 | /// - activate: Indicates if the constraints should be activated or not. 32 | /// - insets: Insets that are applied as constants for the constraints. 33 | /// - Returns: A collection of layout constraints. 34 | @discardableResult public static func addAndPin(_ view: View, 35 | toView: View, 36 | activate: Bool = true, 37 | insets: EdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 0)) -> [NSLayoutConstraint] { 38 | toView.addSubview(view) 39 | return pin(view, toView: toView, activate: activate, insets: insets) 40 | } 41 | 42 | /// Pin a view to another view using constraints. 43 | /// 44 | /// - Parameters: 45 | /// - view: The view that should be pinned. 46 | /// - toView: The view that the layout guide should be pinned to. 47 | /// - activate: Indicates if the constraints should be activated or not. 48 | /// - insets: Insets that are applied as constants for the constraints. 49 | /// - Returns: A collection of layout constraints. 50 | @discardableResult public static func pin(_ view: View, 51 | toView: View, 52 | activate: Bool = true, 53 | insets: EdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 0)) -> [NSLayoutConstraint] { 54 | let constraints = NSLayoutConstraint.constrain(activate: activate, 55 | view.leadingAnchor.constraint(equalTo: toView.leadingAnchor, constant: insets.left), 56 | view.trailingAnchor.constraint(equalTo: toView.trailingAnchor, constant: -insets.right), 57 | view.topAnchor.constraint(equalTo: toView.topAnchor, constant: insets.top), 58 | view.bottomAnchor.constraint(equalTo: toView.bottomAnchor, constant: -insets.bottom) 59 | ) 60 | 61 | return constraints.compactMap { $0 } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Source/Shared/Extensions/View+Extensions.swift: -------------------------------------------------------------------------------- 1 | #if os(macOS) 2 | import Cocoa 3 | #else 4 | import UIKit 5 | #endif 6 | 7 | public extension View { 8 | /// Adds multiple views to another view. 9 | /// 10 | /// - Parameter views: The views that should be added to the view. 11 | public func addSubviews(_ views: View...) { 12 | for view in views { 13 | addSubview(view) 14 | } 15 | } 16 | 17 | @discardableResult 18 | /// Adds a view to the view’s subviews so it’s displayed above its siblings. 19 | /// Optionally pin the view to its superview using layout constraints. 20 | /// 21 | /// - Parameters: 22 | /// - view: The view to add to the view as a subview. 23 | /// - pin: Indicates if the view should be pinned using constraints. 24 | /// - insets: Insets used to apply padding when applying constraints. 25 | /// - Returns: A collection of layout constraints, the array is empty if 26 | /// `pin` is set to `false`. 27 | public func addSubview(_ view: View, pin: Bool = false, insets: EdgeInsets = .init()) -> [NSLayoutConstraint] { 28 | if pin { 29 | return NSLayoutConstraint.addAndPin(view, toView: self, insets: insets) 30 | } else { 31 | self.addSubview(view) 32 | return [] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Source/Shared/Structs/Shadow.swift: -------------------------------------------------------------------------------- 1 | #if os(macOS) 2 | import Cocoa 3 | public typealias ShadowColor = NSColor 4 | #else 5 | import UIKit 6 | public typealias ShadowColor = UIColor 7 | #endif 8 | 9 | public struct Shadow { 10 | let color: ShadowColor 11 | let offset: CGSize 12 | let opacity: Float 13 | let radius: CGFloat 14 | 15 | public init(color: ShadowColor, offset: CGSize = .zero, 16 | opacity: Float = 1.0, radius: CGFloat = 0.0) { 17 | self.color = color 18 | self.offset = offset 19 | self.opacity = opacity 20 | self.radius = radius 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Source/Shared/TypeAlias/TypeAlias.swift: -------------------------------------------------------------------------------- 1 | #if os(macOS) 2 | import Cocoa 3 | public typealias View = NSView 4 | public typealias EdgeInsets = NSEdgeInsets 5 | #else 6 | import UIKit 7 | public typealias View = UIView 8 | public typealias EdgeInsets = UIEdgeInsets 9 | #endif 10 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zenangst/UserInterface/79811947c669824739a3c7e189e5040a07f339d4/Source/iOS+tvOS/.gitkeep -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/NSLayoutConstraints+iOS.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension NSLayoutConstraint { 4 | /// Add layoutGuide as a subview an pin constraints to parent view. 5 | /// 6 | /// - Parameters: 7 | /// - layoutGuide: The layout guide that should be added and pinned. 8 | /// - toView: The view that the should act as the parent for constraints. 9 | /// - activate: Indicates if the constraints should be activated or not. 10 | /// - insets: Insets that are applied as constants for the constraints. 11 | /// - Returns: A collection of layout constraints. 12 | @discardableResult public static func addAndPin(_ layoutGuide: UILayoutGuide, 13 | toView: View, 14 | activate: Bool = true, 15 | insets: EdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 0)) -> [NSLayoutConstraint] { 16 | toView.addLayoutGuide(layoutGuide) 17 | return pin(layoutGuide, toView: toView, activate: activate, insets: insets) 18 | } 19 | 20 | /// Pin a layout guide to a view using constraints. 21 | /// 22 | /// - Parameters: 23 | /// - layoutGuide: The layout guide that should be pinned. 24 | /// - toView: The view that the layout guide should be pinned to. 25 | /// - activate: Indicates if the constraints should be activated or not. 26 | /// - insets: Insets that are applied as constants for the constraints. 27 | /// - Returns: A collection of layout constraints. 28 | @discardableResult public static func pin(_ layoutGuide: UILayoutGuide, 29 | toView: View, 30 | activate: Bool = true, 31 | insets: EdgeInsets = .zero) -> [NSLayoutConstraint] { 32 | let constraints = NSLayoutConstraint.constrain(activate: activate, 33 | layoutGuide.leadingAnchor.constraint(equalTo: toView.leadingAnchor, constant: insets.left), 34 | layoutGuide.trailingAnchor.constraint(equalTo: toView.trailingAnchor, constant: -insets.right), 35 | layoutGuide.topAnchor.constraint(equalTo: toView.topAnchor, constant: insets.top), 36 | layoutGuide.bottomAnchor.constraint(equalTo: toView.bottomAnchor, constant: -insets.bottom) 37 | ) 38 | 39 | return constraints.compactMap { $0 } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UIButton+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UIButton { 4 | public convenience init(title: String, 5 | type: UIButton.ButtonType = .system) { 6 | self.init(type: type) 7 | self.setTitle(title, for: .normal) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UICollectionView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UICollectionView { 4 | /// Initialize a collection view with a data source, layout 5 | /// and cells that should be registred. 6 | /// 7 | /// - Parameters: 8 | /// - dataSource: The data source that will be used. 9 | /// - layout: The layout that will be used. 10 | /// - cells: The cells that should be registred. 11 | convenience init(dataSource: UICollectionViewDataSource? = nil, 12 | delegate: UICollectionViewDelegate? = nil, 13 | layout: UICollectionViewLayout, 14 | register cells: UICollectionViewCell.Type ...) { 15 | self.init(frame: .zero, collectionViewLayout: layout) 16 | cells.forEach { register($0) } 17 | self.dataSource = dataSource 18 | self.delegate = delegate 19 | } 20 | 21 | /// Register a cell(s) using the cells computed `.reuseIdentifier`. 22 | /// 23 | /// - Parameter types: The type(s) of cell that should be registred. 24 | public func register(_ types: UICollectionViewCell.Type ...) { 25 | register(types) 26 | } 27 | 28 | /// Register a cells using the cells computed `.reuseIdentifier`. 29 | /// 30 | /// - Parameter types: The type of cell that should be registred. 31 | public func register(_ types: [UICollectionViewCell.Type]) { 32 | types.forEach { type in register(type, forCellWithReuseIdentifier: type.reuseIdentifier) } 33 | } 34 | 35 | public func dequeue(_ type: T.Type, 36 | for indexPath: IndexPath, 37 | then handler: ((T) -> Void)? = nil) -> T { 38 | guard let cell = dequeueReusableCell(withReuseIdentifier: type.reuseIdentifier, for: indexPath) as? T else { 39 | assertionFailure("Failed to dequeue \(type)") 40 | return type.init() 41 | } 42 | 43 | handler?(cell) 44 | return cell 45 | } 46 | 47 | /// Dequeue and configure a cell at a specific index path. 48 | /// Commonly used inside the collection view's data source. 49 | /// 50 | /// - Parameters: 51 | /// - type: The type of cell. 52 | /// - model: The model that should be used to configure the cell. 53 | /// - indexPath: The index path of the cell. 54 | /// - closure: The configuration closure for the cell. 55 | /// - Returns: A cell with a generically inferred type. 56 | public func dequeue(_ type: T.Type, 57 | with model: M, 58 | for indexPath: IndexPath, 59 | then handler: ((T, M) -> Void)? = nil) -> T { 60 | let cell = dequeue(type, for: indexPath, then: { cell in 61 | handler?(cell, model) 62 | }) 63 | return cell 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UICollectionViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UICollectionViewCell { 4 | /// A reuse identifier computed from the cell's own description. 5 | public static var reuseIdentifier: String { 6 | return String(describing: self) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UIImageView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UIImageView { 4 | public convenience init(image: UIImage? = nil, 5 | contentMode: UIView.ContentMode = .scaleToFill) { 6 | self.init(image: image) 7 | self.contentMode = contentMode 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UILabel+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UILabel { 4 | public convenience init(text: String? = nil, 5 | font: UIFont? = nil, 6 | textColor: UIColor? = nil, 7 | textAlignment: NSTextAlignment = .natural, 8 | numberOfLines: Int = 0) { 9 | self.init() 10 | self.text = text 11 | if let font = font { 12 | self.font = font 13 | } 14 | self.textColor = textColor 15 | self.textAlignment = textAlignment 16 | self.numberOfLines = numberOfLines 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UIStackView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UIStackView { 4 | /// Initialize a stack view with direction, alignment, spacing and views. 5 | /// 6 | /// - Parameters: 7 | /// - direction: The direction of the stack view, can be either horizontal 8 | /// or vertical. 9 | /// - alignment: The alignment of the stack view, defaults to `.fill`. 10 | /// - spacing: The spacing between the view. 11 | /// - views: The views that should be added to the stack view. 12 | public convenience init(_ direction: NSLayoutConstraint.Axis = .horizontal, 13 | alignment: UIStackView.Alignment = .fill, 14 | distribution: UIStackView.Distribution = .fill, 15 | spacing: CGFloat, 16 | views: [UIView]) { 17 | self.init(arrangedSubviews: views) 18 | self.axis = direction 19 | self.alignment = alignment 20 | self.distribution = distribution 21 | self.spacing = spacing 22 | } 23 | 24 | /// Initialize a stack view with direction, alignment, spacing and views. 25 | /// 26 | /// - Parameters: 27 | /// - direction: The direction of the stack view, can be either horizontal 28 | /// or vertical. 29 | /// - alignment: The alignment of the stack view, defaults to `.fill`. 30 | /// - spacing: The spacing between the view. 31 | /// - views: The views that should be added to the stack view. 32 | public convenience init(_ direction: NSLayoutConstraint.Axis = .horizontal, 33 | alignment: UIStackView.Alignment = .fill, 34 | distribution: UIStackView.Distribution = .fill, 35 | spacing: CGFloat, 36 | views: UIView ...) { 37 | self.init(direction, 38 | alignment: alignment, 39 | distribution: distribution, 40 | spacing: spacing, 41 | views: views) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UITableView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UITableView { 4 | /// Initialize a table view with a data source and 5 | /// cells that should be registred. 6 | /// 7 | /// - Parameters: 8 | /// - dataSource: The data source that will be used. 9 | /// - cells: The cells that should be registred. 10 | public convenience init(dataSource: UITableViewDataSource? = nil, 11 | delegate: UITableViewDelegate? = nil, 12 | register cells: UITableViewCell.Type ...) { 13 | self.init(frame: .zero) 14 | cells.forEach { register($0) } 15 | self.dataSource = dataSource 16 | self.delegate = delegate 17 | } 18 | 19 | /// Register a cell(s) using the cells computed `.reuseIdentifier`. 20 | /// 21 | /// - Parameter types: The type(s) of cell that should be registred. 22 | public func register(_ types: UITableViewCell.Type ...) { 23 | register(types) 24 | } 25 | 26 | /// Register a cell(s) using the cells computed `.reuseIdentifier`. 27 | /// 28 | /// - Parameter types: The types of cell that should be registred. 29 | public func register(_ types: [UITableViewCell.Type]) { 30 | types.forEach { type in register(type, forCellReuseIdentifier: type.reuseIdentifier) } 31 | } 32 | 33 | public func dequeue(_ type: T.Type, 34 | for indexPath: IndexPath, 35 | then handler: ((T) -> Void)? = nil) -> T { 36 | guard let cell = dequeueReusableCell(withIdentifier: type.reuseIdentifier, for: indexPath) as? T else { 37 | assertionFailure("Failed to dequeue \(type)") 38 | return type.init() 39 | } 40 | 41 | handler?(cell) 42 | return cell 43 | } 44 | 45 | /// Dequeue and configure a cell at a specific index path. 46 | /// Commonly used inside the table view's data source. 47 | /// 48 | /// - Parameters: 49 | /// - type: The type of cell. 50 | /// - model: The model that should be used to configure the cell. 51 | /// - indexPath: The index path of the cell. 52 | /// - closure: The configuration closure for the cell. 53 | /// - Returns: A cell with a generically inferred type. 54 | public func dequeue(_ type: T.Type, 55 | with model: M, 56 | for indexPath: IndexPath, 57 | then handler: ((T, M) -> Void)? = nil) -> T { 58 | let cell = dequeue(type, for: indexPath, then: { cell in 59 | handler?(cell, model) 60 | }) 61 | return cell 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // Creates a unique identifier for a cell. 4 | public extension UITableViewCell { 5 | /// A reuse identifier computed from the cell's own description. 6 | public static var reuseIdentifier: String { 7 | return String(describing: self) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UITextField+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | extension UITextField { 4 | public convenience init(text: String? = nil, 5 | font: UIFont? = nil, 6 | textColor: UIColor? = nil, 7 | textAlignment: NSTextAlignment = .natural, 8 | numberOfLines: Int = 0) { 9 | self.init() 10 | self.text = text 11 | if let font = font { 12 | self.font = font 13 | } 14 | self.textColor = textColor 15 | self.textAlignment = textAlignment 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/iOS+tvOS/Extensions/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public extension UIView { 4 | public convenience init(backgroundColor: UIColor) { 5 | self.init() 6 | self.backgroundColor = backgroundColor 7 | } 8 | 9 | public func add(_ shadow: Shadow) { 10 | layer.shadowColor = shadow.color.cgColor 11 | layer.shadowRadius = shadow.radius 12 | layer.shadowOffset = shadow.offset 13 | layer.shadowOpacity = shadow.opacity 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Source/macOS/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zenangst/UserInterface/79811947c669824739a3c7e189e5040a07f339d4/Source/macOS/.gitkeep -------------------------------------------------------------------------------- /Source/macOS/Classes/UserInterfaceItem.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | open class UserInterfaceItem: NSCollectionViewItem { 4 | override open func loadView() { 5 | self.view = UserInterfaceView() 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Source/macOS/Classes/UserInterfaceLabel.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | open class UserInterfaceLabel: NSTextField { 4 | override open var isFlipped: Bool { return true } 5 | 6 | override open var isBezeled: Bool { 7 | get { return false } 8 | set { super.isBezeled = false } 9 | } 10 | override open var isEditable: Bool { 11 | get { return false } 12 | set { super.isEditable = false } 13 | } 14 | 15 | public var text: String { 16 | get { return stringValue } 17 | set { stringValue = newValue } 18 | } 19 | 20 | open override func viewWillMove(toSuperview newSuperview: NSView?) { 21 | super.viewWillMove(toSuperview: newSuperview) 22 | super.isBezeled = false 23 | super.isEditable = false 24 | super.backgroundColor = .clear 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Source/macOS/Classes/UserInterfaceView.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | open class UserInterfaceView: NSView { 4 | override open var isFlipped: Bool { return true } 5 | 6 | public var backgroundColor: NSColor? { 7 | get { 8 | guard let cgColor = layer?.backgroundColor else { return nil } 9 | return NSColor(cgColor: cgColor) 10 | } 11 | set { 12 | if newValue != nil { wantsLayer = true } 13 | layer?.backgroundColor = newValue?.cgColor 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Source/macOS/Extensions/NSCollectionView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | public extension NSCollectionView { 4 | /// Initialize a collection view with a data source, layout 5 | /// and cells that should be registred. 6 | /// 7 | /// - Parameters: 8 | /// - dataSource: The data source that will be used. 9 | /// - layout: The layout that will be used. 10 | /// - cells: The cells that should be registred. 11 | public convenience init(dataSource: NSCollectionViewDataSource? = nil, 12 | layout: NSCollectionViewFlowLayout, 13 | register cells: NSCollectionViewItem.Type ...) { 14 | self.init(frame: .zero) 15 | self.collectionViewLayout = layout 16 | cells.forEach { register($0) } 17 | self.dataSource = dataSource 18 | } 19 | 20 | /// Register a cell(s) using the cells computed `.reuseIdentifier`. 21 | /// 22 | /// - Parameter type: The type of cell that should be registred. 23 | public func register(_ types: NSCollectionViewItem.Type ...) { 24 | register(types) 25 | } 26 | 27 | /// Register a cells using the cells computed `.reuseIdentifier`. 28 | /// 29 | /// - Parameter types: The types of cell that should be registred. 30 | public func register(_ types: [NSCollectionViewItem.Type]) { 31 | types.forEach { type in register(type, 32 | forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: type.reuseIdentifier)) } 33 | } 34 | 35 | /// Dequeue and configure a cell at a specific index path. 36 | /// Commonly used inside the collection view's data source. 37 | /// 38 | /// - Parameters: 39 | /// - type: The type of cell. 40 | /// - model: The model that should be used to configure the cell. 41 | /// - indexPath: The index path of the cell. 42 | /// - closure: The configuration closure for the cell. 43 | /// - Returns: A cell with a generically inferred type. 44 | public func dequeue(_ type: T.Type, 45 | with model: M, 46 | for indexPath: IndexPath, 47 | closure: ((T, M) -> Void)? = nil) -> T { 48 | let identifier = NSUserInterfaceItemIdentifier(rawValue: type.reuseIdentifier) 49 | if let cell = makeItem(withIdentifier: identifier, for: indexPath) as? T { 50 | closure?(cell, model) 51 | return cell 52 | } 53 | assertionFailure("Failed to dequeue \(type)") 54 | return type.init() 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Source/macOS/Extensions/NSCollectionViewItem+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | public extension NSCollectionViewItem { 4 | /// A reuse identifier computed from the cell's own description. 5 | public static var reuseIdentifier: String { 6 | return String(describing: self) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Source/macOS/Extensions/NSStackView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | public extension NSStackView { 4 | /// Initialize a stack view with direction, alignment, spacing and views. 5 | /// 6 | /// - Parameters: 7 | /// - orientation: The direction of the stack view, can be either horizontal 8 | /// or vertical. 9 | /// - alignment: The alignment of the stack view, defaults to `.centerX`. 10 | /// - spacing: The spacing between the view. 11 | /// - views: The views that should be added to the stack view. 12 | public convenience init(_ orientation: NSUserInterfaceLayoutOrientation = .horizontal, 13 | alignment: NSLayoutConstraint.Attribute = .centerX, 14 | spacing: CGFloat, 15 | views: [View]) { 16 | self.init(views: views) 17 | self.orientation = orientation 18 | self.alignment = alignment 19 | self.spacing = spacing 20 | } 21 | 22 | /// Initialize a stack view with direction, alignment, spacing and views. 23 | /// 24 | /// - Parameters: 25 | /// - orientation: The direction of the stack view, can be either horizontal 26 | /// or vertical. 27 | /// - alignment: The alignment of the stack view, defaults to `.centerX`. 28 | /// - spacing: The spacing between the view. 29 | /// - views: The views that should be added to the stack view. 30 | public convenience init(_ orientation: NSUserInterfaceLayoutOrientation = .horizontal, 31 | alignment: NSLayoutConstraint.Attribute = .centerX, 32 | spacing: CGFloat, 33 | views: View...) { 34 | self.init(orientation, alignment: alignment, spacing: spacing, views: views) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Source/macOS/Extensions/NSTableRowView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | public extension NSTableRowView { 4 | /// A reuse identifier computed from the cell's own description. 5 | public static var reuseIdentifier: String { 6 | return String(describing: self) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Source/macOS/Extensions/NSTableView+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | public extension NSTableView { 4 | /// Initialize a table view with a data source. 5 | /// 6 | /// - Parameter dataSource: The data source that will be used. 7 | public convenience init(dataSource: NSTableViewDataSource? = nil) { 8 | self.init(frame: .zero) 9 | self.dataSource = dataSource 10 | } 11 | 12 | /// Dequeue and configure a cell at a specific index path. 13 | /// Commonly used inside the table view's data source. 14 | /// 15 | /// - Parameters: 16 | /// - type: The type of cell. 17 | /// - model: The model that should be used to configure the cell. 18 | /// - indexPath: The index path of the cell. 19 | /// - closure: The configuration closure for the cell. 20 | /// - Returns: A cell with a generically inferred type. 21 | public func dequeue(_ type: T.Type, 22 | with model: M, 23 | for indexPath: IndexPath, 24 | closure: ((T, M) -> Void)? = nil) -> T { 25 | let identifier = NSUserInterfaceItemIdentifier(rawValue: type.reuseIdentifier) 26 | 27 | if let cell = makeView(withIdentifier: identifier, owner: nil) as? T { 28 | closure?(cell, model) 29 | return cell 30 | } 31 | assertionFailure("Failed to dequeue \(type)") 32 | return type.init() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Source/watchOS/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zenangst/UserInterface/79811947c669824739a3c7e189e5040a07f339d4/Source/watchOS/.gitkeep -------------------------------------------------------------------------------- /Tests/Info-iOS-Tests.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/Info-macOS-Tests.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests/Info-tvOS-Tests.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests/Shared/SharedTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | class SharedTests: XCTestCase { 4 | 5 | override func setUp() { 6 | super.setUp() 7 | // Put setup code here. This method is called before the invocation of each test method in the class. 8 | } 9 | 10 | override func tearDown() { 11 | // Put teardown code here. This method is called after the invocation of each test method in the class. 12 | super.tearDown() 13 | } 14 | 15 | func testExample() { 16 | // This is an example of a functional test case. 17 | // Use XCTAssert and related functions to verify your tests produce the correct results. 18 | } 19 | 20 | func testPerformanceExample() { 21 | // This is an example of a performance test case. 22 | self.measure { 23 | // Put the code you want to measure the time of here. 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/NSLayoutConstraintsTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSLayoutConstraintsTests: XCTestCase { 5 | func testPinningView() { 6 | let viewA = UIView() 7 | let viewB = UIView() 8 | viewB.addSubview(viewA) 9 | let constraints = NSLayoutConstraint.pin(viewA, toView: viewB, insets: .init(top: 10, left: 10, bottom: 10, right: 10)) 10 | 11 | XCTAssertEqual(constraints[0].constant, 10) 12 | XCTAssertEqual(constraints[1].constant, -10) 13 | XCTAssertEqual(constraints[2].constant, 10) 14 | XCTAssertEqual(constraints[3].constant, -10) 15 | } 16 | 17 | func testConstraints() { 18 | let viewA = UIView() 19 | let viewB = UIView() 20 | viewB.addSubview(viewA) 21 | 22 | let constraints = NSLayoutConstraint.constrain(activate: false, 23 | viewA.centerXAnchor.constraint(equalTo: viewB.centerXAnchor), 24 | viewA.centerYAnchor.constraint(equalTo: viewB.centerYAnchor) 25 | ) 26 | 27 | XCTAssertEqual(constraints.count, 2) 28 | 29 | XCTAssertEqual(constraints[0].isActive, false) 30 | XCTAssertEqual(constraints[0].firstAnchor, viewA.centerXAnchor) 31 | XCTAssertEqual(constraints[0].secondAnchor, viewB.centerXAnchor) 32 | 33 | XCTAssertEqual(constraints[1].isActive, false) 34 | XCTAssertEqual(constraints[1].firstAnchor, viewA.centerYAnchor) 35 | XCTAssertEqual(constraints[1].secondAnchor, viewB.centerYAnchor) 36 | } 37 | 38 | func testAddAndPinView() { 39 | let pinnedView = UIView() 40 | let view = UIView() 41 | let constraints = NSLayoutConstraint.addAndPin(pinnedView, toView: view) 42 | 43 | XCTAssertEqual(constraints.count, 4) 44 | } 45 | 46 | func testConstrainingLayoutGuide() { 47 | let layoutGuide = UILayoutGuide() 48 | let view = UIView() 49 | view.addLayoutGuide(layoutGuide) 50 | let constraints = NSLayoutConstraint.pin(layoutGuide, toView: view) 51 | 52 | XCTAssertEqual(constraints.count, 4) 53 | } 54 | 55 | func testAddAndPinLayoutGuide() { 56 | let layoutGuide = UILayoutGuide() 57 | let view = UIView() 58 | let constraints = NSLayoutConstraint.addAndPin(layoutGuide, toView: view) 59 | 60 | XCTAssertEqual(constraints.count, 4) 61 | XCTAssertEqual(layoutGuide.owningView, view) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UIButtonTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UIIButtonTests: XCTestCase { 5 | func testInitializer() { 6 | let buttonA = UIButton(title: "A", type: .system) 7 | let buttonB = UIButton(title: "B", type: .custom) 8 | 9 | XCTAssertEqual(buttonA.titleLabel?.text, "A") 10 | XCTAssertEqual(buttonA.buttonType, .system) 11 | 12 | XCTAssertEqual(buttonB.titleLabel?.text, "B") 13 | XCTAssertEqual(buttonB.buttonType, .custom) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UICollectionViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UICollectionViewTests: XCTestCase { 5 | class DataSourceMock: NSObject, UICollectionViewDataSource { 6 | let models = ["A", "B", "C"] 7 | 8 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 9 | return models.count 10 | } 11 | 12 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 13 | return collectionView.dequeue(UICollectionViewCell.self, with: models[indexPath.item], for: indexPath) { (_,_) in } 14 | } 15 | } 16 | 17 | func testInitCollectionView() { 18 | let dataSource = DataSourceMock() 19 | let layout = UICollectionViewFlowLayout() 20 | layout.itemSize = CGSize(width: 50, height: 50) 21 | let collectionView = UICollectionView(dataSource: dataSource, layout: layout, register: UICollectionViewCell.self) 22 | collectionView.frame.size = CGSize(width: 250, height: 250) 23 | collectionView.setNeedsLayout() 24 | collectionView.layoutIfNeeded() 25 | 26 | XCTAssertEqual(collectionView.visibleCells.count, dataSource.models.count) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UIImageViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UIImageViewTests: XCTestCase { 5 | func testInitializer() { 6 | let imageView = UIImageView(image: nil, contentMode: .scaleAspectFit) 7 | XCTAssertEqual(imageView.contentMode, .scaleAspectFit) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UILabelTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UILabelTests: XCTestCase { 5 | func testInitializer() { 6 | let color = UIColor.blue 7 | let font = UIFont.systemFont(ofSize: 32) 8 | let label = UILabel(text: "A", 9 | font: font, 10 | textColor: color, 11 | textAlignment: .center, 12 | numberOfLines: 2) 13 | 14 | XCTAssertEqual(label.text, "A") 15 | XCTAssertEqual(label.font, font) 16 | XCTAssertEqual(label.textColor, color) 17 | XCTAssertEqual(label.textAlignment, .center) 18 | XCTAssertEqual(label.numberOfLines, 2) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UIStackViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UIStackViewViewTests: XCTestCase { 5 | 6 | func testHorizontalStackView() { 7 | let viewA = UIView() 8 | let viewB = UIView() 9 | let stackView = UIStackView(.horizontal, alignment: .fill, 10 | spacing: 20, views: viewA, viewB) 11 | 12 | XCTAssertEqual(stackView.axis, .horizontal) 13 | XCTAssertEqual(stackView.spacing, 20) 14 | XCTAssertEqual(stackView.alignment, .fill) 15 | XCTAssertEqual(stackView.arrangedSubviews, [viewA, viewB]) 16 | } 17 | 18 | func testVerticalStackView() { 19 | let viewA = UIView() 20 | let viewB = UIView() 21 | let viewC = UIView() 22 | let stackView = UIStackView(.vertical, alignment: .leading, 23 | spacing: 10, views: [viewA, viewB, viewC]) 24 | 25 | XCTAssertEqual(stackView.axis, .vertical) 26 | XCTAssertEqual(stackView.spacing, 10) 27 | XCTAssertEqual(stackView.alignment, .leading) 28 | XCTAssertEqual(stackView.arrangedSubviews, [viewA, viewB, viewC]) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UITableViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UITableViewViewTests: XCTestCase { 5 | class DataSourceMock: NSObject, UITableViewDataSource { 6 | let models = ["A", "B", "C"] 7 | 8 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 9 | return models.count 10 | } 11 | 12 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 13 | return tableView.dequeue(UITableViewCell.self, with: models[indexPath.item], for: indexPath) { (_,_) in } 14 | } 15 | } 16 | 17 | 18 | func testInitCollectionView() { 19 | let dataSource = DataSourceMock() 20 | let tableView = UITableView(dataSource: dataSource, register: UITableViewCell.self) 21 | tableView.frame.size = CGSize(width: 250, height: 250) 22 | tableView.setNeedsLayout() 23 | tableView.layoutIfNeeded() 24 | 25 | XCTAssertEqual(tableView.visibleCells.count, dataSource.models.count) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Tests/iOS+tvOS/UIViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class UIViewTests: XCTestCase { 5 | func testAddingViews() { 6 | let viewA = UIView() 7 | let viewB = UIView() 8 | let viewC = UIView() 9 | 10 | let superview = UIView() 11 | superview.addSubviews(viewA, viewB, viewC) 12 | 13 | XCTAssertEqual(superview.subviews, [viewA, viewB, viewC]) 14 | } 15 | 16 | func testPinView() { 17 | let viewA = UIView() 18 | let viewB = UIView() 19 | let constraints = viewA.addSubview(viewB, pin: true, 20 | insets: .init(top: 10, left: 10, bottom: 10, right: 10)) 21 | 22 | guard constraints.count == 4 else { 23 | XCTFail("Wrong number of constraints") 24 | return 25 | } 26 | 27 | XCTAssertEqual(viewB.superview, viewA) 28 | 29 | do { 30 | let constraint = constraints[0] 31 | XCTAssertTrue(constraint.isActive) 32 | XCTAssertTrue((constraint.firstItem as? UIView) == viewB) 33 | XCTAssertTrue((constraint.secondItem as? UIView) == viewA) 34 | } 35 | } 36 | 37 | func testAddShadow() { 38 | let view = UIView() 39 | let color = UIColor.red 40 | let offset = CGSize.init(width: 0, height: 2) 41 | let opacity: Float = 0.75 42 | let radius: CGFloat = 8 43 | let shadow = Shadow(color: color, offset: offset, opacity: opacity, radius: radius) 44 | 45 | view.add(shadow) 46 | 47 | XCTAssertEqual(view.layer.shadowColor, color.cgColor) 48 | XCTAssertEqual(view.layer.shadowOffset, offset) 49 | XCTAssertEqual(view.layer.shadowOpacity, opacity) 50 | XCTAssertEqual(view.layer.shadowRadius, radius) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Tests/macOS/NSCollectionViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSCollectionViewTests: XCTestCase { 5 | class DataSourceMock: NSObject, NSCollectionViewDataSource { 6 | let models = ["A", "B", "C"] 7 | 8 | func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { 9 | return models.count 10 | } 11 | 12 | func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { 13 | return collectionView.dequeue(UserInterfaceItem.self, with: models[indexPath.item], for: indexPath) { (_,_) in } 14 | } 15 | } 16 | 17 | 18 | func testInitCollectionView() { 19 | let dataSource = DataSourceMock() 20 | let layout = NSCollectionViewFlowLayout() 21 | layout.itemSize = CGSize(width: 50, height: 50) 22 | let collectionView = NSCollectionView(dataSource: dataSource, layout: layout, register: UserInterfaceItem.self) 23 | collectionView.frame.size = CGSize(width: 250, height: 250) 24 | collectionView.layout() 25 | 26 | XCTAssertEqual(collectionView.visibleItems().count, dataSource.models.count) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Tests/macOS/NSLayoutConstraintsTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSLayoutConstraintsTests: XCTestCase { 5 | func testPinningView() { 6 | let viewA = NSView() 7 | let viewB = NSView() 8 | viewB.addSubview(viewA) 9 | let constraints = NSLayoutConstraint.pin(viewA, toView: viewB, insets: .init(top: 10, left: 10, bottom: 10, right: 10)) 10 | 11 | XCTAssertEqual(constraints[0].constant, 10) 12 | XCTAssertEqual(constraints[1].constant, -10) 13 | XCTAssertEqual(constraints[2].constant, 10) 14 | XCTAssertEqual(constraints[3].constant, -10) 15 | } 16 | 17 | func testConstraints() { 18 | let viewA = NSView() 19 | let viewB = NSView() 20 | viewB.addSubview(viewA) 21 | 22 | let constraints = NSLayoutConstraint.constrain(activate: false, 23 | viewA.centerXAnchor.constraint(equalTo: viewB.centerXAnchor), 24 | viewA.centerYAnchor.constraint(equalTo: viewB.centerYAnchor) 25 | ) 26 | 27 | XCTAssertEqual(constraints.count, 2) 28 | XCTAssertEqual(constraints[0].isActive, false) 29 | XCTAssertEqual(constraints[1].isActive, false) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Tests/macOS/NSStackViewViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSStackViewViewTests: XCTestCase { 5 | 6 | func testHorizontalStackView() { 7 | let viewA = NSView() 8 | let viewB = NSView() 9 | let stackView = NSStackView(.horizontal, alignment: .centerX, 10 | spacing: 20, views: viewA, viewB) 11 | 12 | XCTAssertEqual(stackView.spacing, 20) 13 | XCTAssertEqual(stackView.alignment, .centerX) 14 | XCTAssertEqual(stackView.arrangedSubviews, [viewA, viewB]) 15 | } 16 | 17 | func testVerticalStackView() { 18 | let viewA = NSView() 19 | let viewB = NSView() 20 | let viewC = NSView() 21 | let stackView = NSStackView(.vertical, alignment: .leading, 22 | spacing: 10, views: [viewA, viewB, viewC]) 23 | 24 | XCTAssertEqual(stackView.orientation, .vertical) 25 | XCTAssertEqual(stackView.spacing, 10) 26 | XCTAssertEqual(stackView.alignment, .leading) 27 | XCTAssertEqual(stackView.arrangedSubviews, [viewA, viewB, viewC]) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Tests/macOS/NSTableViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSTableViewViewTests: XCTestCase { 5 | class DataSourceMock: NSObject, NSTableViewDataSource, NSTableViewDelegate { 6 | let models = ["A", "B", "C"] 7 | 8 | func numberOfRows(in tableView: NSTableView) -> Int { 9 | return models.count 10 | } 11 | 12 | func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 13 | let view = NSTableRowView() 14 | return view 15 | } 16 | } 17 | 18 | 19 | func testInitCollectionView() { 20 | let dataSource = DataSourceMock() 21 | let tableView = NSTableView(dataSource: dataSource) 22 | tableView.delegate = dataSource 23 | tableView.frame.size = CGSize(width: 250, height: 250) 24 | tableView.layout() 25 | tableView.setNeedsDisplay() 26 | XCTAssertEqual(tableView.rows(in: tableView.frame).length, dataSource.models.count) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Tests/macOS/NSViewTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import UserInterface 3 | 4 | class NSViewTests: XCTestCase { 5 | func testAddingViews() { 6 | let viewA = NSView() 7 | let viewB = NSView() 8 | let viewC = NSView() 9 | 10 | let superview = NSView() 11 | superview.addSubviews(viewA, viewB, viewC) 12 | 13 | XCTAssertEqual(superview.subviews, [viewA, viewB, viewC]) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /UserInterface.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "UserInterface" 3 | s.summary = "A collection of convenience extensions specifically tailored to building user interfaces in Swift." 4 | s.version = "0.5.0" 5 | s.homepage = "https://github.com/zenangst/UserInterface" 6 | s.license = 'MIT' 7 | s.author = { "Christoffer Winterkvist" => "christoffer@winterkvist.com" } 8 | s.source = { 9 | :git => "https://github.com/zenangst/UserInterface.git", 10 | :tag => s.version.to_s 11 | } 12 | s.social_media_url = 'https://twitter.com/zenangst' 13 | 14 | s.ios.deployment_target = '10.0' 15 | s.osx.deployment_target = '10.12' 16 | s.tvos.deployment_target = '9.2' 17 | 18 | s.requires_arc = true 19 | s.ios.source_files = 'Source/{iOS+tvOS,iOS,Shared}/**/*' 20 | s.tvos.source_files = 'Source/{iOS+tvOS,tvOS,Shared}/**/*' 21 | s.osx.source_files = 'Source/{macOS,Shared}/**/*' 22 | 23 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '4.2' } 24 | end 25 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BD25DC0C20AC0A3300BFC86C /* UIImageViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC0B20AC0A3300BFC86C /* UIImageViewTests.swift */; }; 11 | BD25DC0D20AC0A3300BFC86C /* UIImageViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC0B20AC0A3300BFC86C /* UIImageViewTests.swift */; }; 12 | BD25DC0F20AC0A5C00BFC86C /* UIButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC0E20AC0A5C00BFC86C /* UIButtonTests.swift */; }; 13 | BD25DC1020AC0A5C00BFC86C /* UIButtonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC0E20AC0A5C00BFC86C /* UIButtonTests.swift */; }; 14 | BD25DC1220AC0A7B00BFC86C /* UILabelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC1120AC0A7B00BFC86C /* UILabelTests.swift */; }; 15 | BD25DC1320AC0A7B00BFC86C /* UILabelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD25DC1120AC0A7B00BFC86C /* UILabelTests.swift */; }; 16 | BD2CF3ED20AB06C700888874 /* UILabel+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3EC20AB06C700888874 /* UILabel+Extensions.swift */; }; 17 | BD2CF3EE20AB06C700888874 /* UILabel+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3EC20AB06C700888874 /* UILabel+Extensions.swift */; }; 18 | BD2CF3F020AB07C500888874 /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3EF20AB07C500888874 /* UIImageView+Extensions.swift */; }; 19 | BD2CF3F120AB07C500888874 /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3EF20AB07C500888874 /* UIImageView+Extensions.swift */; }; 20 | BD2CF3F320AB0BDC00888874 /* UIButton+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3F220AB0BDC00888874 /* UIButton+Extensions.swift */; }; 21 | BD2CF3F420AB0BDC00888874 /* UIButton+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2CF3F220AB0BDC00888874 /* UIButton+Extensions.swift */; }; 22 | BD6C775F2096F99C00ADB5BC /* UICollectionViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284B1361F7906DA00D94AF3 /* UICollectionViewTests.swift */; }; 23 | BD7221D92094F2AF00D28B9C /* UserInterfaceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221D62094F2A900D28B9C /* UserInterfaceItem.swift */; }; 24 | BD7221DA2094F2B100D28B9C /* UserInterfaceLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221D72094F2A900D28B9C /* UserInterfaceLabel.swift */; }; 25 | BD7221DB2094F2B100D28B9C /* UserInterfaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221D82094F2A900D28B9C /* UserInterfaceView.swift */; }; 26 | BD7221EB2094F3BD00D28B9C /* UICollectionView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E72094F3AB00D28B9C /* UICollectionView+Extensions.swift */; }; 27 | BD7221EC2094F3BD00D28B9C /* UICollectionViewCell+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E62094F3AB00D28B9C /* UICollectionViewCell+Extensions.swift */; }; 28 | BD7221ED2094F3BE00D28B9C /* UICollectionView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E72094F3AB00D28B9C /* UICollectionView+Extensions.swift */; }; 29 | BD7221EE2094F3BE00D28B9C /* UICollectionViewCell+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E62094F3AB00D28B9C /* UICollectionViewCell+Extensions.swift */; }; 30 | BD7221F12094F3E000D28B9C /* UITableViewCell+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221EF2094F3E000D28B9C /* UITableViewCell+Extensions.swift */; }; 31 | BD7221F22094F3E000D28B9C /* UITableViewCell+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221EF2094F3E000D28B9C /* UITableViewCell+Extensions.swift */; }; 32 | BD7221F32094F3E000D28B9C /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221F02094F3E000D28B9C /* UITableView+Extensions.swift */; }; 33 | BD7221F42094F3E000D28B9C /* UITableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221F02094F3E000D28B9C /* UITableView+Extensions.swift */; }; 34 | BD7221F72094F41100D28B9C /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221F52094F40100D28B9C /* View+Extensions.swift */; }; 35 | BD7221F82094F41200D28B9C /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221F52094F40100D28B9C /* View+Extensions.swift */; }; 36 | BD7221F92094F41500D28B9C /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221F52094F40100D28B9C /* View+Extensions.swift */; }; 37 | BD7221FA2094F41D00D28B9C /* TypeAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E22094F37500D28B9C /* TypeAlias.swift */; }; 38 | BD7221FB2094F41D00D28B9C /* TypeAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E22094F37500D28B9C /* TypeAlias.swift */; }; 39 | BD7221FC2094F41E00D28B9C /* TypeAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E22094F37500D28B9C /* TypeAlias.swift */; }; 40 | BD7221FD2094F43200D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E42094F39200D28B9C /* NSLayoutConstraint+Extensions.swift */; }; 41 | BD7221FE2094F43300D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E42094F39200D28B9C /* NSLayoutConstraint+Extensions.swift */; }; 42 | BD7221FF2094F43400D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7221E42094F39200D28B9C /* NSLayoutConstraint+Extensions.swift */; }; 43 | BD7222012094F4D500D28B9C /* NSLayoutConstraints+iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7222002094F4D500D28B9C /* NSLayoutConstraints+iOS.swift */; }; 44 | BD7222022094F4D500D28B9C /* NSLayoutConstraints+iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7222002094F4D500D28B9C /* NSLayoutConstraints+iOS.swift */; }; 45 | BD722205209636BB00D28B9C /* NSCollectionView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD722204209636BB00D28B9C /* NSCollectionView+Extensions.swift */; }; 46 | BD7222072096375800D28B9C /* NSCollectionViewItem+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7222062096375700D28B9C /* NSCollectionViewItem+Extensions.swift */; }; 47 | BD722209209637C300D28B9C /* NSStackView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD722208209637C300D28B9C /* NSStackView+Extensions.swift */; }; 48 | BD72220B20963FFB00D28B9C /* NSTableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD72220A20963FFB00D28B9C /* NSTableView+Extensions.swift */; }; 49 | BD72220D209640B800D28B9C /* NSTableRowView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD72220C209640B800D28B9C /* NSTableRowView+Extensions.swift */; }; 50 | BDD89C4D209700020041C951 /* UITableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C4C209700020041C951 /* UITableViewTests.swift */; }; 51 | BDD89C4E209700020041C951 /* UITableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C4C209700020041C951 /* UITableViewTests.swift */; }; 52 | BDD89C50209700C90041C951 /* UIStackViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C4F209700C90041C951 /* UIStackViewTests.swift */; }; 53 | BDD89C51209700C90041C951 /* UIStackViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C4F209700C90041C951 /* UIStackViewTests.swift */; }; 54 | BDD89C532097018B0041C951 /* UIViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C522097018B0041C951 /* UIViewTests.swift */; }; 55 | BDD89C542097018B0041C951 /* UIViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C522097018B0041C951 /* UIViewTests.swift */; }; 56 | BDD89C56209701D50041C951 /* NSLayoutConstraintsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C55209701D50041C951 /* NSLayoutConstraintsTests.swift */; }; 57 | BDD89C57209701D50041C951 /* NSLayoutConstraintsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C55209701D50041C951 /* NSLayoutConstraintsTests.swift */; }; 58 | BDD89C5D209704F50041C951 /* NSCollectionViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C58209704F50041C951 /* NSCollectionViewTests.swift */; }; 59 | BDD89C5E209704F50041C951 /* NSViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C59209704F50041C951 /* NSViewTests.swift */; }; 60 | BDD89C5F209704F50041C951 /* NSTableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C5A209704F50041C951 /* NSTableViewTests.swift */; }; 61 | BDD89C60209704F50041C951 /* NSStackViewViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C5B209704F50041C951 /* NSStackViewViewTests.swift */; }; 62 | BDD89C61209704F50041C951 /* NSLayoutConstraintsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C5C209704F50041C951 /* NSLayoutConstraintsTests.swift */; }; 63 | BDD89C64209711220041C951 /* UIStackView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C63209711220041C951 /* UIStackView+Extensions.swift */; }; 64 | BDD89C65209711220041C951 /* UIStackView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD89C63209711220041C951 /* UIStackView+Extensions.swift */; }; 65 | BDF8BCFD214D8A6D00D1C5E1 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BCFC214D8A6D00D1C5E1 /* UIView+Extensions.swift */; }; 66 | BDF8BCFE214D8A6D00D1C5E1 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BCFC214D8A6D00D1C5E1 /* UIView+Extensions.swift */; }; 67 | BDF8BD00214D8D5700D1C5E1 /* UITextField+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BCFF214D8D5700D1C5E1 /* UITextField+Extensions.swift */; }; 68 | BDF8BD01214D8D5700D1C5E1 /* UITextField+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BCFF214D8D5700D1C5E1 /* UITextField+Extensions.swift */; }; 69 | BDF8BD04214D8F0D00D1C5E1 /* Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BD03214D8F0D00D1C5E1 /* Shadow.swift */; }; 70 | BDF8BD05214D8F0D00D1C5E1 /* Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BD03214D8F0D00D1C5E1 /* Shadow.swift */; }; 71 | BDF8BD06214D8F0D00D1C5E1 /* Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDF8BD03214D8F0D00D1C5E1 /* Shadow.swift */; }; 72 | D284B1051F79038B00D94AF3 /* UserInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D284B0FC1F79038B00D94AF3 /* UserInterface.framework */; }; 73 | D284B1381F7906DB00D94AF3 /* Info-iOS-Tests.plist in Resources */ = {isa = PBXBuildFile; fileRef = D284B12F1F7906DA00D94AF3 /* Info-iOS-Tests.plist */; }; 74 | D284B1391F7906DB00D94AF3 /* Info-tvOS-Tests.plist in Resources */ = {isa = PBXBuildFile; fileRef = D284B1301F7906DA00D94AF3 /* Info-tvOS-Tests.plist */; }; 75 | D284B13B1F7906DB00D94AF3 /* Info-macOS-Tests.plist in Resources */ = {isa = PBXBuildFile; fileRef = D284B1331F7906DA00D94AF3 /* Info-macOS-Tests.plist */; }; 76 | D284B1441F7908B100D94AF3 /* SharedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284B1321F7906DA00D94AF3 /* SharedTests.swift */; }; 77 | D284B1451F7908B200D94AF3 /* SharedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284B1321F7906DA00D94AF3 /* SharedTests.swift */; }; 78 | D284B1461F7908B300D94AF3 /* SharedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284B1321F7906DA00D94AF3 /* SharedTests.swift */; }; 79 | D284B1471F7908B800D94AF3 /* UICollectionViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D284B1361F7906DA00D94AF3 /* UICollectionViewTests.swift */; }; 80 | D5B2E8AA1C3A780C00C0327D /* UserInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5B2E89F1C3A780C00C0327D /* UserInterface.framework */; }; 81 | D5C6294A1C3A7FAA007F7B7C /* UserInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5C629401C3A7FAA007F7B7C /* UserInterface.framework */; }; 82 | /* End PBXBuildFile section */ 83 | 84 | /* Begin PBXContainerItemProxy section */ 85 | D284B1061F79038B00D94AF3 /* PBXContainerItemProxy */ = { 86 | isa = PBXContainerItemProxy; 87 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 88 | proxyType = 1; 89 | remoteGlobalIDString = D284B0FB1F79038B00D94AF3; 90 | remoteInfo = "UserInterface-tvOS"; 91 | }; 92 | D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */ = { 93 | isa = PBXContainerItemProxy; 94 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 95 | proxyType = 1; 96 | remoteGlobalIDString = D5B2E89E1C3A780C00C0327D; 97 | remoteInfo = UserInterface; 98 | }; 99 | D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */ = { 100 | isa = PBXContainerItemProxy; 101 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 102 | proxyType = 1; 103 | remoteGlobalIDString = D5C6293F1C3A7FAA007F7B7C; 104 | remoteInfo = "UserInterface-Mac"; 105 | }; 106 | /* End PBXContainerItemProxy section */ 107 | 108 | /* Begin PBXFileReference section */ 109 | BD25DC0B20AC0A3300BFC86C /* UIImageViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageViewTests.swift; sourceTree = ""; }; 110 | BD25DC0E20AC0A5C00BFC86C /* UIButtonTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIButtonTests.swift; sourceTree = ""; }; 111 | BD25DC1120AC0A7B00BFC86C /* UILabelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabelTests.swift; sourceTree = ""; }; 112 | BD2CF3EC20AB06C700888874 /* UILabel+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Extensions.swift"; sourceTree = ""; }; 113 | BD2CF3EF20AB07C500888874 /* UIImageView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Extensions.swift"; sourceTree = ""; }; 114 | BD2CF3F220AB0BDC00888874 /* UIButton+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extensions.swift"; sourceTree = ""; }; 115 | BD6C775D2096ECC500ADB5BC /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 116 | BD6C775E2096F89600ADB5BC /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; 117 | BD7221D62094F2A900D28B9C /* UserInterfaceItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceItem.swift; sourceTree = ""; }; 118 | BD7221D72094F2A900D28B9C /* UserInterfaceLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceLabel.swift; sourceTree = ""; }; 119 | BD7221D82094F2A900D28B9C /* UserInterfaceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceView.swift; sourceTree = ""; }; 120 | BD7221E22094F37500D28B9C /* TypeAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeAlias.swift; sourceTree = ""; }; 121 | BD7221E42094F39200D28B9C /* NSLayoutConstraint+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+Extensions.swift"; sourceTree = ""; }; 122 | BD7221E62094F3AB00D28B9C /* UICollectionViewCell+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionViewCell+Extensions.swift"; sourceTree = ""; }; 123 | BD7221E72094F3AB00D28B9C /* UICollectionView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Extensions.swift"; sourceTree = ""; }; 124 | BD7221EF2094F3E000D28B9C /* UITableViewCell+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+Extensions.swift"; sourceTree = ""; }; 125 | BD7221F02094F3E000D28B9C /* UITableView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Extensions.swift"; sourceTree = ""; }; 126 | BD7221F52094F40100D28B9C /* View+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Extensions.swift"; sourceTree = ""; }; 127 | BD7222002094F4D500D28B9C /* NSLayoutConstraints+iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraints+iOS.swift"; sourceTree = ""; }; 128 | BD722204209636BB00D28B9C /* NSCollectionView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSCollectionView+Extensions.swift"; sourceTree = ""; }; 129 | BD7222062096375700D28B9C /* NSCollectionViewItem+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSCollectionViewItem+Extensions.swift"; sourceTree = ""; }; 130 | BD722208209637C300D28B9C /* NSStackView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSStackView+Extensions.swift"; sourceTree = ""; }; 131 | BD72220A20963FFB00D28B9C /* NSTableView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTableView+Extensions.swift"; sourceTree = ""; }; 132 | BD72220C209640B800D28B9C /* NSTableRowView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTableRowView+Extensions.swift"; sourceTree = ""; }; 133 | BDD89C4C209700020041C951 /* UITableViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewTests.swift; sourceTree = ""; }; 134 | BDD89C4F209700C90041C951 /* UIStackViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackViewTests.swift; sourceTree = ""; }; 135 | BDD89C522097018B0041C951 /* UIViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewTests.swift; sourceTree = ""; }; 136 | BDD89C55209701D50041C951 /* NSLayoutConstraintsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintsTests.swift; sourceTree = ""; }; 137 | BDD89C58209704F50041C951 /* NSCollectionViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSCollectionViewTests.swift; sourceTree = ""; }; 138 | BDD89C59209704F50041C951 /* NSViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSViewTests.swift; sourceTree = ""; }; 139 | BDD89C5A209704F50041C951 /* NSTableViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTableViewTests.swift; sourceTree = ""; }; 140 | BDD89C5B209704F50041C951 /* NSStackViewViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSStackViewViewTests.swift; sourceTree = ""; }; 141 | BDD89C5C209704F50041C951 /* NSLayoutConstraintsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintsTests.swift; sourceTree = ""; }; 142 | BDD89C6220970DF30041C951 /* UserInterface.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = UserInterface.podspec; sourceTree = ""; }; 143 | BDD89C63209711220041C951 /* UIStackView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStackView+Extensions.swift"; sourceTree = ""; }; 144 | BDF8BCFC214D8A6D00D1C5E1 /* UIView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = ""; }; 145 | BDF8BCFF214D8D5700D1C5E1 /* UITextField+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Extensions.swift"; sourceTree = ""; }; 146 | BDF8BD03214D8F0D00D1C5E1 /* Shadow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shadow.swift; sourceTree = ""; }; 147 | D284B0FC1F79038B00D94AF3 /* UserInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UserInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 148 | D284B1041F79038B00D94AF3 /* UserInterface-tvOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UserInterface-tvOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 149 | D284B1181F79039F00D94AF3 /* UserInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UserInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 150 | D284B12F1F7906DA00D94AF3 /* Info-iOS-Tests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-iOS-Tests.plist"; sourceTree = ""; }; 151 | D284B1301F7906DA00D94AF3 /* Info-tvOS-Tests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-tvOS-Tests.plist"; sourceTree = ""; }; 152 | D284B1321F7906DA00D94AF3 /* SharedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedTests.swift; sourceTree = ""; }; 153 | D284B1331F7906DA00D94AF3 /* Info-macOS-Tests.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-macOS-Tests.plist"; sourceTree = ""; }; 154 | D284B1361F7906DA00D94AF3 /* UICollectionViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UICollectionViewTests.swift; sourceTree = ""; }; 155 | D284B1401F79081F00D94AF3 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 156 | D284B1411F79081F00D94AF3 /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = ""; }; 157 | D284B1421F79081F00D94AF3 /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = ""; }; 158 | D284B1431F79081F00D94AF3 /* Info-watchOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-watchOS.plist"; sourceTree = ""; }; 159 | D500FD111C3AABED00782D78 /* Playground-iOS.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "Playground-iOS.playground"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 160 | D500FD121C3AAC8E00782D78 /* Playground-macOS.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "Playground-macOS.playground"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 161 | D5B2E89F1C3A780C00C0327D /* UserInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UserInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 162 | D5B2E8A91C3A780C00C0327D /* UserInterface-iOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UserInterface-iOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 163 | D5C629401C3A7FAA007F7B7C /* UserInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UserInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 164 | D5C629491C3A7FAA007F7B7C /* UserInterface-macOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UserInterface-macOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 165 | /* End PBXFileReference section */ 166 | 167 | /* Begin PBXFrameworksBuildPhase section */ 168 | D284B0F81F79038B00D94AF3 /* Frameworks */ = { 169 | isa = PBXFrameworksBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | ); 173 | runOnlyForDeploymentPostprocessing = 0; 174 | }; 175 | D284B1011F79038B00D94AF3 /* Frameworks */ = { 176 | isa = PBXFrameworksBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | D284B1051F79038B00D94AF3 /* UserInterface.framework in Frameworks */, 180 | ); 181 | runOnlyForDeploymentPostprocessing = 0; 182 | }; 183 | D284B1141F79039F00D94AF3 /* Frameworks */ = { 184 | isa = PBXFrameworksBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | ); 188 | runOnlyForDeploymentPostprocessing = 0; 189 | }; 190 | D5B2E89B1C3A780C00C0327D /* Frameworks */ = { 191 | isa = PBXFrameworksBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | D5B2E8A61C3A780C00C0327D /* Frameworks */ = { 198 | isa = PBXFrameworksBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | D5B2E8AA1C3A780C00C0327D /* UserInterface.framework in Frameworks */, 202 | ); 203 | runOnlyForDeploymentPostprocessing = 0; 204 | }; 205 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */ = { 206 | isa = PBXFrameworksBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | D5C629461C3A7FAA007F7B7C /* Frameworks */ = { 213 | isa = PBXFrameworksBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | D5C6294A1C3A7FAA007F7B7C /* UserInterface.framework in Frameworks */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | /* End PBXFrameworksBuildPhase section */ 221 | 222 | /* Begin PBXGroup section */ 223 | BD7221E02094F34F00D28B9C /* Classes */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | BD7221D62094F2A900D28B9C /* UserInterfaceItem.swift */, 227 | BD7221D72094F2A900D28B9C /* UserInterfaceLabel.swift */, 228 | BD7221D82094F2A900D28B9C /* UserInterfaceView.swift */, 229 | ); 230 | path = Classes; 231 | sourceTree = ""; 232 | }; 233 | BD7221E12094F36F00D28B9C /* TypeAlias */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | BD7221E22094F37500D28B9C /* TypeAlias.swift */, 237 | ); 238 | path = TypeAlias; 239 | sourceTree = ""; 240 | }; 241 | BD7221E32094F38A00D28B9C /* Extensions */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | BD7221E42094F39200D28B9C /* NSLayoutConstraint+Extensions.swift */, 245 | BD7221F52094F40100D28B9C /* View+Extensions.swift */, 246 | ); 247 | path = Extensions; 248 | sourceTree = ""; 249 | }; 250 | BD7221E52094F39C00D28B9C /* Extensions */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | BD7222002094F4D500D28B9C /* NSLayoutConstraints+iOS.swift */, 254 | BD2CF3F220AB0BDC00888874 /* UIButton+Extensions.swift */, 255 | BD7221E72094F3AB00D28B9C /* UICollectionView+Extensions.swift */, 256 | BD7221E62094F3AB00D28B9C /* UICollectionViewCell+Extensions.swift */, 257 | BD2CF3EF20AB07C500888874 /* UIImageView+Extensions.swift */, 258 | BD2CF3EC20AB06C700888874 /* UILabel+Extensions.swift */, 259 | BDD89C63209711220041C951 /* UIStackView+Extensions.swift */, 260 | BD7221F02094F3E000D28B9C /* UITableView+Extensions.swift */, 261 | BD7221EF2094F3E000D28B9C /* UITableViewCell+Extensions.swift */, 262 | BDF8BCFC214D8A6D00D1C5E1 /* UIView+Extensions.swift */, 263 | BDF8BCFF214D8D5700D1C5E1 /* UITextField+Extensions.swift */, 264 | ); 265 | path = Extensions; 266 | sourceTree = ""; 267 | }; 268 | BD722203209636A800D28B9C /* Extensions */ = { 269 | isa = PBXGroup; 270 | children = ( 271 | BD722204209636BB00D28B9C /* NSCollectionView+Extensions.swift */, 272 | BD7222062096375700D28B9C /* NSCollectionViewItem+Extensions.swift */, 273 | BD722208209637C300D28B9C /* NSStackView+Extensions.swift */, 274 | BD72220C209640B800D28B9C /* NSTableRowView+Extensions.swift */, 275 | BD72220A20963FFB00D28B9C /* NSTableView+Extensions.swift */, 276 | ); 277 | path = Extensions; 278 | sourceTree = ""; 279 | }; 280 | BDF8BD02214D8EFD00D1C5E1 /* Structs */ = { 281 | isa = PBXGroup; 282 | children = ( 283 | BDF8BD03214D8F0D00D1C5E1 /* Shadow.swift */, 284 | ); 285 | path = Structs; 286 | sourceTree = ""; 287 | }; 288 | D284B0F41F79024300D94AF3 /* macOS */ = { 289 | isa = PBXGroup; 290 | children = ( 291 | BD722203209636A800D28B9C /* Extensions */, 292 | BD7221E02094F34F00D28B9C /* Classes */, 293 | ); 294 | path = macOS; 295 | sourceTree = ""; 296 | }; 297 | D284B1211F79041300D94AF3 /* watchOS */ = { 298 | isa = PBXGroup; 299 | children = ( 300 | ); 301 | path = watchOS; 302 | sourceTree = ""; 303 | }; 304 | D284B12D1F7906DA00D94AF3 /* macOS */ = { 305 | isa = PBXGroup; 306 | children = ( 307 | BDD89C58209704F50041C951 /* NSCollectionViewTests.swift */, 308 | BDD89C5C209704F50041C951 /* NSLayoutConstraintsTests.swift */, 309 | BDD89C5B209704F50041C951 /* NSStackViewViewTests.swift */, 310 | BDD89C5A209704F50041C951 /* NSTableViewTests.swift */, 311 | BDD89C59209704F50041C951 /* NSViewTests.swift */, 312 | ); 313 | path = macOS; 314 | sourceTree = ""; 315 | }; 316 | D284B1311F7906DA00D94AF3 /* Shared */ = { 317 | isa = PBXGroup; 318 | children = ( 319 | D284B1321F7906DA00D94AF3 /* SharedTests.swift */, 320 | ); 321 | path = Shared; 322 | sourceTree = ""; 323 | }; 324 | D284B1351F7906DA00D94AF3 /* iOS+tvOS */ = { 325 | isa = PBXGroup; 326 | children = ( 327 | BDD89C55209701D50041C951 /* NSLayoutConstraintsTests.swift */, 328 | D284B1361F7906DA00D94AF3 /* UICollectionViewTests.swift */, 329 | BDD89C4F209700C90041C951 /* UIStackViewTests.swift */, 330 | BDD89C4C209700020041C951 /* UITableViewTests.swift */, 331 | BDD89C522097018B0041C951 /* UIViewTests.swift */, 332 | BD25DC0B20AC0A3300BFC86C /* UIImageViewTests.swift */, 333 | BD25DC0E20AC0A5C00BFC86C /* UIButtonTests.swift */, 334 | BD25DC1120AC0A7B00BFC86C /* UILabelTests.swift */, 335 | ); 336 | path = "iOS+tvOS"; 337 | sourceTree = ""; 338 | }; 339 | D284B13F1F79081F00D94AF3 /* Info */ = { 340 | isa = PBXGroup; 341 | children = ( 342 | D284B1401F79081F00D94AF3 /* Info-iOS.plist */, 343 | D284B1411F79081F00D94AF3 /* Info-macOS.plist */, 344 | D284B1421F79081F00D94AF3 /* Info-tvOS.plist */, 345 | D284B1431F79081F00D94AF3 /* Info-watchOS.plist */, 346 | ); 347 | path = Info; 348 | sourceTree = ""; 349 | }; 350 | D5B2E8951C3A780C00C0327D = { 351 | isa = PBXGroup; 352 | children = ( 353 | BDD89C6220970DF30041C951 /* UserInterface.podspec */, 354 | BD6C775E2096F89600ADB5BC /* .travis.yml */, 355 | BD6C775D2096ECC500ADB5BC /* README.md */, 356 | D500FD111C3AABED00782D78 /* Playground-iOS.playground */, 357 | D500FD121C3AAC8E00782D78 /* Playground-macOS.playground */, 358 | D284B13F1F79081F00D94AF3 /* Info */, 359 | D5C629691C3A809D007F7B7C /* Source */, 360 | D5C6298F1C3A8BDA007F7B7C /* Tests */, 361 | D5B2E8A01C3A780C00C0327D /* Products */, 362 | ); 363 | sourceTree = ""; 364 | }; 365 | D5B2E8A01C3A780C00C0327D /* Products */ = { 366 | isa = PBXGroup; 367 | children = ( 368 | D5B2E89F1C3A780C00C0327D /* UserInterface.framework */, 369 | D5B2E8A91C3A780C00C0327D /* UserInterface-iOS-Tests.xctest */, 370 | D5C629401C3A7FAA007F7B7C /* UserInterface.framework */, 371 | D5C629491C3A7FAA007F7B7C /* UserInterface-macOS-Tests.xctest */, 372 | D284B0FC1F79038B00D94AF3 /* UserInterface.framework */, 373 | D284B1041F79038B00D94AF3 /* UserInterface-tvOS-Tests.xctest */, 374 | D284B1181F79039F00D94AF3 /* UserInterface.framework */, 375 | ); 376 | name = Products; 377 | sourceTree = ""; 378 | }; 379 | D5C629691C3A809D007F7B7C /* Source */ = { 380 | isa = PBXGroup; 381 | children = ( 382 | D5C6296A1C3A809D007F7B7C /* iOS+tvOS */, 383 | D284B0F41F79024300D94AF3 /* macOS */, 384 | D5C6296E1C3A809D007F7B7C /* Shared */, 385 | D284B1211F79041300D94AF3 /* watchOS */, 386 | ); 387 | path = Source; 388 | sourceTree = ""; 389 | }; 390 | D5C6296A1C3A809D007F7B7C /* iOS+tvOS */ = { 391 | isa = PBXGroup; 392 | children = ( 393 | BD7221E52094F39C00D28B9C /* Extensions */, 394 | ); 395 | path = "iOS+tvOS"; 396 | sourceTree = ""; 397 | }; 398 | D5C6296E1C3A809D007F7B7C /* Shared */ = { 399 | isa = PBXGroup; 400 | children = ( 401 | BDF8BD02214D8EFD00D1C5E1 /* Structs */, 402 | BD7221E32094F38A00D28B9C /* Extensions */, 403 | BD7221E12094F36F00D28B9C /* TypeAlias */, 404 | ); 405 | path = Shared; 406 | sourceTree = ""; 407 | }; 408 | D5C6298F1C3A8BDA007F7B7C /* Tests */ = { 409 | isa = PBXGroup; 410 | children = ( 411 | D284B12F1F7906DA00D94AF3 /* Info-iOS-Tests.plist */, 412 | D284B1331F7906DA00D94AF3 /* Info-macOS-Tests.plist */, 413 | D284B1301F7906DA00D94AF3 /* Info-tvOS-Tests.plist */, 414 | D284B1351F7906DA00D94AF3 /* iOS+tvOS */, 415 | D284B12D1F7906DA00D94AF3 /* macOS */, 416 | D284B1311F7906DA00D94AF3 /* Shared */, 417 | ); 418 | path = Tests; 419 | sourceTree = ""; 420 | }; 421 | /* End PBXGroup section */ 422 | 423 | /* Begin PBXHeadersBuildPhase section */ 424 | D284B0F91F79038B00D94AF3 /* Headers */ = { 425 | isa = PBXHeadersBuildPhase; 426 | buildActionMask = 2147483647; 427 | files = ( 428 | ); 429 | runOnlyForDeploymentPostprocessing = 0; 430 | }; 431 | D284B1151F79039F00D94AF3 /* Headers */ = { 432 | isa = PBXHeadersBuildPhase; 433 | buildActionMask = 2147483647; 434 | files = ( 435 | ); 436 | runOnlyForDeploymentPostprocessing = 0; 437 | }; 438 | D5B2E89C1C3A780C00C0327D /* Headers */ = { 439 | isa = PBXHeadersBuildPhase; 440 | buildActionMask = 2147483647; 441 | files = ( 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | D5C6293D1C3A7FAA007F7B7C /* Headers */ = { 446 | isa = PBXHeadersBuildPhase; 447 | buildActionMask = 2147483647; 448 | files = ( 449 | ); 450 | runOnlyForDeploymentPostprocessing = 0; 451 | }; 452 | /* End PBXHeadersBuildPhase section */ 453 | 454 | /* Begin PBXNativeTarget section */ 455 | D284B0FB1F79038B00D94AF3 /* UserInterface-tvOS */ = { 456 | isa = PBXNativeTarget; 457 | buildConfigurationList = D284B10D1F79038B00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-tvOS" */; 458 | buildPhases = ( 459 | D284B0F71F79038B00D94AF3 /* Sources */, 460 | D284B0F81F79038B00D94AF3 /* Frameworks */, 461 | D284B0F91F79038B00D94AF3 /* Headers */, 462 | D284B0FA1F79038B00D94AF3 /* Resources */, 463 | ); 464 | buildRules = ( 465 | ); 466 | dependencies = ( 467 | ); 468 | name = "UserInterface-tvOS"; 469 | productName = "UserInterface-tvOS"; 470 | productReference = D284B0FC1F79038B00D94AF3 /* UserInterface.framework */; 471 | productType = "com.apple.product-type.framework"; 472 | }; 473 | D284B1031F79038B00D94AF3 /* UserInterface-tvOS-Tests */ = { 474 | isa = PBXNativeTarget; 475 | buildConfigurationList = D284B1101F79038B00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-tvOS-Tests" */; 476 | buildPhases = ( 477 | D284B1001F79038B00D94AF3 /* Sources */, 478 | D284B1011F79038B00D94AF3 /* Frameworks */, 479 | D284B1021F79038B00D94AF3 /* Resources */, 480 | ); 481 | buildRules = ( 482 | ); 483 | dependencies = ( 484 | D284B1071F79038B00D94AF3 /* PBXTargetDependency */, 485 | ); 486 | name = "UserInterface-tvOS-Tests"; 487 | productName = "UserInterface-tvOSTests"; 488 | productReference = D284B1041F79038B00D94AF3 /* UserInterface-tvOS-Tests.xctest */; 489 | productType = "com.apple.product-type.bundle.unit-test"; 490 | }; 491 | D284B1171F79039F00D94AF3 /* UserInterface-watchOS */ = { 492 | isa = PBXNativeTarget; 493 | buildConfigurationList = D284B11D1F79039F00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-watchOS" */; 494 | buildPhases = ( 495 | D284B1131F79039F00D94AF3 /* Sources */, 496 | D284B1141F79039F00D94AF3 /* Frameworks */, 497 | D284B1151F79039F00D94AF3 /* Headers */, 498 | D284B1161F79039F00D94AF3 /* Resources */, 499 | ); 500 | buildRules = ( 501 | ); 502 | dependencies = ( 503 | ); 504 | name = "UserInterface-watchOS"; 505 | productName = "UserInterface-watchOS"; 506 | productReference = D284B1181F79039F00D94AF3 /* UserInterface.framework */; 507 | productType = "com.apple.product-type.framework"; 508 | }; 509 | D5B2E89E1C3A780C00C0327D /* UserInterface-iOS */ = { 510 | isa = PBXNativeTarget; 511 | buildConfigurationList = D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "UserInterface-iOS" */; 512 | buildPhases = ( 513 | D5B2E89A1C3A780C00C0327D /* Sources */, 514 | D5B2E89B1C3A780C00C0327D /* Frameworks */, 515 | D5B2E89C1C3A780C00C0327D /* Headers */, 516 | D5B2E89D1C3A780C00C0327D /* Resources */, 517 | ); 518 | buildRules = ( 519 | ); 520 | dependencies = ( 521 | ); 522 | name = "UserInterface-iOS"; 523 | productName = UserInterface; 524 | productReference = D5B2E89F1C3A780C00C0327D /* UserInterface.framework */; 525 | productType = "com.apple.product-type.framework"; 526 | }; 527 | D5B2E8A81C3A780C00C0327D /* UserInterface-iOS-Tests */ = { 528 | isa = PBXNativeTarget; 529 | buildConfigurationList = D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "UserInterface-iOS-Tests" */; 530 | buildPhases = ( 531 | D5B2E8A51C3A780C00C0327D /* Sources */, 532 | D5B2E8A61C3A780C00C0327D /* Frameworks */, 533 | D5B2E8A71C3A780C00C0327D /* Resources */, 534 | ); 535 | buildRules = ( 536 | ); 537 | dependencies = ( 538 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */, 539 | ); 540 | name = "UserInterface-iOS-Tests"; 541 | productName = UserInterfaceTests; 542 | productReference = D5B2E8A91C3A780C00C0327D /* UserInterface-iOS-Tests.xctest */; 543 | productType = "com.apple.product-type.bundle.unit-test"; 544 | }; 545 | D5C6293F1C3A7FAA007F7B7C /* UserInterface-macOS */ = { 546 | isa = PBXNativeTarget; 547 | buildConfigurationList = D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "UserInterface-macOS" */; 548 | buildPhases = ( 549 | D5C6293B1C3A7FAA007F7B7C /* Sources */, 550 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */, 551 | D5C6293D1C3A7FAA007F7B7C /* Headers */, 552 | D5C6293E1C3A7FAA007F7B7C /* Resources */, 553 | ); 554 | buildRules = ( 555 | ); 556 | dependencies = ( 557 | ); 558 | name = "UserInterface-macOS"; 559 | productName = "UserInterface-Mac"; 560 | productReference = D5C629401C3A7FAA007F7B7C /* UserInterface.framework */; 561 | productType = "com.apple.product-type.framework"; 562 | }; 563 | D5C629481C3A7FAA007F7B7C /* UserInterface-macOS-Tests */ = { 564 | isa = PBXNativeTarget; 565 | buildConfigurationList = D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "UserInterface-macOS-Tests" */; 566 | buildPhases = ( 567 | D5C629451C3A7FAA007F7B7C /* Sources */, 568 | D5C629461C3A7FAA007F7B7C /* Frameworks */, 569 | D5C629471C3A7FAA007F7B7C /* Resources */, 570 | ); 571 | buildRules = ( 572 | ); 573 | dependencies = ( 574 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */, 575 | ); 576 | name = "UserInterface-macOS-Tests"; 577 | productName = "UserInterface-MacTests"; 578 | productReference = D5C629491C3A7FAA007F7B7C /* UserInterface-macOS-Tests.xctest */; 579 | productType = "com.apple.product-type.bundle.unit-test"; 580 | }; 581 | /* End PBXNativeTarget section */ 582 | 583 | /* Begin PBXProject section */ 584 | D5B2E8961C3A780C00C0327D /* Project object */ = { 585 | isa = PBXProject; 586 | attributes = { 587 | LastSwiftUpdateCheck = 0900; 588 | LastUpgradeCheck = 0930; 589 | ORGANIZATIONNAME = "Christoffer Winterkvist"; 590 | TargetAttributes = { 591 | D284B0FB1F79038B00D94AF3 = { 592 | CreatedOnToolsVersion = 9.0; 593 | LastSwiftMigration = 0900; 594 | ProvisioningStyle = Automatic; 595 | }; 596 | D284B1031F79038B00D94AF3 = { 597 | CreatedOnToolsVersion = 9.0; 598 | LastSwiftMigration = 0900; 599 | ProvisioningStyle = Automatic; 600 | }; 601 | D284B1171F79039F00D94AF3 = { 602 | CreatedOnToolsVersion = 9.0; 603 | LastSwiftMigration = 0900; 604 | ProvisioningStyle = Automatic; 605 | }; 606 | D5B2E89E1C3A780C00C0327D = { 607 | CreatedOnToolsVersion = 7.2; 608 | LastSwiftMigration = 0900; 609 | }; 610 | D5B2E8A81C3A780C00C0327D = { 611 | CreatedOnToolsVersion = 7.2; 612 | LastSwiftMigration = 0900; 613 | }; 614 | D5C6293F1C3A7FAA007F7B7C = { 615 | CreatedOnToolsVersion = 7.2; 616 | }; 617 | D5C629481C3A7FAA007F7B7C = { 618 | CreatedOnToolsVersion = 7.2; 619 | }; 620 | }; 621 | }; 622 | buildConfigurationList = D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "UserInterface" */; 623 | compatibilityVersion = "Xcode 3.2"; 624 | developmentRegion = English; 625 | hasScannedForEncodings = 0; 626 | knownRegions = ( 627 | en, 628 | ); 629 | mainGroup = D5B2E8951C3A780C00C0327D; 630 | productRefGroup = D5B2E8A01C3A780C00C0327D /* Products */; 631 | projectDirPath = ""; 632 | projectRoot = ""; 633 | targets = ( 634 | D5B2E89E1C3A780C00C0327D /* UserInterface-iOS */, 635 | D5B2E8A81C3A780C00C0327D /* UserInterface-iOS-Tests */, 636 | D5C6293F1C3A7FAA007F7B7C /* UserInterface-macOS */, 637 | D5C629481C3A7FAA007F7B7C /* UserInterface-macOS-Tests */, 638 | D284B0FB1F79038B00D94AF3 /* UserInterface-tvOS */, 639 | D284B1031F79038B00D94AF3 /* UserInterface-tvOS-Tests */, 640 | D284B1171F79039F00D94AF3 /* UserInterface-watchOS */, 641 | ); 642 | }; 643 | /* End PBXProject section */ 644 | 645 | /* Begin PBXResourcesBuildPhase section */ 646 | D284B0FA1F79038B00D94AF3 /* Resources */ = { 647 | isa = PBXResourcesBuildPhase; 648 | buildActionMask = 2147483647; 649 | files = ( 650 | ); 651 | runOnlyForDeploymentPostprocessing = 0; 652 | }; 653 | D284B1021F79038B00D94AF3 /* Resources */ = { 654 | isa = PBXResourcesBuildPhase; 655 | buildActionMask = 2147483647; 656 | files = ( 657 | ); 658 | runOnlyForDeploymentPostprocessing = 0; 659 | }; 660 | D284B1161F79039F00D94AF3 /* Resources */ = { 661 | isa = PBXResourcesBuildPhase; 662 | buildActionMask = 2147483647; 663 | files = ( 664 | D284B1391F7906DB00D94AF3 /* Info-tvOS-Tests.plist in Resources */, 665 | D284B1381F7906DB00D94AF3 /* Info-iOS-Tests.plist in Resources */, 666 | D284B13B1F7906DB00D94AF3 /* Info-macOS-Tests.plist in Resources */, 667 | ); 668 | runOnlyForDeploymentPostprocessing = 0; 669 | }; 670 | D5B2E89D1C3A780C00C0327D /* Resources */ = { 671 | isa = PBXResourcesBuildPhase; 672 | buildActionMask = 2147483647; 673 | files = ( 674 | ); 675 | runOnlyForDeploymentPostprocessing = 0; 676 | }; 677 | D5B2E8A71C3A780C00C0327D /* Resources */ = { 678 | isa = PBXResourcesBuildPhase; 679 | buildActionMask = 2147483647; 680 | files = ( 681 | ); 682 | runOnlyForDeploymentPostprocessing = 0; 683 | }; 684 | D5C6293E1C3A7FAA007F7B7C /* Resources */ = { 685 | isa = PBXResourcesBuildPhase; 686 | buildActionMask = 2147483647; 687 | files = ( 688 | ); 689 | runOnlyForDeploymentPostprocessing = 0; 690 | }; 691 | D5C629471C3A7FAA007F7B7C /* Resources */ = { 692 | isa = PBXResourcesBuildPhase; 693 | buildActionMask = 2147483647; 694 | files = ( 695 | ); 696 | runOnlyForDeploymentPostprocessing = 0; 697 | }; 698 | /* End PBXResourcesBuildPhase section */ 699 | 700 | /* Begin PBXSourcesBuildPhase section */ 701 | D284B0F71F79038B00D94AF3 /* Sources */ = { 702 | isa = PBXSourcesBuildPhase; 703 | buildActionMask = 2147483647; 704 | files = ( 705 | BD7221F42094F3E000D28B9C /* UITableView+Extensions.swift in Sources */, 706 | BD2CF3F420AB0BDC00888874 /* UIButton+Extensions.swift in Sources */, 707 | BD7221EB2094F3BD00D28B9C /* UICollectionView+Extensions.swift in Sources */, 708 | BD7221FA2094F41D00D28B9C /* TypeAlias.swift in Sources */, 709 | BD7221EC2094F3BD00D28B9C /* UICollectionViewCell+Extensions.swift in Sources */, 710 | BDF8BCFE214D8A6D00D1C5E1 /* UIView+Extensions.swift in Sources */, 711 | BD7221F22094F3E000D28B9C /* UITableViewCell+Extensions.swift in Sources */, 712 | BDF8BD01214D8D5700D1C5E1 /* UITextField+Extensions.swift in Sources */, 713 | BD7221FF2094F43400D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */, 714 | BD2CF3F120AB07C500888874 /* UIImageView+Extensions.swift in Sources */, 715 | BD2CF3EE20AB06C700888874 /* UILabel+Extensions.swift in Sources */, 716 | BD7221F72094F41100D28B9C /* View+Extensions.swift in Sources */, 717 | BDF8BD06214D8F0D00D1C5E1 /* Shadow.swift in Sources */, 718 | BDD89C65209711220041C951 /* UIStackView+Extensions.swift in Sources */, 719 | BD7222022094F4D500D28B9C /* NSLayoutConstraints+iOS.swift in Sources */, 720 | ); 721 | runOnlyForDeploymentPostprocessing = 0; 722 | }; 723 | D284B1001F79038B00D94AF3 /* Sources */ = { 724 | isa = PBXSourcesBuildPhase; 725 | buildActionMask = 2147483647; 726 | files = ( 727 | BDD89C542097018B0041C951 /* UIViewTests.swift in Sources */, 728 | BD25DC1320AC0A7B00BFC86C /* UILabelTests.swift in Sources */, 729 | BDD89C4E209700020041C951 /* UITableViewTests.swift in Sources */, 730 | BD6C775F2096F99C00ADB5BC /* UICollectionViewTests.swift in Sources */, 731 | BD25DC1020AC0A5C00BFC86C /* UIButtonTests.swift in Sources */, 732 | BDD89C57209701D50041C951 /* NSLayoutConstraintsTests.swift in Sources */, 733 | BD25DC0D20AC0A3300BFC86C /* UIImageViewTests.swift in Sources */, 734 | D284B1441F7908B100D94AF3 /* SharedTests.swift in Sources */, 735 | BDD89C51209700C90041C951 /* UIStackViewTests.swift in Sources */, 736 | ); 737 | runOnlyForDeploymentPostprocessing = 0; 738 | }; 739 | D284B1131F79039F00D94AF3 /* Sources */ = { 740 | isa = PBXSourcesBuildPhase; 741 | buildActionMask = 2147483647; 742 | files = ( 743 | ); 744 | runOnlyForDeploymentPostprocessing = 0; 745 | }; 746 | D5B2E89A1C3A780C00C0327D /* Sources */ = { 747 | isa = PBXSourcesBuildPhase; 748 | buildActionMask = 2147483647; 749 | files = ( 750 | BD7221F32094F3E000D28B9C /* UITableView+Extensions.swift in Sources */, 751 | BD2CF3F320AB0BDC00888874 /* UIButton+Extensions.swift in Sources */, 752 | BD7221ED2094F3BE00D28B9C /* UICollectionView+Extensions.swift in Sources */, 753 | BD7221FC2094F41E00D28B9C /* TypeAlias.swift in Sources */, 754 | BD7221EE2094F3BE00D28B9C /* UICollectionViewCell+Extensions.swift in Sources */, 755 | BDF8BCFD214D8A6D00D1C5E1 /* UIView+Extensions.swift in Sources */, 756 | BD7221F12094F3E000D28B9C /* UITableViewCell+Extensions.swift in Sources */, 757 | BDF8BD00214D8D5700D1C5E1 /* UITextField+Extensions.swift in Sources */, 758 | BD7221FE2094F43300D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */, 759 | BD2CF3F020AB07C500888874 /* UIImageView+Extensions.swift in Sources */, 760 | BD2CF3ED20AB06C700888874 /* UILabel+Extensions.swift in Sources */, 761 | BD7221F82094F41200D28B9C /* View+Extensions.swift in Sources */, 762 | BDF8BD04214D8F0D00D1C5E1 /* Shadow.swift in Sources */, 763 | BDD89C64209711220041C951 /* UIStackView+Extensions.swift in Sources */, 764 | BD7222012094F4D500D28B9C /* NSLayoutConstraints+iOS.swift in Sources */, 765 | ); 766 | runOnlyForDeploymentPostprocessing = 0; 767 | }; 768 | D5B2E8A51C3A780C00C0327D /* Sources */ = { 769 | isa = PBXSourcesBuildPhase; 770 | buildActionMask = 2147483647; 771 | files = ( 772 | BDD89C532097018B0041C951 /* UIViewTests.swift in Sources */, 773 | BD25DC1220AC0A7B00BFC86C /* UILabelTests.swift in Sources */, 774 | BDD89C4D209700020041C951 /* UITableViewTests.swift in Sources */, 775 | D284B1461F7908B300D94AF3 /* SharedTests.swift in Sources */, 776 | BD25DC0F20AC0A5C00BFC86C /* UIButtonTests.swift in Sources */, 777 | BDD89C56209701D50041C951 /* NSLayoutConstraintsTests.swift in Sources */, 778 | BD25DC0C20AC0A3300BFC86C /* UIImageViewTests.swift in Sources */, 779 | D284B1471F7908B800D94AF3 /* UICollectionViewTests.swift in Sources */, 780 | BDD89C50209700C90041C951 /* UIStackViewTests.swift in Sources */, 781 | ); 782 | runOnlyForDeploymentPostprocessing = 0; 783 | }; 784 | D5C6293B1C3A7FAA007F7B7C /* Sources */ = { 785 | isa = PBXSourcesBuildPhase; 786 | buildActionMask = 2147483647; 787 | files = ( 788 | BD72220B20963FFB00D28B9C /* NSTableView+Extensions.swift in Sources */, 789 | BD72220D209640B800D28B9C /* NSTableRowView+Extensions.swift in Sources */, 790 | BD7221DB2094F2B100D28B9C /* UserInterfaceView.swift in Sources */, 791 | BD7221FD2094F43200D28B9C /* NSLayoutConstraint+Extensions.swift in Sources */, 792 | BD7222072096375800D28B9C /* NSCollectionViewItem+Extensions.swift in Sources */, 793 | BD7221D92094F2AF00D28B9C /* UserInterfaceItem.swift in Sources */, 794 | BD7221F92094F41500D28B9C /* View+Extensions.swift in Sources */, 795 | BD722205209636BB00D28B9C /* NSCollectionView+Extensions.swift in Sources */, 796 | BD7221DA2094F2B100D28B9C /* UserInterfaceLabel.swift in Sources */, 797 | BDF8BD05214D8F0D00D1C5E1 /* Shadow.swift in Sources */, 798 | BD722209209637C300D28B9C /* NSStackView+Extensions.swift in Sources */, 799 | BD7221FB2094F41D00D28B9C /* TypeAlias.swift in Sources */, 800 | ); 801 | runOnlyForDeploymentPostprocessing = 0; 802 | }; 803 | D5C629451C3A7FAA007F7B7C /* Sources */ = { 804 | isa = PBXSourcesBuildPhase; 805 | buildActionMask = 2147483647; 806 | files = ( 807 | BDD89C5D209704F50041C951 /* NSCollectionViewTests.swift in Sources */, 808 | BDD89C5F209704F50041C951 /* NSTableViewTests.swift in Sources */, 809 | D284B1451F7908B200D94AF3 /* SharedTests.swift in Sources */, 810 | BDD89C61209704F50041C951 /* NSLayoutConstraintsTests.swift in Sources */, 811 | BDD89C60209704F50041C951 /* NSStackViewViewTests.swift in Sources */, 812 | BDD89C5E209704F50041C951 /* NSViewTests.swift in Sources */, 813 | ); 814 | runOnlyForDeploymentPostprocessing = 0; 815 | }; 816 | /* End PBXSourcesBuildPhase section */ 817 | 818 | /* Begin PBXTargetDependency section */ 819 | D284B1071F79038B00D94AF3 /* PBXTargetDependency */ = { 820 | isa = PBXTargetDependency; 821 | target = D284B0FB1F79038B00D94AF3 /* UserInterface-tvOS */; 822 | targetProxy = D284B1061F79038B00D94AF3 /* PBXContainerItemProxy */; 823 | }; 824 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */ = { 825 | isa = PBXTargetDependency; 826 | target = D5B2E89E1C3A780C00C0327D /* UserInterface-iOS */; 827 | targetProxy = D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */; 828 | }; 829 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */ = { 830 | isa = PBXTargetDependency; 831 | target = D5C6293F1C3A7FAA007F7B7C /* UserInterface-macOS */; 832 | targetProxy = D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */; 833 | }; 834 | /* End PBXTargetDependency section */ 835 | 836 | /* Begin XCBuildConfiguration section */ 837 | D284B10E1F79038B00D94AF3 /* Debug */ = { 838 | isa = XCBuildConfiguration; 839 | buildSettings = { 840 | CLANG_ANALYZER_NONNULL = YES; 841 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 842 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 843 | CLANG_ENABLE_MODULES = YES; 844 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 845 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 846 | CODE_SIGN_IDENTITY = ""; 847 | CODE_SIGN_STYLE = Automatic; 848 | DEFINES_MODULE = YES; 849 | DYLIB_COMPATIBILITY_VERSION = 1; 850 | DYLIB_CURRENT_VERSION = 1; 851 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 852 | GCC_C_LANGUAGE_STANDARD = gnu11; 853 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-tvOS.plist"; 854 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 855 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 856 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-tvOS"; 857 | PRODUCT_NAME = UserInterface; 858 | SDKROOT = appletvos; 859 | SKIP_INSTALL = YES; 860 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 861 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 862 | SWIFT_VERSION = 4.2; 863 | TARGETED_DEVICE_FAMILY = 3; 864 | TVOS_DEPLOYMENT_TARGET = 11.0; 865 | }; 866 | name = Debug; 867 | }; 868 | D284B10F1F79038B00D94AF3 /* Release */ = { 869 | isa = XCBuildConfiguration; 870 | buildSettings = { 871 | CLANG_ANALYZER_NONNULL = YES; 872 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 873 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 874 | CLANG_ENABLE_MODULES = YES; 875 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 876 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 877 | CODE_SIGN_IDENTITY = ""; 878 | CODE_SIGN_STYLE = Automatic; 879 | DEFINES_MODULE = YES; 880 | DYLIB_COMPATIBILITY_VERSION = 1; 881 | DYLIB_CURRENT_VERSION = 1; 882 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 883 | GCC_C_LANGUAGE_STANDARD = gnu11; 884 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-tvOS.plist"; 885 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 886 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 887 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-tvOS"; 888 | PRODUCT_NAME = UserInterface; 889 | SDKROOT = appletvos; 890 | SKIP_INSTALL = YES; 891 | SWIFT_VERSION = 4.2; 892 | TARGETED_DEVICE_FAMILY = 3; 893 | TVOS_DEPLOYMENT_TARGET = 11.0; 894 | }; 895 | name = Release; 896 | }; 897 | D284B1111F79038B00D94AF3 /* Debug */ = { 898 | isa = XCBuildConfiguration; 899 | buildSettings = { 900 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 901 | CLANG_ANALYZER_NONNULL = YES; 902 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 903 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 904 | CLANG_ENABLE_MODULES = YES; 905 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 906 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 907 | CODE_SIGN_STYLE = Automatic; 908 | GCC_C_LANGUAGE_STANDARD = gnu11; 909 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-tvOS-Tests.plist"; 910 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 911 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-tvOSTests"; 912 | PRODUCT_NAME = "$(TARGET_NAME)"; 913 | SDKROOT = appletvos; 914 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 915 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 916 | SWIFT_VERSION = 4.2; 917 | TARGETED_DEVICE_FAMILY = 3; 918 | TVOS_DEPLOYMENT_TARGET = 11.0; 919 | }; 920 | name = Debug; 921 | }; 922 | D284B1121F79038B00D94AF3 /* Release */ = { 923 | isa = XCBuildConfiguration; 924 | buildSettings = { 925 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 926 | CLANG_ANALYZER_NONNULL = YES; 927 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 928 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 929 | CLANG_ENABLE_MODULES = YES; 930 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 931 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 932 | CODE_SIGN_STYLE = Automatic; 933 | GCC_C_LANGUAGE_STANDARD = gnu11; 934 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-tvOS-Tests.plist"; 935 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 936 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-tvOSTests"; 937 | PRODUCT_NAME = "$(TARGET_NAME)"; 938 | SDKROOT = appletvos; 939 | SWIFT_VERSION = 4.2; 940 | TARGETED_DEVICE_FAMILY = 3; 941 | TVOS_DEPLOYMENT_TARGET = 11.0; 942 | }; 943 | name = Release; 944 | }; 945 | D284B11E1F79039F00D94AF3 /* Debug */ = { 946 | isa = XCBuildConfiguration; 947 | buildSettings = { 948 | APPLICATION_EXTENSION_API_ONLY = YES; 949 | CLANG_ANALYZER_NONNULL = YES; 950 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 951 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 952 | CLANG_ENABLE_MODULES = YES; 953 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 954 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 955 | CODE_SIGN_IDENTITY = ""; 956 | CODE_SIGN_STYLE = Automatic; 957 | DEFINES_MODULE = YES; 958 | DYLIB_COMPATIBILITY_VERSION = 1; 959 | DYLIB_CURRENT_VERSION = 1; 960 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 961 | GCC_C_LANGUAGE_STANDARD = gnu11; 962 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-watchOS.plist"; 963 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 964 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 965 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-watchOS"; 966 | PRODUCT_NAME = UserInterface; 967 | SDKROOT = watchos; 968 | SKIP_INSTALL = YES; 969 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 970 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 971 | SWIFT_VERSION = 4.2; 972 | TARGETED_DEVICE_FAMILY = 4; 973 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 974 | }; 975 | name = Debug; 976 | }; 977 | D284B11F1F79039F00D94AF3 /* Release */ = { 978 | isa = XCBuildConfiguration; 979 | buildSettings = { 980 | APPLICATION_EXTENSION_API_ONLY = YES; 981 | CLANG_ANALYZER_NONNULL = YES; 982 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 983 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 984 | CLANG_ENABLE_MODULES = YES; 985 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 986 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 987 | CODE_SIGN_IDENTITY = ""; 988 | CODE_SIGN_STYLE = Automatic; 989 | DEFINES_MODULE = YES; 990 | DYLIB_COMPATIBILITY_VERSION = 1; 991 | DYLIB_CURRENT_VERSION = 1; 992 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 993 | GCC_C_LANGUAGE_STANDARD = gnu11; 994 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-watchOS.plist"; 995 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 996 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 997 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-watchOS"; 998 | PRODUCT_NAME = UserInterface; 999 | SDKROOT = watchos; 1000 | SKIP_INSTALL = YES; 1001 | SWIFT_VERSION = 4.2; 1002 | TARGETED_DEVICE_FAMILY = 4; 1003 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 1004 | }; 1005 | name = Release; 1006 | }; 1007 | D5B2E8B11C3A780C00C0327D /* Debug */ = { 1008 | isa = XCBuildConfiguration; 1009 | buildSettings = { 1010 | ALWAYS_SEARCH_USER_PATHS = NO; 1011 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1012 | CLANG_CXX_LIBRARY = "libc++"; 1013 | CLANG_ENABLE_MODULES = YES; 1014 | CLANG_ENABLE_OBJC_ARC = YES; 1015 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1016 | CLANG_WARN_BOOL_CONVERSION = YES; 1017 | CLANG_WARN_COMMA = YES; 1018 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1019 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1020 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1021 | CLANG_WARN_EMPTY_BODY = YES; 1022 | CLANG_WARN_ENUM_CONVERSION = YES; 1023 | CLANG_WARN_INFINITE_RECURSION = YES; 1024 | CLANG_WARN_INT_CONVERSION = YES; 1025 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1026 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1027 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1028 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1029 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1030 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1031 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1032 | CLANG_WARN_UNREACHABLE_CODE = YES; 1033 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1034 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1035 | COPY_PHASE_STRIP = NO; 1036 | CURRENT_PROJECT_VERSION = 1; 1037 | DEBUG_INFORMATION_FORMAT = dwarf; 1038 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1039 | ENABLE_TESTABILITY = YES; 1040 | GCC_C_LANGUAGE_STANDARD = gnu99; 1041 | GCC_DYNAMIC_NO_PIC = NO; 1042 | GCC_NO_COMMON_BLOCKS = YES; 1043 | GCC_OPTIMIZATION_LEVEL = 0; 1044 | GCC_PREPROCESSOR_DEFINITIONS = ( 1045 | "DEBUG=1", 1046 | "$(inherited)", 1047 | ); 1048 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1049 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1050 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1051 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1052 | GCC_WARN_UNUSED_FUNCTION = YES; 1053 | GCC_WARN_UNUSED_VARIABLE = YES; 1054 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 1055 | MTL_ENABLE_DEBUG_INFO = YES; 1056 | ONLY_ACTIVE_ARCH = YES; 1057 | SDKROOT = iphoneos; 1058 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1059 | SWIFT_VERSION = 4.2; 1060 | TARGETED_DEVICE_FAMILY = "1,2"; 1061 | VERSIONING_SYSTEM = "apple-generic"; 1062 | VERSION_INFO_PREFIX = ""; 1063 | }; 1064 | name = Debug; 1065 | }; 1066 | D5B2E8B21C3A780C00C0327D /* Release */ = { 1067 | isa = XCBuildConfiguration; 1068 | buildSettings = { 1069 | ALWAYS_SEARCH_USER_PATHS = NO; 1070 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1071 | CLANG_CXX_LIBRARY = "libc++"; 1072 | CLANG_ENABLE_MODULES = YES; 1073 | CLANG_ENABLE_OBJC_ARC = YES; 1074 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1075 | CLANG_WARN_BOOL_CONVERSION = YES; 1076 | CLANG_WARN_COMMA = YES; 1077 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1078 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1079 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1080 | CLANG_WARN_EMPTY_BODY = YES; 1081 | CLANG_WARN_ENUM_CONVERSION = YES; 1082 | CLANG_WARN_INFINITE_RECURSION = YES; 1083 | CLANG_WARN_INT_CONVERSION = YES; 1084 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1085 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1086 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1087 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1088 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1089 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1090 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1091 | CLANG_WARN_UNREACHABLE_CODE = YES; 1092 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1093 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1094 | COPY_PHASE_STRIP = NO; 1095 | CURRENT_PROJECT_VERSION = 1; 1096 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1097 | ENABLE_NS_ASSERTIONS = NO; 1098 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1099 | GCC_C_LANGUAGE_STANDARD = gnu99; 1100 | GCC_NO_COMMON_BLOCKS = YES; 1101 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1102 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1103 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1104 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1105 | GCC_WARN_UNUSED_FUNCTION = YES; 1106 | GCC_WARN_UNUSED_VARIABLE = YES; 1107 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 1108 | MTL_ENABLE_DEBUG_INFO = NO; 1109 | SDKROOT = iphoneos; 1110 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 1111 | SWIFT_VERSION = 4.2; 1112 | TARGETED_DEVICE_FAMILY = "1,2"; 1113 | VALIDATE_PRODUCT = YES; 1114 | VERSIONING_SYSTEM = "apple-generic"; 1115 | VERSION_INFO_PREFIX = ""; 1116 | }; 1117 | name = Release; 1118 | }; 1119 | D5B2E8B41C3A780C00C0327D /* Debug */ = { 1120 | isa = XCBuildConfiguration; 1121 | buildSettings = { 1122 | CLANG_ENABLE_MODULES = YES; 1123 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 1124 | DEFINES_MODULE = YES; 1125 | DYLIB_COMPATIBILITY_VERSION = 1; 1126 | DYLIB_CURRENT_VERSION = 1; 1127 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1128 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-iOS.plist"; 1129 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1130 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1131 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1132 | PRODUCT_BUNDLE_IDENTIFIER = "com.zenangst.UserInterface-iOS"; 1133 | PRODUCT_NAME = UserInterface; 1134 | SKIP_INSTALL = YES; 1135 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1136 | SWIFT_VERSION = 4.2; 1137 | }; 1138 | name = Debug; 1139 | }; 1140 | D5B2E8B51C3A780C00C0327D /* Release */ = { 1141 | isa = XCBuildConfiguration; 1142 | buildSettings = { 1143 | CLANG_ENABLE_MODULES = YES; 1144 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 1145 | DEFINES_MODULE = YES; 1146 | DYLIB_COMPATIBILITY_VERSION = 1; 1147 | DYLIB_CURRENT_VERSION = 1; 1148 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1149 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-iOS.plist"; 1150 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1151 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1152 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1153 | PRODUCT_BUNDLE_IDENTIFIER = "com.zenangst.UserInterface-iOS"; 1154 | PRODUCT_NAME = UserInterface; 1155 | SKIP_INSTALL = YES; 1156 | SWIFT_VERSION = 4.2; 1157 | }; 1158 | name = Release; 1159 | }; 1160 | D5B2E8B71C3A780C00C0327D /* Debug */ = { 1161 | isa = XCBuildConfiguration; 1162 | buildSettings = { 1163 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1164 | CLANG_ENABLE_MODULES = YES; 1165 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 1166 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-iOS-Tests.plist"; 1167 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 1168 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 1169 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.UserInterfaceTests; 1170 | PRODUCT_NAME = "$(TARGET_NAME)"; 1171 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1172 | SWIFT_VERSION = 4.2; 1173 | }; 1174 | name = Debug; 1175 | }; 1176 | D5B2E8B81C3A780C00C0327D /* Release */ = { 1177 | isa = XCBuildConfiguration; 1178 | buildSettings = { 1179 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1180 | CLANG_ENABLE_MODULES = YES; 1181 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 1182 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-iOS-Tests.plist"; 1183 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 1184 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 1185 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.UserInterfaceTests; 1186 | PRODUCT_NAME = "$(TARGET_NAME)"; 1187 | SWIFT_VERSION = 4.2; 1188 | }; 1189 | name = Release; 1190 | }; 1191 | D5C629521C3A7FAA007F7B7C /* Debug */ = { 1192 | isa = XCBuildConfiguration; 1193 | buildSettings = { 1194 | CLANG_ENABLE_MODULES = YES; 1195 | CODE_SIGN_IDENTITY = "-"; 1196 | COMBINE_HIDPI_IMAGES = YES; 1197 | DEFINES_MODULE = YES; 1198 | DYLIB_COMPATIBILITY_VERSION = 1; 1199 | DYLIB_CURRENT_VERSION = 1; 1200 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1201 | FRAMEWORK_VERSION = A; 1202 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-macOS.plist"; 1203 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1204 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 1205 | MACOSX_DEPLOYMENT_TARGET = 10.11; 1206 | PRODUCT_BUNDLE_IDENTIFIER = "com.zenangst.UserInterface-macOS"; 1207 | PRODUCT_NAME = UserInterface; 1208 | SDKROOT = macosx; 1209 | SKIP_INSTALL = YES; 1210 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1211 | SWIFT_VERSION = 4.2; 1212 | }; 1213 | name = Debug; 1214 | }; 1215 | D5C629531C3A7FAA007F7B7C /* Release */ = { 1216 | isa = XCBuildConfiguration; 1217 | buildSettings = { 1218 | CLANG_ENABLE_MODULES = YES; 1219 | CODE_SIGN_IDENTITY = "-"; 1220 | COMBINE_HIDPI_IMAGES = YES; 1221 | DEFINES_MODULE = YES; 1222 | DYLIB_COMPATIBILITY_VERSION = 1; 1223 | DYLIB_CURRENT_VERSION = 1; 1224 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1225 | FRAMEWORK_VERSION = A; 1226 | INFOPLIST_FILE = "$(SRCROOT)/Info/Info-macOS.plist"; 1227 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1228 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 1229 | MACOSX_DEPLOYMENT_TARGET = 10.11; 1230 | PRODUCT_BUNDLE_IDENTIFIER = "com.zenangst.UserInterface-macOS"; 1231 | PRODUCT_NAME = UserInterface; 1232 | SDKROOT = macosx; 1233 | SKIP_INSTALL = YES; 1234 | SWIFT_VERSION = 4.2; 1235 | }; 1236 | name = Release; 1237 | }; 1238 | D5C629551C3A7FAA007F7B7C /* Debug */ = { 1239 | isa = XCBuildConfiguration; 1240 | buildSettings = { 1241 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1242 | CODE_SIGN_IDENTITY = "-"; 1243 | COMBINE_HIDPI_IMAGES = YES; 1244 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 1245 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-macOS-Tests.plist"; 1246 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 1247 | MACOSX_DEPLOYMENT_TARGET = 10.11; 1248 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-MacTests"; 1249 | PRODUCT_NAME = "$(TARGET_NAME)"; 1250 | SDKROOT = macosx; 1251 | SWIFT_VERSION = 4.2; 1252 | }; 1253 | name = Debug; 1254 | }; 1255 | D5C629561C3A7FAA007F7B7C /* Release */ = { 1256 | isa = XCBuildConfiguration; 1257 | buildSettings = { 1258 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1259 | CODE_SIGN_IDENTITY = "-"; 1260 | COMBINE_HIDPI_IMAGES = YES; 1261 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 1262 | INFOPLIST_FILE = "$(SRCROOT)/Tests/Info-macOS-Tests.plist"; 1263 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(FRAMEWORK_SEARCH_PATHS)"; 1264 | MACOSX_DEPLOYMENT_TARGET = 10.11; 1265 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.UserInterface-MacTests"; 1266 | PRODUCT_NAME = "$(TARGET_NAME)"; 1267 | SDKROOT = macosx; 1268 | SWIFT_VERSION = 4.2; 1269 | }; 1270 | name = Release; 1271 | }; 1272 | /* End XCBuildConfiguration section */ 1273 | 1274 | /* Begin XCConfigurationList section */ 1275 | D284B10D1F79038B00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-tvOS" */ = { 1276 | isa = XCConfigurationList; 1277 | buildConfigurations = ( 1278 | D284B10E1F79038B00D94AF3 /* Debug */, 1279 | D284B10F1F79038B00D94AF3 /* Release */, 1280 | ); 1281 | defaultConfigurationIsVisible = 0; 1282 | defaultConfigurationName = Release; 1283 | }; 1284 | D284B1101F79038B00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-tvOS-Tests" */ = { 1285 | isa = XCConfigurationList; 1286 | buildConfigurations = ( 1287 | D284B1111F79038B00D94AF3 /* Debug */, 1288 | D284B1121F79038B00D94AF3 /* Release */, 1289 | ); 1290 | defaultConfigurationIsVisible = 0; 1291 | defaultConfigurationName = Release; 1292 | }; 1293 | D284B11D1F79039F00D94AF3 /* Build configuration list for PBXNativeTarget "UserInterface-watchOS" */ = { 1294 | isa = XCConfigurationList; 1295 | buildConfigurations = ( 1296 | D284B11E1F79039F00D94AF3 /* Debug */, 1297 | D284B11F1F79039F00D94AF3 /* Release */, 1298 | ); 1299 | defaultConfigurationIsVisible = 0; 1300 | defaultConfigurationName = Release; 1301 | }; 1302 | D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "UserInterface" */ = { 1303 | isa = XCConfigurationList; 1304 | buildConfigurations = ( 1305 | D5B2E8B11C3A780C00C0327D /* Debug */, 1306 | D5B2E8B21C3A780C00C0327D /* Release */, 1307 | ); 1308 | defaultConfigurationIsVisible = 0; 1309 | defaultConfigurationName = Release; 1310 | }; 1311 | D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "UserInterface-iOS" */ = { 1312 | isa = XCConfigurationList; 1313 | buildConfigurations = ( 1314 | D5B2E8B41C3A780C00C0327D /* Debug */, 1315 | D5B2E8B51C3A780C00C0327D /* Release */, 1316 | ); 1317 | defaultConfigurationIsVisible = 0; 1318 | defaultConfigurationName = Release; 1319 | }; 1320 | D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "UserInterface-iOS-Tests" */ = { 1321 | isa = XCConfigurationList; 1322 | buildConfigurations = ( 1323 | D5B2E8B71C3A780C00C0327D /* Debug */, 1324 | D5B2E8B81C3A780C00C0327D /* Release */, 1325 | ); 1326 | defaultConfigurationIsVisible = 0; 1327 | defaultConfigurationName = Release; 1328 | }; 1329 | D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "UserInterface-macOS" */ = { 1330 | isa = XCConfigurationList; 1331 | buildConfigurations = ( 1332 | D5C629521C3A7FAA007F7B7C /* Debug */, 1333 | D5C629531C3A7FAA007F7B7C /* Release */, 1334 | ); 1335 | defaultConfigurationIsVisible = 0; 1336 | defaultConfigurationName = Release; 1337 | }; 1338 | D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "UserInterface-macOS-Tests" */ = { 1339 | isa = XCConfigurationList; 1340 | buildConfigurations = ( 1341 | D5C629551C3A7FAA007F7B7C /* Debug */, 1342 | D5C629561C3A7FAA007F7B7C /* Release */, 1343 | ); 1344 | defaultConfigurationIsVisible = 0; 1345 | defaultConfigurationName = Release; 1346 | }; 1347 | /* End XCConfigurationList section */ 1348 | }; 1349 | rootObject = D5B2E8961C3A780C00C0327D /* Project object */; 1350 | } 1351 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/xcshareddata/xcschemes/UserInterface-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/xcshareddata/xcschemes/UserInterface-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 48 | 54 | 55 | 56 | 57 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 79 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 98 | 104 | 105 | 106 | 107 | 109 | 110 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/xcshareddata/xcschemes/UserInterface-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /UserInterface.xcodeproj/xcshareddata/xcschemes/UserInterface-watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /bin/bootstrap: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | carthage bootstrap --platform iOS,Mac 4 | cp Cartfile.resolved Carthage -------------------------------------------------------------------------------- /bin/bootstrap-if-needed: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if ! cmp -s Cartfile.resolved Carthage/Cartfile.resolved; then 4 | bin/bootstrap 5 | fi -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | xcode: 3 | version: "9.0" 4 | 5 | dependencies: 6 | override: 7 | - bin/bootstrap-if-needed 8 | UserInterface_directories: 9 | - "Carthage" 10 | 11 | test: 12 | override: 13 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-macOS" -sdk macosx clean build 14 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-macOS" -sdk macosx -enableCodeCoverage YES test 15 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-iOS" -sdk iphonesimulator clean build 16 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-iOS" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 8,OS=11.0' -enableCodeCoverage YES test 17 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-tvOS" -destination 'platform=tvOS Simulator,name=Apple TV,OS=11.0' clean build 18 | - set -o pipefail && xcodebuild -project UserInterface.xcodeproj -scheme "UserInterface-tvOS" -destination 'platform=tvOS Simulator,name=Apple TV,OS=11.0' -enableCodeCoverage YES test 19 | --------------------------------------------------------------------------------