├── .gitignore ├── IronKeyboard.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── takuto.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── takuto.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── IronKeyboard ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-83.5@2x.png │ │ ├── Icon-Notification.png │ │ ├── Icon-Notification@2x-1.png │ │ ├── Icon-Notification@2x.png │ │ ├── Icon-Notification@3x.png │ │ ├── Icon-Small-40.png │ │ ├── Icon-Small-40@2x-1.png │ │ ├── Icon-Small-40@2x.png │ │ ├── Icon-Small-40@3x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small@2x-1.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon-Small@3x.png │ │ └── icon.png │ ├── Contents.json │ └── bgColor.colorset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist └── ViewController.swift ├── Keyboard ├── Assets.xcassets │ ├── Contents.json │ ├── bgColor.colorset │ │ └── Contents.json │ ├── neonColor.colorset │ │ └── Contents.json │ └── neonColorH.colorset │ │ └── Contents.json ├── Background.swift ├── CustomView.swift ├── Info.plist ├── Key.swift ├── KeyboardViewController.swift ├── Line0.swift ├── Line1.swift ├── Line2.swift ├── Line3.swift ├── Line4.swift ├── Line5.swift ├── Line6.swift ├── Line7.swift ├── Line8.swift └── Line9.swift ├── README.md └── resources └── file-0.gif /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | materials/ 3 | -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1C2B43522516215C00057D14 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43512516215C00057D14 /* AppDelegate.swift */; }; 11 | 1C2B43562516215C00057D14 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43552516215C00057D14 /* ViewController.swift */; }; 12 | 1C2B43592516215C00057D14 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C2B43572516215C00057D14 /* Main.storyboard */; }; 13 | 1C2B435B2516215E00057D14 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1C2B435A2516215E00057D14 /* Assets.xcassets */; }; 14 | 1C2B435E2516215E00057D14 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C2B435C2516215E00057D14 /* LaunchScreen.storyboard */; }; 15 | 1C2B438425166AF700057D14 /* KeyboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B438325166AF700057D14 /* KeyboardViewController.swift */; }; 16 | 1C2B438825166AF700057D14 /* Keyboard.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1C2B438125166AF700057D14 /* Keyboard.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 17 | 1C2B438D25166B0900057D14 /* Line1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43692516421F00057D14 /* Line1.swift */; }; 18 | 1C2B438E25166B0900057D14 /* Line4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B436F251651A400057D14 /* Line4.swift */; }; 19 | 1C2B438F25166B0900057D14 /* Line2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B436B25164D0700057D14 /* Line2.swift */; }; 20 | 1C2B439025166B0900057D14 /* Line5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B4371251652FD00057D14 /* Line5.swift */; }; 21 | 1C2B439125166B0900057D14 /* Line6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43732516540800057D14 /* Line6.swift */; }; 22 | 1C2B439225166B0900057D14 /* Line8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43772516541E00057D14 /* Line8.swift */; }; 23 | 1C2B439325166B0900057D14 /* Line9.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43792516543600057D14 /* Line9.swift */; }; 24 | 1C2B439425166B0900057D14 /* Line7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43752516541400057D14 /* Line7.swift */; }; 25 | 1C2B439525166B0900057D14 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B436725163D1900057D14 /* Background.swift */; }; 26 | 1C2B439625166B0900057D14 /* Line3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B436D2516516D00057D14 /* Line3.swift */; }; 27 | 1C2B439725166B0900057D14 /* Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B437B2516627F00057D14 /* Key.swift */; }; 28 | 1C2B439825166B1E00057D14 /* CustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B43652516217C00057D14 /* CustomView.swift */; }; 29 | 1C2B439A25166D4200057D14 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1C2B439925166D4200057D14 /* Assets.xcassets */; }; 30 | 1C2B439C25166E7D00057D14 /* Line0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2B439B25166E7D00057D14 /* Line0.swift */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXContainerItemProxy section */ 34 | 1C2B438625166AF700057D14 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = 1C2B43462516215C00057D14 /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = 1C2B438025166AF700057D14; 39 | remoteInfo = Keyboard; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXCopyFilesBuildPhase section */ 44 | 1C2B438C25166AF700057D14 /* Embed App Extensions */ = { 45 | isa = PBXCopyFilesBuildPhase; 46 | buildActionMask = 2147483647; 47 | dstPath = ""; 48 | dstSubfolderSpec = 13; 49 | files = ( 50 | 1C2B438825166AF700057D14 /* Keyboard.appex in Embed App Extensions */, 51 | ); 52 | name = "Embed App Extensions"; 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXCopyFilesBuildPhase section */ 56 | 57 | /* Begin PBXFileReference section */ 58 | 1C2B434E2516215C00057D14 /* IronKeyboard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IronKeyboard.app; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 1C2B43512516215C00057D14 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 60 | 1C2B43552516215C00057D14 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 61 | 1C2B43582516215C00057D14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 62 | 1C2B435A2516215E00057D14 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 63 | 1C2B435D2516215E00057D14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 64 | 1C2B435F2516215E00057D14 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | 1C2B43652516217C00057D14 /* CustomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomView.swift; sourceTree = ""; }; 66 | 1C2B436725163D1900057D14 /* Background.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Background.swift; sourceTree = ""; }; 67 | 1C2B43692516421F00057D14 /* Line1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line1.swift; sourceTree = ""; }; 68 | 1C2B436B25164D0700057D14 /* Line2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line2.swift; sourceTree = ""; }; 69 | 1C2B436D2516516D00057D14 /* Line3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line3.swift; sourceTree = ""; }; 70 | 1C2B436F251651A400057D14 /* Line4.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line4.swift; sourceTree = ""; }; 71 | 1C2B4371251652FD00057D14 /* Line5.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line5.swift; sourceTree = ""; }; 72 | 1C2B43732516540800057D14 /* Line6.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line6.swift; sourceTree = ""; }; 73 | 1C2B43752516541400057D14 /* Line7.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line7.swift; sourceTree = ""; }; 74 | 1C2B43772516541E00057D14 /* Line8.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line8.swift; sourceTree = ""; }; 75 | 1C2B43792516543600057D14 /* Line9.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line9.swift; sourceTree = ""; }; 76 | 1C2B437B2516627F00057D14 /* Key.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Key.swift; sourceTree = ""; }; 77 | 1C2B438125166AF700057D14 /* Keyboard.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Keyboard.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 78 | 1C2B438325166AF700057D14 /* KeyboardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardViewController.swift; sourceTree = ""; }; 79 | 1C2B438525166AF700057D14 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 80 | 1C2B439925166D4200057D14 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 81 | 1C2B439B25166E7D00057D14 /* Line0.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line0.swift; sourceTree = ""; }; 82 | /* End PBXFileReference section */ 83 | 84 | /* Begin PBXFrameworksBuildPhase section */ 85 | 1C2B434B2516215C00057D14 /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | 1C2B437E25166AF700057D14 /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | ); 97 | runOnlyForDeploymentPostprocessing = 0; 98 | }; 99 | /* End PBXFrameworksBuildPhase section */ 100 | 101 | /* Begin PBXGroup section */ 102 | 1C2B43452516215C00057D14 = { 103 | isa = PBXGroup; 104 | children = ( 105 | 1C2B43502516215C00057D14 /* IronKeyboard */, 106 | 1C2B438225166AF700057D14 /* Keyboard */, 107 | 1C2B434F2516215C00057D14 /* Products */, 108 | ); 109 | sourceTree = ""; 110 | }; 111 | 1C2B434F2516215C00057D14 /* Products */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 1C2B434E2516215C00057D14 /* IronKeyboard.app */, 115 | 1C2B438125166AF700057D14 /* Keyboard.appex */, 116 | ); 117 | name = Products; 118 | sourceTree = ""; 119 | }; 120 | 1C2B43502516215C00057D14 /* IronKeyboard */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 1C2B43512516215C00057D14 /* AppDelegate.swift */, 124 | 1C2B43552516215C00057D14 /* ViewController.swift */, 125 | 1C2B43572516215C00057D14 /* Main.storyboard */, 126 | 1C2B435A2516215E00057D14 /* Assets.xcassets */, 127 | 1C2B435C2516215E00057D14 /* LaunchScreen.storyboard */, 128 | 1C2B435F2516215E00057D14 /* Info.plist */, 129 | ); 130 | path = IronKeyboard; 131 | sourceTree = ""; 132 | }; 133 | 1C2B438225166AF700057D14 /* Keyboard */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 1C2B438325166AF700057D14 /* KeyboardViewController.swift */, 137 | 1C2B43652516217C00057D14 /* CustomView.swift */, 138 | 1C2B436725163D1900057D14 /* Background.swift */, 139 | 1C2B437B2516627F00057D14 /* Key.swift */, 140 | 1C2B439B25166E7D00057D14 /* Line0.swift */, 141 | 1C2B43692516421F00057D14 /* Line1.swift */, 142 | 1C2B436B25164D0700057D14 /* Line2.swift */, 143 | 1C2B436D2516516D00057D14 /* Line3.swift */, 144 | 1C2B436F251651A400057D14 /* Line4.swift */, 145 | 1C2B4371251652FD00057D14 /* Line5.swift */, 146 | 1C2B43732516540800057D14 /* Line6.swift */, 147 | 1C2B43752516541400057D14 /* Line7.swift */, 148 | 1C2B43772516541E00057D14 /* Line8.swift */, 149 | 1C2B43792516543600057D14 /* Line9.swift */, 150 | 1C2B438525166AF700057D14 /* Info.plist */, 151 | 1C2B439925166D4200057D14 /* Assets.xcassets */, 152 | ); 153 | path = Keyboard; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXNativeTarget section */ 159 | 1C2B434D2516215C00057D14 /* IronKeyboard */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = 1C2B43622516215E00057D14 /* Build configuration list for PBXNativeTarget "IronKeyboard" */; 162 | buildPhases = ( 163 | 1C2B434A2516215C00057D14 /* Sources */, 164 | 1C2B434B2516215C00057D14 /* Frameworks */, 165 | 1C2B434C2516215C00057D14 /* Resources */, 166 | 1C2B438C25166AF700057D14 /* Embed App Extensions */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | 1C2B438725166AF700057D14 /* PBXTargetDependency */, 172 | ); 173 | name = IronKeyboard; 174 | productName = IronKeyboard; 175 | productReference = 1C2B434E2516215C00057D14 /* IronKeyboard.app */; 176 | productType = "com.apple.product-type.application"; 177 | }; 178 | 1C2B438025166AF700057D14 /* Keyboard */ = { 179 | isa = PBXNativeTarget; 180 | buildConfigurationList = 1C2B438925166AF700057D14 /* Build configuration list for PBXNativeTarget "Keyboard" */; 181 | buildPhases = ( 182 | 1C2B437D25166AF700057D14 /* Sources */, 183 | 1C2B437E25166AF700057D14 /* Frameworks */, 184 | 1C2B437F25166AF700057D14 /* Resources */, 185 | ); 186 | buildRules = ( 187 | ); 188 | dependencies = ( 189 | ); 190 | name = Keyboard; 191 | productName = Keyboard; 192 | productReference = 1C2B438125166AF700057D14 /* Keyboard.appex */; 193 | productType = "com.apple.product-type.app-extension"; 194 | }; 195 | /* End PBXNativeTarget section */ 196 | 197 | /* Begin PBXProject section */ 198 | 1C2B43462516215C00057D14 /* Project object */ = { 199 | isa = PBXProject; 200 | attributes = { 201 | LastSwiftUpdateCheck = 1170; 202 | LastUpgradeCheck = 1170; 203 | ORGANIZATIONNAME = "Takuto Nakamura"; 204 | TargetAttributes = { 205 | 1C2B434D2516215C00057D14 = { 206 | CreatedOnToolsVersion = 11.7; 207 | }; 208 | 1C2B438025166AF700057D14 = { 209 | CreatedOnToolsVersion = 11.7; 210 | }; 211 | }; 212 | }; 213 | buildConfigurationList = 1C2B43492516215C00057D14 /* Build configuration list for PBXProject "IronKeyboard" */; 214 | compatibilityVersion = "Xcode 9.3"; 215 | developmentRegion = en; 216 | hasScannedForEncodings = 0; 217 | knownRegions = ( 218 | en, 219 | Base, 220 | ); 221 | mainGroup = 1C2B43452516215C00057D14; 222 | productRefGroup = 1C2B434F2516215C00057D14 /* Products */; 223 | projectDirPath = ""; 224 | projectRoot = ""; 225 | targets = ( 226 | 1C2B434D2516215C00057D14 /* IronKeyboard */, 227 | 1C2B438025166AF700057D14 /* Keyboard */, 228 | ); 229 | }; 230 | /* End PBXProject section */ 231 | 232 | /* Begin PBXResourcesBuildPhase section */ 233 | 1C2B434C2516215C00057D14 /* Resources */ = { 234 | isa = PBXResourcesBuildPhase; 235 | buildActionMask = 2147483647; 236 | files = ( 237 | 1C2B435E2516215E00057D14 /* LaunchScreen.storyboard in Resources */, 238 | 1C2B435B2516215E00057D14 /* Assets.xcassets in Resources */, 239 | 1C2B43592516215C00057D14 /* Main.storyboard in Resources */, 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | }; 243 | 1C2B437F25166AF700057D14 /* Resources */ = { 244 | isa = PBXResourcesBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | 1C2B439A25166D4200057D14 /* Assets.xcassets in Resources */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | /* End PBXResourcesBuildPhase section */ 252 | 253 | /* Begin PBXSourcesBuildPhase section */ 254 | 1C2B434A2516215C00057D14 /* Sources */ = { 255 | isa = PBXSourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | 1C2B43562516215C00057D14 /* ViewController.swift in Sources */, 259 | 1C2B43522516215C00057D14 /* AppDelegate.swift in Sources */, 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | 1C2B437D25166AF700057D14 /* Sources */ = { 264 | isa = PBXSourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | 1C2B439C25166E7D00057D14 /* Line0.swift in Sources */, 268 | 1C2B438F25166B0900057D14 /* Line2.swift in Sources */, 269 | 1C2B439025166B0900057D14 /* Line5.swift in Sources */, 270 | 1C2B438425166AF700057D14 /* KeyboardViewController.swift in Sources */, 271 | 1C2B438E25166B0900057D14 /* Line4.swift in Sources */, 272 | 1C2B439125166B0900057D14 /* Line6.swift in Sources */, 273 | 1C2B439725166B0900057D14 /* Key.swift in Sources */, 274 | 1C2B439825166B1E00057D14 /* CustomView.swift in Sources */, 275 | 1C2B439225166B0900057D14 /* Line8.swift in Sources */, 276 | 1C2B438D25166B0900057D14 /* Line1.swift in Sources */, 277 | 1C2B439425166B0900057D14 /* Line7.swift in Sources */, 278 | 1C2B439325166B0900057D14 /* Line9.swift in Sources */, 279 | 1C2B439625166B0900057D14 /* Line3.swift in Sources */, 280 | 1C2B439525166B0900057D14 /* Background.swift in Sources */, 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | }; 284 | /* End PBXSourcesBuildPhase section */ 285 | 286 | /* Begin PBXTargetDependency section */ 287 | 1C2B438725166AF700057D14 /* PBXTargetDependency */ = { 288 | isa = PBXTargetDependency; 289 | target = 1C2B438025166AF700057D14 /* Keyboard */; 290 | targetProxy = 1C2B438625166AF700057D14 /* PBXContainerItemProxy */; 291 | }; 292 | /* End PBXTargetDependency section */ 293 | 294 | /* Begin PBXVariantGroup section */ 295 | 1C2B43572516215C00057D14 /* Main.storyboard */ = { 296 | isa = PBXVariantGroup; 297 | children = ( 298 | 1C2B43582516215C00057D14 /* Base */, 299 | ); 300 | name = Main.storyboard; 301 | sourceTree = ""; 302 | }; 303 | 1C2B435C2516215E00057D14 /* LaunchScreen.storyboard */ = { 304 | isa = PBXVariantGroup; 305 | children = ( 306 | 1C2B435D2516215E00057D14 /* Base */, 307 | ); 308 | name = LaunchScreen.storyboard; 309 | sourceTree = ""; 310 | }; 311 | /* End PBXVariantGroup section */ 312 | 313 | /* Begin XCBuildConfiguration section */ 314 | 1C2B43602516215E00057D14 /* Debug */ = { 315 | isa = XCBuildConfiguration; 316 | buildSettings = { 317 | ALWAYS_SEARCH_USER_PATHS = NO; 318 | CLANG_ANALYZER_NONNULL = YES; 319 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 320 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 321 | CLANG_CXX_LIBRARY = "libc++"; 322 | CLANG_ENABLE_MODULES = YES; 323 | CLANG_ENABLE_OBJC_ARC = YES; 324 | CLANG_ENABLE_OBJC_WEAK = YES; 325 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 326 | CLANG_WARN_BOOL_CONVERSION = YES; 327 | CLANG_WARN_COMMA = YES; 328 | CLANG_WARN_CONSTANT_CONVERSION = YES; 329 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 330 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 331 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 332 | CLANG_WARN_EMPTY_BODY = YES; 333 | CLANG_WARN_ENUM_CONVERSION = YES; 334 | CLANG_WARN_INFINITE_RECURSION = YES; 335 | CLANG_WARN_INT_CONVERSION = YES; 336 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 337 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 338 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 341 | CLANG_WARN_STRICT_PROTOTYPES = YES; 342 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 343 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | COPY_PHASE_STRIP = NO; 347 | DEBUG_INFORMATION_FORMAT = dwarf; 348 | ENABLE_STRICT_OBJC_MSGSEND = YES; 349 | ENABLE_TESTABILITY = YES; 350 | GCC_C_LANGUAGE_STANDARD = gnu11; 351 | GCC_DYNAMIC_NO_PIC = NO; 352 | GCC_NO_COMMON_BLOCKS = YES; 353 | GCC_OPTIMIZATION_LEVEL = 0; 354 | GCC_PREPROCESSOR_DEFINITIONS = ( 355 | "DEBUG=1", 356 | "$(inherited)", 357 | ); 358 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 359 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 360 | GCC_WARN_UNDECLARED_SELECTOR = YES; 361 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 362 | GCC_WARN_UNUSED_FUNCTION = YES; 363 | GCC_WARN_UNUSED_VARIABLE = YES; 364 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 365 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 366 | MTL_FAST_MATH = YES; 367 | ONLY_ACTIVE_ARCH = YES; 368 | SDKROOT = iphoneos; 369 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 370 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 371 | }; 372 | name = Debug; 373 | }; 374 | 1C2B43612516215E00057D14 /* Release */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ALWAYS_SEARCH_USER_PATHS = NO; 378 | CLANG_ANALYZER_NONNULL = YES; 379 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 380 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 381 | CLANG_CXX_LIBRARY = "libc++"; 382 | CLANG_ENABLE_MODULES = YES; 383 | CLANG_ENABLE_OBJC_ARC = YES; 384 | CLANG_ENABLE_OBJC_WEAK = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 392 | CLANG_WARN_EMPTY_BODY = YES; 393 | CLANG_WARN_ENUM_CONVERSION = YES; 394 | CLANG_WARN_INFINITE_RECURSION = YES; 395 | CLANG_WARN_INT_CONVERSION = YES; 396 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 397 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 398 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 400 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 401 | CLANG_WARN_STRICT_PROTOTYPES = YES; 402 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 403 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 404 | CLANG_WARN_UNREACHABLE_CODE = YES; 405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 406 | COPY_PHASE_STRIP = NO; 407 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 408 | ENABLE_NS_ASSERTIONS = NO; 409 | ENABLE_STRICT_OBJC_MSGSEND = YES; 410 | GCC_C_LANGUAGE_STANDARD = gnu11; 411 | GCC_NO_COMMON_BLOCKS = YES; 412 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 413 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 414 | GCC_WARN_UNDECLARED_SELECTOR = YES; 415 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 416 | GCC_WARN_UNUSED_FUNCTION = YES; 417 | GCC_WARN_UNUSED_VARIABLE = YES; 418 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 419 | MTL_ENABLE_DEBUG_INFO = NO; 420 | MTL_FAST_MATH = YES; 421 | SDKROOT = iphoneos; 422 | SWIFT_COMPILATION_MODE = wholemodule; 423 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 424 | VALIDATE_PRODUCT = YES; 425 | }; 426 | name = Release; 427 | }; 428 | 1C2B43632516215E00057D14 /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | buildSettings = { 431 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 432 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 433 | CODE_SIGN_STYLE = Automatic; 434 | DEVELOPMENT_TEAM = VJ5N2X84K8; 435 | INFOPLIST_FILE = IronKeyboard/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = ( 437 | "$(inherited)", 438 | "@executable_path/Frameworks", 439 | ); 440 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.IronKeyboard; 441 | PRODUCT_NAME = "$(TARGET_NAME)"; 442 | SWIFT_VERSION = 5.0; 443 | TARGETED_DEVICE_FAMILY = "1,2"; 444 | }; 445 | name = Debug; 446 | }; 447 | 1C2B43642516215E00057D14 /* Release */ = { 448 | isa = XCBuildConfiguration; 449 | buildSettings = { 450 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 451 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 452 | CODE_SIGN_STYLE = Automatic; 453 | DEVELOPMENT_TEAM = VJ5N2X84K8; 454 | INFOPLIST_FILE = IronKeyboard/Info.plist; 455 | LD_RUNPATH_SEARCH_PATHS = ( 456 | "$(inherited)", 457 | "@executable_path/Frameworks", 458 | ); 459 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.IronKeyboard; 460 | PRODUCT_NAME = "$(TARGET_NAME)"; 461 | SWIFT_VERSION = 5.0; 462 | TARGETED_DEVICE_FAMILY = "1,2"; 463 | }; 464 | name = Release; 465 | }; 466 | 1C2B438A25166AF700057D14 /* Debug */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | CODE_SIGN_STYLE = Automatic; 470 | DEVELOPMENT_TEAM = VJ5N2X84K8; 471 | INFOPLIST_FILE = Keyboard/Info.plist; 472 | LD_RUNPATH_SEARCH_PATHS = ( 473 | "$(inherited)", 474 | "@executable_path/Frameworks", 475 | "@executable_path/../../Frameworks", 476 | ); 477 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.IronKeyboard.Keyboard; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | SKIP_INSTALL = YES; 480 | SWIFT_VERSION = 5.0; 481 | TARGETED_DEVICE_FAMILY = "1,2"; 482 | }; 483 | name = Debug; 484 | }; 485 | 1C2B438B25166AF700057D14 /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | CODE_SIGN_STYLE = Automatic; 489 | DEVELOPMENT_TEAM = VJ5N2X84K8; 490 | INFOPLIST_FILE = Keyboard/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = ( 492 | "$(inherited)", 493 | "@executable_path/Frameworks", 494 | "@executable_path/../../Frameworks", 495 | ); 496 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.IronKeyboard.Keyboard; 497 | PRODUCT_NAME = "$(TARGET_NAME)"; 498 | SKIP_INSTALL = YES; 499 | SWIFT_VERSION = 5.0; 500 | TARGETED_DEVICE_FAMILY = "1,2"; 501 | }; 502 | name = Release; 503 | }; 504 | /* End XCBuildConfiguration section */ 505 | 506 | /* Begin XCConfigurationList section */ 507 | 1C2B43492516215C00057D14 /* Build configuration list for PBXProject "IronKeyboard" */ = { 508 | isa = XCConfigurationList; 509 | buildConfigurations = ( 510 | 1C2B43602516215E00057D14 /* Debug */, 511 | 1C2B43612516215E00057D14 /* Release */, 512 | ); 513 | defaultConfigurationIsVisible = 0; 514 | defaultConfigurationName = Release; 515 | }; 516 | 1C2B43622516215E00057D14 /* Build configuration list for PBXNativeTarget "IronKeyboard" */ = { 517 | isa = XCConfigurationList; 518 | buildConfigurations = ( 519 | 1C2B43632516215E00057D14 /* Debug */, 520 | 1C2B43642516215E00057D14 /* Release */, 521 | ); 522 | defaultConfigurationIsVisible = 0; 523 | defaultConfigurationName = Release; 524 | }; 525 | 1C2B438925166AF700057D14 /* Build configuration list for PBXNativeTarget "Keyboard" */ = { 526 | isa = XCConfigurationList; 527 | buildConfigurations = ( 528 | 1C2B438A25166AF700057D14 /* Debug */, 529 | 1C2B438B25166AF700057D14 /* Release */, 530 | ); 531 | defaultConfigurationIsVisible = 0; 532 | defaultConfigurationName = Release; 533 | }; 534 | /* End XCConfigurationList section */ 535 | }; 536 | rootObject = 1C2B43462516215C00057D14 /* Project object */; 537 | } 538 | -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/project.xcworkspace/xcuserdata/takuto.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard.xcodeproj/project.xcworkspace/xcuserdata/takuto.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/xcuserdata/takuto.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /IronKeyboard.xcodeproj/xcuserdata/takuto.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | IronKeyboard.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 1 11 | 12 | Keyboard.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /IronKeyboard/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | func applicationWillResignActive(_ application: UIApplication) { 22 | 23 | } 24 | 25 | func applicationDidEnterBackground(_ application: UIApplication) { 26 | 27 | } 28 | 29 | func applicationWillEnterForeground(_ application: UIApplication) { 30 | 31 | } 32 | 33 | func applicationDidBecomeActive(_ application: UIApplication) { 34 | 35 | } 36 | 37 | func applicationWillTerminate(_ application: UIApplication) { 38 | 39 | } 40 | 41 | 42 | } 43 | 44 | -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-Notification@2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "Icon-Notification@3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "Icon-Small@2x.png", 17 | "idiom" : "iphone", 18 | "scale" : "2x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "Icon-Small@3x.png", 23 | "idiom" : "iphone", 24 | "scale" : "3x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "Icon-Small-40@2x.png", 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "filename" : "Icon-Small-40@3x.png", 35 | "idiom" : "iphone", 36 | "scale" : "3x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "Icon-60@2x.png", 41 | "idiom" : "iphone", 42 | "scale" : "2x", 43 | "size" : "60x60" 44 | }, 45 | { 46 | "filename" : "Icon-60@3x.png", 47 | "idiom" : "iphone", 48 | "scale" : "3x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "Icon-Notification.png", 53 | "idiom" : "ipad", 54 | "scale" : "1x", 55 | "size" : "20x20" 56 | }, 57 | { 58 | "filename" : "Icon-Notification@2x-1.png", 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "Icon-Small.png", 65 | "idiom" : "ipad", 66 | "scale" : "1x", 67 | "size" : "29x29" 68 | }, 69 | { 70 | "filename" : "Icon-Small@2x-1.png", 71 | "idiom" : "ipad", 72 | "scale" : "2x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "Icon-Small-40.png", 77 | "idiom" : "ipad", 78 | "scale" : "1x", 79 | "size" : "40x40" 80 | }, 81 | { 82 | "filename" : "Icon-Small-40@2x-1.png", 83 | "idiom" : "ipad", 84 | "scale" : "2x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "Icon-76.png", 89 | "idiom" : "ipad", 90 | "scale" : "1x", 91 | "size" : "76x76" 92 | }, 93 | { 94 | "filename" : "Icon-76@2x.png", 95 | "idiom" : "ipad", 96 | "scale" : "2x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "Icon-83.5@2x.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "83.5x83.5" 104 | }, 105 | { 106 | "filename" : "icon.png", 107 | "idiom" : "ios-marketing", 108 | "scale" : "1x", 109 | "size" : "1024x1024" 110 | } 111 | ], 112 | "info" : { 113 | "author" : "xcode", 114 | "version" : 1 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@2x-1.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Notification@3x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/AppIcon.appiconset/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/IronKeyboard/Assets.xcassets/AppIcon.appiconset/icon.png -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /IronKeyboard/Assets.xcassets/bgColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.188", 9 | "green" : "0.165", 10 | "red" : "0.161" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /IronKeyboard/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 | -------------------------------------------------------------------------------- /IronKeyboard/Base.lproj/Main.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 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /IronKeyboard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | IronKeyboard 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /IronKeyboard/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do any additional setup after loading the view. 16 | } 17 | 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /Keyboard/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Keyboard/Assets.xcassets/bgColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.169", 9 | "green" : "0.169", 10 | "red" : "0.169" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Keyboard/Assets.xcassets/neonColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.596", 9 | "green" : "1.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Keyboard/Assets.xcassets/neonColorH.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.212", 9 | "green" : "0.792", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Keyboard/Background.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Background.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Background { 12 | 13 | static func path() -> UIBezierPath { 14 | let path = UIBezierPath() 15 | path.move(to: CGPoint(x: 115.301000, y: 110.1970)) 16 | path.addLine(to: CGPoint(x: 102.012000, y: 134.9420)) 17 | path.addCurve(to: CGPoint(x: 105.232000, y: 136.5100), 18 | controlPoint1: CGPoint(x: 103.098000, y: 135.4420), 19 | controlPoint2: CGPoint(x: 104.168000, y: 135.9720)) 20 | path.addLine(to: CGPoint(x: 111.708000, y: 125.8440)) 21 | path.addCurve(to: CGPoint(x: 120.581000, y: 130.6670), 22 | controlPoint1: CGPoint(x: 114.811000, y: 126.9640), 23 | controlPoint2: CGPoint(x: 117.762000, y: 128.5940)) 24 | path.addLine(to: CGPoint(x: 114.369000, y: 141.7770)) 25 | path.addCurve(to: CGPoint(x: 116.672000, y: 143.2970), 26 | controlPoint1: CGPoint(x: 115.140000, y: 142.2790), 27 | controlPoint2: CGPoint(x: 115.916000, y: 142.7740)) 28 | path.addLine(to: CGPoint(x: 132.224000, y: 119.9680)) 29 | path.addCurve(to: CGPoint(x: 115.301000, y: 110.1970), 30 | controlPoint1: CGPoint(x: 126.868000, y: 116.2910), 31 | controlPoint2: CGPoint(x: 121.213000, y: 113.0190)) 32 | path.close() 33 | 34 | path.move(to: CGPoint(x: 124.504000, y: 81.7550)) 35 | path.addLine(to: CGPoint(x: 112.752000, y: 102.7550)) 36 | path.addCurve(to: CGPoint(x: 117.549000, y: 104.9320), 37 | controlPoint1: CGPoint(x: 114.370000, y: 103.4450), 38 | controlPoint2: CGPoint(x: 115.965000, y: 104.1790)) 39 | path.addLine(to: CGPoint(x: 124.067000, y: 94.5960)) 40 | path.addCurve(to: CGPoint(x: 140.657000, y: 103.8090), 41 | controlPoint1: CGPoint(x: 130.121000, y: 97.5300), 42 | controlPoint2: CGPoint(x: 135.655000, y: 100.6000)) 43 | path.addLine(to: CGPoint(x: 134.992000, y: 114.9340)) 44 | path.addCurve(to: CGPoint(x: 138.843000, y: 117.6430), 45 | controlPoint1: CGPoint(x: 136.290000, y: 115.8170), 46 | controlPoint2: CGPoint(x: 137.578000, y: 116.7150)) 47 | path.addLine(to: CGPoint(x: 151.242000, y: 97.0390)) 48 | path.addCurve(to: CGPoint(x: 124.504000, y: 81.7550), 49 | controlPoint1: CGPoint(x: 142.904000, y: 91.1000), 50 | controlPoint2: CGPoint(x: 133.951000, y: 85.9740)) 51 | path.close() 52 | 53 | path.move(to: CGPoint(x: 133.119000, y: 54.8080)) 54 | path.addLine(to: CGPoint(x: 122.567000, y: 76.4400)) 55 | path.addCurve(to: CGPoint(x: 156.625000, y: 95.9000), 56 | controlPoint1: CGPoint(x: 134.763000, y: 81.5270), 57 | controlPoint2: CGPoint(x: 146.187000, y: 88.0910)) 58 | path.addLine(to: CGPoint(x: 169.973000, y: 75.8770)) 59 | path.addCurve(to: CGPoint(x: 133.119000, y: 54.8080), 60 | controlPoint1: CGPoint(x: 158.618000, y: 67.5060), 61 | controlPoint2: CGPoint(x: 146.263000, y: 60.4100)) 62 | path.close() 63 | 64 | path.move(to: CGPoint(x: 233.170000, y: 0.0000)) 65 | path.addLine(to: CGPoint(x: 170.689000, y: 0.0000)) 66 | path.addCurve(to: CGPoint(x: 232.523000, y: 43.0240), 67 | controlPoint1: CGPoint(x: 193.480000, y: 11.1760), 68 | controlPoint2: CGPoint(x: 214.306000, y: 25.7390)) 69 | path.addLine(to: CGPoint(x: 254.952000, y: 18.6080)) 70 | path.addCurve(to: CGPoint(x: 233.170000, y: 0.0000), 71 | controlPoint1: CGPoint(x: 248.014000, y: 12.0490), 72 | controlPoint2: CGPoint(x: 240.746000, y: 5.8340)) 73 | path.close() 74 | 75 | path.move(to: CGPoint(x: 254.952000, y: 18.6080)) 76 | path.addLine(to: CGPoint(x: 232.523000, y: 43.0240)) 77 | path.addCurve(to: CGPoint(x: 309.227000, y: 202.5570), 78 | controlPoint1: CGPoint(x: 275.556000, y: 83.8550), 79 | controlPoint2: CGPoint(x: 303.999000, y: 139.9040)) 80 | path.addLine(to: CGPoint(x: 341.334000, y: 190.4080)) 81 | path.addCurve(to: CGPoint(x: 254.952000, y: 18.6080), 82 | controlPoint1: CGPoint(x: 333.447000, y: 123.0040), 83 | controlPoint2: CGPoint(x: 301.779000, y: 62.8740)) 84 | path.close() 85 | 86 | path.move(to: CGPoint(x: 309.228000, y: 202.5570)) 87 | path.addCurve(to: CGPoint(x: 310.109000, y: 223.5220), 88 | controlPoint1: CGPoint(x: 309.805000, y: 209.4700), 89 | controlPoint2: CGPoint(x: 310.109000, y: 216.4600)) 90 | path.addCurve(to: CGPoint(x: 309.843000, y: 234.9750), 91 | controlPoint1: CGPoint(x: 310.109000, y: 227.3610), 92 | controlPoint2: CGPoint(x: 310.015000, y: 231.1780)) 93 | path.addLine(to: CGPoint(x: 343.035000, y: 234.9750)) 94 | path.addCurve(to: CGPoint(x: 343.263000, y: 223.5220), 95 | controlPoint1: CGPoint(x: 343.187000, y: 231.1760), 96 | controlPoint2: CGPoint(x: 343.263000, y: 227.3580)) 97 | path.addCurve(to: CGPoint(x: 341.335000, y: 190.4080), 98 | controlPoint1: CGPoint(x: 343.263000, y: 212.3190), 99 | controlPoint2: CGPoint(x: 342.606000, y: 201.2700)) 100 | path.addLine(to: CGPoint(x: 309.228000, y: 202.5570)) 101 | path.close() 102 | 103 | path.move(to: CGPoint(x: 295.014000, y: 0.0000)) 104 | path.addLine(to: CGPoint(x: 233.170000, y: 0.0000)) 105 | path.addCurve(to: CGPoint(x: 297.962000, y: 70.2140), 106 | controlPoint1: CGPoint(x: 258.537000, y: 19.5350), 107 | controlPoint2: CGPoint(x: 280.482000, y: 43.2920)) 108 | path.addLine(to: CGPoint(x: 332.168000, y: 47.4100)) 109 | path.addCurve(to: CGPoint(x: 295.014000, y: 0.0000), 110 | controlPoint1: CGPoint(x: 321.341000, y: 30.5900), 111 | controlPoint2: CGPoint(x: 308.918000, y: 14.8120)) 112 | path.close() 113 | 114 | path.move(to: CGPoint(x: 345.675000, y: 70.5070)) 115 | path.addCurve(to: CGPoint(x: 332.169000, y: 47.4100), 116 | controlPoint1: CGPoint(x: 341.498000, y: 62.5960), 117 | controlPoint2: CGPoint(x: 336.990000, y: 54.9000)) 118 | path.addLine(to: CGPoint(x: 297.963000, y: 70.2140)) 119 | path.addCurve(to: CGPoint(x: 313.529000, y: 97.4030), 120 | controlPoint1: CGPoint(x: 303.637000, y: 78.9540), 121 | controlPoint2: CGPoint(x: 308.832000, y: 88.0320)) 122 | path.addLine(to: CGPoint(x: 351.052000, y: 81.2060)) 123 | path.addCurve(to: CGPoint(x: 345.675000, y: 70.5070), 124 | controlPoint1: CGPoint(x: 349.322000, y: 77.5990), 125 | controlPoint2: CGPoint(x: 347.535000, y: 74.0300)) 126 | path.close() 127 | 128 | path.move(to: CGPoint(x: 363.932000, y: 112.2730)) 129 | path.addCurve(to: CGPoint(x: 361.146000, y: 104.6830), 130 | controlPoint1: CGPoint(x: 363.033000, y: 109.7240), 131 | controlPoint2: CGPoint(x: 362.104000, y: 107.1940)) 132 | path.addCurve(to: CGPoint(x: 352.985000, y: 85.3170), 133 | controlPoint1: CGPoint(x: 358.631000, y: 98.0940), 134 | controlPoint2: CGPoint(x: 355.904000, y: 91.6430)) 135 | path.addLine(to: CGPoint(x: 315.658000, y: 101.7450)) 136 | path.addCurve(to: CGPoint(x: 333.080000, y: 148.2170), 137 | controlPoint1: CGPoint(x: 322.769000, y: 116.5650), 138 | controlPoint2: CGPoint(x: 328.620000, y: 132.1020)) 139 | path.addLine(to: CGPoint(x: 370.476000, y: 133.1330)) 140 | path.addCurve(to: CGPoint(x: 363.932000, y: 112.2730), 141 | controlPoint1: CGPoint(x: 368.506000, y: 126.0420), 142 | controlPoint2: CGPoint(x: 366.333000, y: 119.0830)) 143 | path.close() 144 | 145 | path.move(to: CGPoint(x: 380.026000, y: 180.1870)) 146 | path.addCurve(to: CGPoint(x: 373.917000, y: 146.5510), 147 | controlPoint1: CGPoint(x: 378.497000, y: 168.6440), 148 | controlPoint2: CGPoint(x: 376.455000, y: 157.4360)) 149 | path.addCurve(to: CGPoint(x: 372.947000, y: 142.5040), 150 | controlPoint1: CGPoint(x: 373.601000, y: 145.1970), 151 | controlPoint2: CGPoint(x: 373.278000, y: 143.8480)) 152 | path.addCurve(to: CGPoint(x: 370.476000, y: 133.1340), 153 | controlPoint1: CGPoint(x: 372.170000, y: 139.3500), 154 | controlPoint2: CGPoint(x: 371.337000, y: 136.2330)) 155 | path.addLine(to: CGPoint(x: 333.080000, y: 148.2180)) 156 | path.addCurve(to: CGPoint(x: 341.971000, y: 196.4840), 157 | controlPoint1: CGPoint(x: 337.393000, y: 163.8050), 158 | controlPoint2: CGPoint(x: 340.393000, y: 179.9370)) 159 | path.addLine(to: CGPoint(x: 380.396000, y: 183.1060)) 160 | path.addCurve(to: CGPoint(x: 380.026000, y: 180.1870), 161 | controlPoint1: CGPoint(x: 380.275000, y: 182.1320), 162 | controlPoint2: CGPoint(x: 380.154000, y: 181.1570)) 163 | path.close() 164 | 165 | path.move(to: CGPoint(x: 343.034000, y: 234.9750)) 166 | path.addLine(to: CGPoint(x: 383.386000, y: 234.9750)) 167 | path.addCurve(to: CGPoint(x: 383.264000, y: 222.2630), 168 | controlPoint1: CGPoint(x: 383.407000, y: 230.6970), 169 | controlPoint2: CGPoint(x: 383.366000, y: 226.4600)) 170 | path.addCurve(to: CGPoint(x: 383.144000, y: 218.1690), 171 | controlPoint1: CGPoint(x: 383.231000, y: 220.8940), 172 | controlPoint2: CGPoint(x: 383.191000, y: 219.5300)) 173 | path.addCurve(to: CGPoint(x: 380.545000, y: 184.2820), 174 | controlPoint1: CGPoint(x: 382.747000, y: 206.5670), 175 | controlPoint2: CGPoint(x: 381.876000, y: 195.2740)) 176 | path.addCurve(to: CGPoint(x: 380.396000, y: 183.1050), 177 | controlPoint1: CGPoint(x: 380.497000, y: 183.8880), 178 | controlPoint2: CGPoint(x: 380.445000, y: 183.4980)) 179 | path.addLine(to: CGPoint(x: 341.971000, y: 196.4830)) 180 | path.addCurve(to: CGPoint(x: 343.263000, y: 223.5210), 181 | controlPoint1: CGPoint(x: 342.819000, y: 205.3820), 182 | controlPoint2: CGPoint(x: 343.263000, y: 214.3990)) 183 | path.addCurve(to: CGPoint(x: 343.034000, y: 234.9750), 184 | controlPoint1: CGPoint(x: 343.263000, y: 227.3580), 185 | controlPoint2: CGPoint(x: 343.186000, y: 231.1770)) 186 | path.close() 187 | 188 | path.move(to: CGPoint(x: 679.573000, y: 164.1970)) 189 | path.addCurve(to: CGPoint(x: 739.330000, y: 169.3440), 190 | controlPoint1: CGPoint(x: 699.707000, y: 164.9820), 191 | controlPoint2: CGPoint(x: 719.616000, y: 166.7170)) 192 | path.addCurve(to: CGPoint(x: 733.172000, y: 135.8900), 193 | controlPoint1: CGPoint(x: 737.572000, y: 157.9500), 194 | controlPoint2: CGPoint(x: 735.536000, y: 146.7850)) 195 | path.addCurve(to: CGPoint(x: 675.222000, y: 132.0880), 196 | controlPoint1: CGPoint(x: 713.931000, y: 133.8880), 197 | controlPoint2: CGPoint(x: 694.616000, y: 132.6050)) 198 | path.addCurve(to: CGPoint(x: 679.573000, y: 164.1970), 199 | controlPoint1: CGPoint(x: 677.039000, y: 143.2390), 200 | controlPoint2: CGPoint(x: 678.475000, y: 153.9240)) 201 | path.close() 202 | 203 | path.move(to: CGPoint(x: 788.214000, y: 177.7490)) 204 | path.addCurve(to: CGPoint(x: 784.715000, y: 142.9960), 205 | controlPoint1: CGPoint(x: 787.438000, y: 166.0040), 206 | controlPoint2: CGPoint(x: 786.278000, y: 154.4170)) 207 | path.addCurve(to: CGPoint(x: 733.171000, y: 135.8900), 208 | controlPoint1: CGPoint(x: 767.593000, y: 140.0550), 209 | controlPoint2: CGPoint(x: 750.411000, y: 137.6840)) 210 | path.addCurve(to: CGPoint(x: 739.329000, y: 169.3440), 211 | controlPoint1: CGPoint(x: 735.535000, y: 146.7850), 212 | controlPoint2: CGPoint(x: 737.572000, y: 157.9500)) 213 | path.addCurve(to: CGPoint(x: 788.214000, y: 177.7490), 214 | controlPoint1: CGPoint(x: 755.755000, y: 171.5330), 215 | controlPoint2: CGPoint(x: 772.045000, y: 174.3380)) 216 | path.close() 217 | 218 | return path 219 | } 220 | 221 | } 222 | -------------------------------------------------------------------------------- /Keyboard/CustomView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomView.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CustomView: UIView { 12 | 13 | // most important variable 14 | let svgSize = CGSize(width: 791.016, height: 234.975) 15 | 16 | let backgroundPath: UIBezierPath 17 | var keys = [Key]() 18 | var touchLocation: CGPoint = .zero 19 | var currentChar: String? = nil 20 | 21 | var keyHandler: ((_ key: String) -> Void)? 22 | 23 | init() { 24 | backgroundPath = Background.path() 25 | keys.append(contentsOf: Line0.keys()) 26 | keys.append(contentsOf: Line1.keys()) 27 | keys.append(contentsOf: Line2.keys()) 28 | keys.append(contentsOf: Line3.keys()) 29 | keys.append(contentsOf: Line4.keys()) 30 | keys.append(contentsOf: Line5.keys()) 31 | keys.append(contentsOf: Line6.keys()) 32 | keys.append(contentsOf: Line7.keys()) 33 | keys.append(contentsOf: Line8.keys()) 34 | keys.append(contentsOf: Line9.keys()) 35 | super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 36 | self.translatesAutoresizingMaskIntoConstraints = false 37 | self.backgroundColor = UIColor(named: "bgColor") 38 | } 39 | 40 | required init?(coder: NSCoder) { 41 | fatalError("impossible") 42 | } 43 | 44 | override func draw(_ rect: CGRect) { 45 | let ratio = calcRatio() 46 | drawBackground(path: backgroundPath.copy() as! UIBezierPath, ratio: ratio) 47 | 48 | for key in keys { 49 | drawKey(key: key, ratio: ratio) 50 | } 51 | } 52 | 53 | func drawBackground(path: UIBezierPath, ratio: CGFloat) { 54 | UIColor(named: "neonColor")?.setStroke() 55 | path.apply(CGAffineTransform(translationX: -0.5 * svgSize.width, y: -0.5 * svgSize.height)) 56 | path.apply(CGAffineTransform(scaleX: ratio, y: ratio)) 57 | path.apply(CGAffineTransform(translationX: 0.5 * bounds.width, y: 0.5 * bounds.height)) 58 | path.stroke() 59 | } 60 | 61 | func drawKey(key: Key, ratio: CGFloat) { 62 | let framePath = key.framePath.copy() as! UIBezierPath 63 | let keyPath = key.keyPath?.copy() as? UIBezierPath 64 | 65 | framePath.apply(CGAffineTransform(translationX: -0.5 * svgSize.width, y: -0.5 * svgSize.height)) 66 | framePath.apply(CGAffineTransform(scaleX: ratio, y: ratio)) 67 | framePath.apply(CGAffineTransform(translationX: 0.5 * bounds.width, y: 0.5 * bounds.height)) 68 | 69 | keyPath?.apply(CGAffineTransform(translationX: -0.5 * svgSize.width, y: -0.5 * svgSize.height)) 70 | keyPath?.apply(CGAffineTransform(scaleX: ratio, y: ratio)) 71 | keyPath?.apply(CGAffineTransform(translationX: 0.5 * bounds.width, y: 0.5 * bounds.height)) 72 | 73 | if framePath.contains(touchLocation) { 74 | UIColor(named: "neonColor")?.withAlphaComponent(0.3).setFill() 75 | framePath.fill() 76 | UIColor(named: "neonColorH")?.setFill() 77 | keyPath?.fill() 78 | } else { 79 | UIColor(named: "neonColor")?.setFill() 80 | keyPath?.fill() 81 | } 82 | UIColor(named: "neonColor")?.setStroke() 83 | framePath.stroke() 84 | } 85 | 86 | func calcRatio() -> CGFloat { 87 | let ratioW = bounds.width / svgSize.width 88 | let ratioH = bounds.height / svgSize.height 89 | if (ratioH < ratioW) { 90 | return ratioH 91 | } else { 92 | return ratioW 93 | } 94 | } 95 | 96 | func judge() { 97 | let ratio = calcRatio() 98 | for key in keys { 99 | let framePath = key.framePath.copy() as! UIBezierPath 100 | 101 | framePath.apply(CGAffineTransform(translationX: -0.5 * svgSize.width, y: -0.5 * svgSize.height)) 102 | framePath.apply(CGAffineTransform(scaleX: ratio, y: ratio)) 103 | framePath.apply(CGAffineTransform(translationX: 0.5 * bounds.width, y: 0.5 * bounds.height)) 104 | 105 | if framePath.contains(touchLocation) { 106 | keyHandler?(key.char) 107 | break 108 | } 109 | } 110 | } 111 | 112 | override func touchesBegan(_ touches: Set, with event: UIEvent?) { 113 | touchLocation = touches.first!.location(in: self) 114 | self.setNeedsDisplay() 115 | } 116 | 117 | override func touchesMoved(_ touches: Set, with event: UIEvent?) { 118 | touchLocation = touches.first!.location(in: self) 119 | self.setNeedsDisplay() 120 | } 121 | 122 | override func touchesEnded(_ touches: Set, with event: UIEvent?) { 123 | judge() 124 | touchLocation = .zero 125 | self.setNeedsDisplay() 126 | } 127 | 128 | override func touchesCancelled(_ touches: Set, with event: UIEvent?) { 129 | touchLocation = .zero 130 | self.setNeedsDisplay() 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /Keyboard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | IronKeyboard 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | NSExtension 24 | 25 | NSExtensionAttributes 26 | 27 | IsASCIICapable 28 | 29 | PrefersRightToLeft 30 | 31 | PrimaryLanguage 32 | en-US 33 | RequestsOpenAccess 34 | 35 | 36 | NSExtensionPointIdentifier 37 | com.apple.keyboard-service 38 | NSExtensionPrincipalClass 39 | $(PRODUCT_MODULE_NAME).KeyboardViewController 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /Keyboard/Key.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Key.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/20. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Key { 12 | 13 | let char: String 14 | let keyPath: UIBezierPath? 15 | let framePath: UIBezierPath 16 | 17 | init(char: String, keyPath: UIBezierPath? = nil, framePath: UIBezierPath) { 18 | self.char = char 19 | self.keyPath = keyPath 20 | self.framePath = framePath 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Keyboard/KeyboardViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyboardViewController.swift 3 | // Keyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/20. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class KeyboardViewController: UIInputViewController { 12 | 13 | let customView = CustomView() 14 | 15 | lazy var proxy: UITextDocumentProxy = { 16 | return self.textDocumentProxy 17 | }() 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | 22 | customView.keyHandler = { [weak self] key in 23 | if key == "delete" { 24 | self?.proxy.deleteBackward() 25 | } else if key == "globe" { 26 | self?.advanceToNextInputMode() 27 | } else { 28 | self?.proxy.insertText(key) 29 | } 30 | } 31 | 32 | self.view.addSubview(customView) 33 | let guide = self.view.safeAreaLayoutGuide 34 | 35 | customView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true 36 | customView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true 37 | customView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true 38 | customView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true 39 | customView.heightAnchor.constraint(equalTo: customView.widthAnchor, multiplier: 0.297).isActive = true 40 | } 41 | 42 | override func viewWillLayoutSubviews() { 43 | super.viewWillLayoutSubviews() 44 | customView.setNeedsDisplay() 45 | } 46 | 47 | override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 48 | customView.setNeedsDisplay() 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /Keyboard/Line0.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line0.swift 3 | // Keyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/20. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line0 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line0.globe(), 16 | Line0.space(), 17 | Line0.return() 18 | ] 19 | } 20 | 21 | static func globe() -> Key { 22 | let frame = UIBezierPath() 23 | frame.move(to: CGPoint(x: 61.292000, y: 9.4640)) 24 | frame.addCurve(to: CGPoint(x: 0.000000, y: 18.3850), 25 | controlPoint1: CGPoint(x: 39.989000, y: 9.4640), 26 | controlPoint2: CGPoint(x: 19.420000, y: 12.5910)) 27 | frame.addLine(to: CGPoint(x: 0.000000, y: 45.9640)) 28 | frame.addCurve(to: CGPoint(x: 61.292000, y: 35.7230), 29 | controlPoint1: CGPoint(x: 19.211000, y: 39.3340), 30 | controlPoint2: CGPoint(x: 39.829000, y: 35.7230)) 31 | frame.addCurve(to: CGPoint(x: 127.096000, y: 47.5870), 32 | controlPoint1: CGPoint(x: 84.446000, y: 35.7230), 33 | controlPoint2: CGPoint(x: 106.616000, y: 39.9240)) 34 | frame.addCurve(to: CGPoint(x: 137.589000, y: 23.4780), 35 | controlPoint1: CGPoint(x: 130.322000, y: 40.2730), 36 | controlPoint2: CGPoint(x: 135.190000, y: 29.1870)) 37 | frame.addCurve(to: CGPoint(x: 61.292000, y: 9.4640), 38 | controlPoint1: CGPoint(x: 113.888000, y: 14.4330), 39 | controlPoint2: CGPoint(x: 88.172000, y: 9.4640)) 40 | frame.close() 41 | 42 | return Key(char: "globe", framePath: frame) 43 | } 44 | 45 | static func space() -> Key { 46 | let frame = UIBezierPath() 47 | frame.move(to: CGPoint(x: 679.701000, y: 168.2550)) 48 | frame.addCurve(to: CGPoint(x: 383.265000, y: 222.2640), 49 | controlPoint1: CGPoint(x: 586.634000, y: 164.6060), 50 | controlPoint2: CGPoint(x: 488.773000, y: 181.1200)) 51 | frame.addLine(to: CGPoint(x: 383.265000, y: 222.2640)) 52 | frame.addCurve(to: CGPoint(x: 383.387000, y: 234.9760), 53 | controlPoint1: CGPoint(x: 383.368000, y: 226.4610), 54 | controlPoint2: CGPoint(x: 383.408000, y: 230.6980)) 55 | frame.addCurve(to: CGPoint(x: 682.025000, y: 234.9760), 56 | controlPoint1: CGPoint(x: 383.387000, y: 234.9760), 57 | controlPoint2: CGPoint(x: 565.026000, y: 234.9760)) 58 | frame.addCurve(to: CGPoint(x: 679.701000, y: 168.2550), 59 | controlPoint1: CGPoint(x: 682.781000, y: 214.9080), 60 | controlPoint2: CGPoint(x: 682.170000, y: 192.7690)) 61 | frame.close() 62 | 63 | return Key(char: " ", framePath: frame) 64 | } 65 | 66 | static func `return`() -> Key { 67 | let frame = UIBezierPath() 68 | frame.move(to: CGPoint(x: 788.530000, y: 181.8680)) 69 | frame.addLine(to: CGPoint(x: 788.530000, y: 181.8680)) 70 | frame.addCurve(to: CGPoint(x: 679.700000, y: 168.2540), 71 | controlPoint1: CGPoint(x: 752.892000, y: 174.3320), 72 | controlPoint2: CGPoint(x: 716.674000, y: 169.7040)) 73 | frame.addCurve(to: CGPoint(x: 682.024000, y: 234.9750), 74 | controlPoint1: CGPoint(x: 682.169000, y: 192.7680), 75 | controlPoint2: CGPoint(x: 682.781000, y: 214.9070)) 76 | frame.addCurve(to: CGPoint(x: 791.015000, y: 234.9750), 77 | controlPoint1: CGPoint(x: 724.724000, y: 234.9750), 78 | controlPoint2: CGPoint(x: 791.015000, y: 234.9750)) 79 | frame.addCurve(to: CGPoint(x: 788.530000, y: 181.8680), 80 | controlPoint1: CGPoint(x: 790.620000, y: 216.8250), 81 | controlPoint2: CGPoint(x: 789.810000, y: 199.1030)) 82 | frame.close() 83 | 84 | return Key(char: "\n", framePath: frame) 85 | } 86 | } 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Keyboard/Line3.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line3.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line3 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line3.keyA(), 16 | Line3.keyS(), 17 | Line3.keyD(), 18 | Line3.keyF(), 19 | Line3.keyG(), 20 | Line3.keyH(), 21 | Line3.keyJ(), 22 | Line3.keyK(), 23 | Line3.keyL() 24 | ] 25 | } 26 | 27 | static func keyA() -> Key { 28 | let frame = UIBezierPath() 29 | frame.move(to: CGPoint(x: 373.917000, y: 146.5520)) 30 | frame.addLine(to: CGPoint(x: 373.917000, y: 146.5520)) 31 | frame.addCurve(to: CGPoint(x: 380.026000, y: 180.1880), 32 | controlPoint1: CGPoint(x: 376.455000, y: 157.4360), 33 | controlPoint2: CGPoint(x: 378.497000, y: 168.6450)) 34 | frame.addLine(to: CGPoint(x: 380.031000, y: 180.2290)) 35 | frame.addCurve(to: CGPoint(x: 446.488000, y: 157.7570), 36 | controlPoint1: CGPoint(x: 402.296000, y: 171.6420), 37 | controlPoint2: CGPoint(x: 424.447000, y: 164.1690)) 38 | frame.addCurve(to: CGPoint(x: 439.527000, y: 125.9270), 39 | controlPoint1: CGPoint(x: 444.741000, y: 147.7470), 40 | controlPoint2: CGPoint(x: 442.402000, y: 137.1170)) 41 | frame.addCurve(to: CGPoint(x: 373.917000, y: 146.5520), 42 | controlPoint1: CGPoint(x: 417.642000, y: 131.9310), 43 | controlPoint2: CGPoint(x: 395.772000, y: 138.8090)) 44 | frame.close() 45 | 46 | let key = UIBezierPath() 47 | key.move(to: CGPoint(x: 411.199000, y: 154.8800)) 48 | key.addLine(to: CGPoint(x: 408.058000, y: 155.7710)) 49 | key.addLine(to: CGPoint(x: 408.041000, y: 157.3720)) 50 | key.addLine(to: CGPoint(x: 405.217000, y: 158.1730)) 51 | key.addLine(to: CGPoint(x: 406.042000, y: 148.2660)) 52 | key.addLine(to: CGPoint(x: 409.060000, y: 147.4100)) 53 | key.addLine(to: CGPoint(x: 414.964000, y: 155.4080)) 54 | key.addLine(to: CGPoint(x: 412.067000, y: 156.2300)) 55 | key.addLine(to: CGPoint(x: 411.199000, y: 154.8800)) 56 | key.close() 57 | key.move(to: CGPoint(x: 410.077000, y: 153.1060)) 58 | key.addLine(to: CGPoint(x: 408.176000, y: 150.1690)) 59 | key.addLine(to: CGPoint(x: 408.111000, y: 153.6640)) 60 | key.addLine(to: CGPoint(x: 410.077000, y: 153.1060)) 61 | key.close() 62 | 63 | return Key(char: "A", keyPath: key, framePath: frame) 64 | } 65 | 66 | static func keyS() -> Key { 67 | let frame = UIBezierPath() 68 | frame.move(to: CGPoint(x: 439.527000, y: 125.9260)) 69 | frame.addCurve(to: CGPoint(x: 446.488000, y: 157.7560), 70 | controlPoint1: CGPoint(x: 442.402000, y: 137.1160), 71 | controlPoint2: CGPoint(x: 444.741000, y: 147.7460)) 72 | frame.addCurve(to: CGPoint(x: 485.933000, y: 147.3920), 73 | controlPoint1: CGPoint(x: 459.676000, y: 153.9200), 74 | controlPoint2: CGPoint(x: 472.823000, y: 150.4740)) 75 | frame.addCurve(to: CGPoint(x: 479.697000, y: 115.9030), 76 | controlPoint1: CGPoint(x: 484.093000, y: 136.7720), 77 | controlPoint2: CGPoint(x: 482.178000, y: 126.2220)) 78 | frame.addCurve(to: CGPoint(x: 439.527000, y: 125.9260), 79 | controlPoint1: CGPoint(x: 466.302000, y: 118.9160), 80 | controlPoint2: CGPoint(x: 452.912000, y: 122.2530)) 81 | frame.close() 82 | 83 | let key = UIBezierPath() 84 | key.move(to: CGPoint(x: 459.333000, y: 139.0960)) 85 | key.addLine(to: CGPoint(x: 461.969000, y: 138.3450)) 86 | key.addCurve(to: CGPoint(x: 462.539000, y: 139.2600), 87 | controlPoint1: CGPoint(x: 462.122000, y: 138.7660), 88 | controlPoint2: CGPoint(x: 462.311000, y: 139.0720)) 89 | key.addCurve(to: CGPoint(x: 463.900000, y: 139.5410), 90 | controlPoint1: CGPoint(x: 462.908000, y: 139.5650), 91 | controlPoint2: CGPoint(x: 463.361000, y: 139.6580)) 92 | key.addCurve(to: CGPoint(x: 464.765000, y: 139.0580), 93 | controlPoint1: CGPoint(x: 464.301000, y: 139.4540), 94 | controlPoint2: CGPoint(x: 464.590000, y: 139.2930)) 95 | key.addCurve(to: CGPoint(x: 464.948000, y: 138.3330), 96 | controlPoint1: CGPoint(x: 464.942000, y: 138.8230), 97 | controlPoint2: CGPoint(x: 465.002000, y: 138.5810)) 98 | key.addCurve(to: CGPoint(x: 464.501000, y: 137.7680), 99 | controlPoint1: CGPoint(x: 464.897000, y: 138.0970), 100 | controlPoint2: CGPoint(x: 464.748000, y: 137.9090)) 101 | key.addCurve(to: CGPoint(x: 462.947000, y: 137.5550), 102 | controlPoint1: CGPoint(x: 464.253000, y: 137.6270), 103 | controlPoint2: CGPoint(x: 463.735000, y: 137.5560)) 104 | key.addCurve(to: CGPoint(x: 460.070000, y: 137.0250), 105 | controlPoint1: CGPoint(x: 461.654000, y: 137.5460), 106 | controlPoint2: CGPoint(x: 460.695000, y: 137.3700)) 107 | key.addCurve(to: CGPoint(x: 458.894000, y: 135.4430), 108 | controlPoint1: CGPoint(x: 459.441000, y: 136.6820), 109 | controlPoint2: CGPoint(x: 459.049000, y: 136.1540)) 110 | key.addCurve(to: CGPoint(x: 459.012000, y: 134.0300), 111 | controlPoint1: CGPoint(x: 458.792000, y: 134.9750), 112 | controlPoint2: CGPoint(x: 458.831000, y: 134.5050)) 113 | key.addCurve(to: CGPoint(x: 460.020000, y: 132.7840), 114 | controlPoint1: CGPoint(x: 459.192000, y: 133.5560), 115 | controlPoint2: CGPoint(x: 459.528000, y: 133.1400)) 116 | key.addCurve(to: CGPoint(x: 462.178000, y: 131.9400), 117 | controlPoint1: CGPoint(x: 460.512000, y: 132.4280), 118 | controlPoint2: CGPoint(x: 461.231000, y: 132.1460)) 119 | key.addCurve(to: CGPoint(x: 464.978000, y: 132.0090), 120 | controlPoint1: CGPoint(x: 463.340000, y: 131.6870), 121 | controlPoint2: CGPoint(x: 464.274000, y: 131.7100)) 122 | key.addCurve(to: CGPoint(x: 466.515000, y: 133.8340), 123 | controlPoint1: CGPoint(x: 465.682000, y: 132.3080), 124 | controlPoint2: CGPoint(x: 466.194000, y: 132.9160)) 125 | key.addLine(to: CGPoint(x: 463.901000, y: 134.5670)) 126 | key.addCurve(to: CGPoint(x: 463.263000, y: 133.7710), 127 | controlPoint1: CGPoint(x: 463.741000, y: 134.1720), 128 | controlPoint2: CGPoint(x: 463.528000, y: 133.9070)) 129 | key.addCurve(to: CGPoint(x: 462.269000, y: 133.6950), 130 | controlPoint1: CGPoint(x: 462.997000, y: 133.6330), 131 | controlPoint2: CGPoint(x: 462.666000, y: 133.6080)) 132 | key.addCurve(to: CGPoint(x: 461.576000, y: 134.0640), 133 | controlPoint1: CGPoint(x: 461.943000, y: 133.7660), 134 | controlPoint2: CGPoint(x: 461.712000, y: 133.8890)) 135 | key.addCurve(to: CGPoint(x: 461.438000, y: 134.6230), 136 | controlPoint1: CGPoint(x: 461.441000, y: 134.2380), 137 | controlPoint2: CGPoint(x: 461.395000, y: 134.4240)) 138 | key.addCurve(to: CGPoint(x: 461.728000, y: 134.9690), 139 | controlPoint1: CGPoint(x: 461.470000, y: 134.7680), 140 | controlPoint2: CGPoint(x: 461.567000, y: 134.8840)) 141 | key.addCurve(to: CGPoint(x: 462.744000, y: 135.0980), 142 | controlPoint1: CGPoint(x: 461.887000, y: 135.0600), 143 | controlPoint2: CGPoint(x: 462.225000, y: 135.1040)) 144 | key.addCurve(to: CGPoint(x: 465.558000, y: 135.3260), 145 | controlPoint1: CGPoint(x: 464.030000, y: 135.0950), 146 | controlPoint2: CGPoint(x: 464.968000, y: 135.1710)) 147 | key.addCurve(to: CGPoint(x: 466.937000, y: 136.0810), 148 | controlPoint1: CGPoint(x: 466.149000, y: 135.4810), 149 | controlPoint2: CGPoint(x: 466.608000, y: 135.7330)) 150 | key.addCurve(to: CGPoint(x: 467.593000, y: 137.3480), 151 | controlPoint1: CGPoint(x: 467.267000, y: 136.4290), 152 | controlPoint2: CGPoint(x: 467.485000, y: 136.8520)) 153 | key.addCurve(to: CGPoint(x: 467.462000, y: 139.0660), 154 | controlPoint1: CGPoint(x: 467.720000, y: 137.9300), 155 | controlPoint2: CGPoint(x: 467.677000, y: 138.5030)) 156 | key.addCurve(to: CGPoint(x: 466.353000, y: 140.4800), 157 | controlPoint1: CGPoint(x: 467.247000, y: 139.6280), 158 | controlPoint2: CGPoint(x: 466.877000, y: 140.0990)) 159 | key.addCurve(to: CGPoint(x: 464.247000, y: 141.3380), 160 | controlPoint1: CGPoint(x: 465.830000, y: 140.8600), 161 | controlPoint2: CGPoint(x: 465.128000, y: 141.1460)) 162 | key.addCurve(to: CGPoint(x: 460.840000, y: 141.1450), 163 | controlPoint1: CGPoint(x: 462.700000, y: 141.6750), 164 | controlPoint2: CGPoint(x: 461.565000, y: 141.6110)) 165 | key.addCurve(to: CGPoint(x: 459.333000, y: 139.0960), 166 | controlPoint1: CGPoint(x: 460.115000, y: 140.6790), 167 | controlPoint2: CGPoint(x: 459.612000, y: 139.9970)) 168 | key.close() 169 | 170 | return Key(char: "S", keyPath: key, framePath: frame) 171 | } 172 | 173 | static func keyD() -> Key { 174 | let frame = UIBezierPath() 175 | frame.move(to: CGPoint(x: 479.698000, y: 115.9040)) 176 | frame.addCurve(to: CGPoint(x: 485.934000, y: 147.3930), 177 | controlPoint1: CGPoint(x: 482.179000, y: 126.2230), 178 | controlPoint2: CGPoint(x: 484.094000, y: 136.7720)) 179 | frame.addCurve(to: CGPoint(x: 526.875000, y: 138.9700), 180 | controlPoint1: CGPoint(x: 499.623000, y: 144.1750), 181 | controlPoint2: CGPoint(x: 513.268000, y: 141.3870)) 182 | frame.addCurve(to: CGPoint(x: 520.654000, y: 107.7610), 183 | controlPoint1: CGPoint(x: 525.005000, y: 128.4730), 184 | controlPoint2: CGPoint(x: 523.072000, y: 118.0280)) 185 | frame.addCurve(to: CGPoint(x: 479.698000, y: 115.9040), 186 | controlPoint1: CGPoint(x: 506.996000, y: 110.1340), 187 | controlPoint2: CGPoint(x: 493.344000, y: 112.8360)) 188 | frame.close() 189 | 190 | let key = UIBezierPath() 191 | key.move(to: CGPoint(x: 498.693000, y: 123.6640)) 192 | key.addLine(to: CGPoint(x: 502.889000, y: 122.8660)) 193 | key.addCurve(to: CGPoint(x: 504.958000, y: 122.8230), 194 | controlPoint1: CGPoint(x: 503.717000, y: 122.7090), 195 | controlPoint2: CGPoint(x: 504.406000, y: 122.6950)) 196 | key.addCurve(to: CGPoint(x: 506.404000, y: 123.5500), 197 | controlPoint1: CGPoint(x: 505.510000, y: 122.9510), 198 | controlPoint2: CGPoint(x: 505.993000, y: 123.1930)) 199 | key.addCurve(to: CGPoint(x: 507.406000, y: 124.8770), 200 | controlPoint1: CGPoint(x: 506.816000, y: 123.9050), 201 | controlPoint2: CGPoint(x: 507.150000, y: 124.3490)) 202 | key.addCurve(to: CGPoint(x: 507.967000, y: 126.6050), 203 | controlPoint1: CGPoint(x: 507.662000, y: 125.4070), 204 | controlPoint2: CGPoint(x: 507.849000, y: 125.9820)) 205 | key.addCurve(to: CGPoint(x: 508.066000, y: 128.9420), 206 | controlPoint1: CGPoint(x: 508.153000, y: 127.5820), 207 | controlPoint2: CGPoint(x: 508.186000, y: 128.3610)) 208 | key.addCurve(to: CGPoint(x: 507.397000, y: 130.4710), 209 | controlPoint1: CGPoint(x: 507.946000, y: 129.5220), 210 | controlPoint2: CGPoint(x: 507.723000, y: 130.0330)) 211 | key.addCurve(to: CGPoint(x: 506.263000, y: 131.4400), 212 | controlPoint1: CGPoint(x: 507.071000, y: 130.9110), 213 | controlPoint2: CGPoint(x: 506.693000, y: 131.2330)) 214 | key.addCurve(to: CGPoint(x: 504.626000, y: 132.0100), 215 | controlPoint1: CGPoint(x: 505.675000, y: 131.7230), 216 | controlPoint2: CGPoint(x: 505.129000, y: 131.9140)) 217 | key.addLine(to: CGPoint(x: 500.430000, y: 132.8080)) 218 | key.addLine(to: CGPoint(x: 498.693000, y: 123.6640)) 219 | key.close() 220 | key.move(to: CGPoint(x: 501.911000, y: 125.1970)) 221 | key.addLine(to: CGPoint(x: 502.861000, y: 130.1930)) 222 | key.addLine(to: CGPoint(x: 503.554000, y: 130.0610)) 223 | key.addCurve(to: CGPoint(x: 504.776000, y: 129.6240), 224 | controlPoint1: CGPoint(x: 504.144000, y: 129.9490), 225 | controlPoint2: CGPoint(x: 504.551000, y: 129.8020)) 226 | key.addCurve(to: CGPoint(x: 505.232000, y: 128.8280), 227 | controlPoint1: CGPoint(x: 505.001000, y: 129.4460), 228 | controlPoint2: CGPoint(x: 505.153000, y: 129.1810)) 229 | key.addCurve(to: CGPoint(x: 505.142000, y: 127.2010), 230 | controlPoint1: CGPoint(x: 505.311000, y: 128.4750), 231 | controlPoint2: CGPoint(x: 505.281000, y: 127.9320)) 232 | key.addCurve(to: CGPoint(x: 504.290000, y: 125.3010), 233 | controlPoint1: CGPoint(x: 504.958000, y: 126.2320), 234 | controlPoint2: CGPoint(x: 504.673000, y: 125.5980)) 235 | key.addCurve(to: CGPoint(x: 502.616000, y: 125.0620), 236 | controlPoint1: CGPoint(x: 503.906000, y: 125.0020), 237 | controlPoint2: CGPoint(x: 503.348000, y: 124.9230)) 238 | key.addLine(to: CGPoint(x: 501.911000, y: 125.1970)) 239 | key.close() 240 | 241 | return Key(char: "D", keyPath: key, framePath: frame) 242 | } 243 | 244 | static func keyF() -> Key { 245 | let frame = UIBezierPath() 246 | frame.move(to: CGPoint(x: 520.654000, y: 107.7610)) 247 | frame.addCurve(to: CGPoint(x: 526.875000, y: 138.9700), 248 | controlPoint1: CGPoint(x: 523.071000, y: 118.0280), 249 | controlPoint2: CGPoint(x: 525.005000, y: 128.4730)) 250 | frame.addCurve(to: CGPoint(x: 562.241000, y: 133.5680), 251 | controlPoint1: CGPoint(x: 538.694000, y: 136.8710), 252 | controlPoint2: CGPoint(x: 550.482000, y: 135.0780)) 253 | frame.addCurve(to: CGPoint(x: 556.429000, y: 102.3520), 254 | controlPoint1: CGPoint(x: 560.647000, y: 122.9840), 255 | controlPoint2: CGPoint(x: 558.853000, y: 112.5650)) 256 | frame.addCurve(to: CGPoint(x: 520.654000, y: 107.7610), 257 | controlPoint1: CGPoint(x: 544.499000, y: 103.8890), 258 | controlPoint2: CGPoint(x: 532.574000, y: 105.6900)) 259 | frame.close() 260 | 261 | let key = UIBezierPath() 262 | key.move(to: CGPoint(x: 537.620000, y: 117.0850)) 263 | key.addLine(to: CGPoint(x: 544.677000, y: 116.2230)) 264 | key.addLine(to: CGPoint(x: 544.919000, y: 118.2070)) 265 | key.addLine(to: CGPoint(x: 540.729000, y: 118.7190)) 266 | key.addLine(to: CGPoint(x: 540.926000, y: 120.3320)) 267 | key.addLine(to: CGPoint(x: 544.505000, y: 119.8950)) 268 | key.addLine(to: CGPoint(x: 544.733000, y: 121.7600)) 269 | key.addLine(to: CGPoint(x: 541.154000, y: 122.1970)) 270 | key.addLine(to: CGPoint(x: 541.615000, y: 125.9720)) 271 | key.addLine(to: CGPoint(x: 538.748000, y: 126.3220)) 272 | key.addLine(to: CGPoint(x: 537.620000, y: 117.0850)) 273 | key.close() 274 | 275 | return Key(char: "F", keyPath: key, framePath: frame) 276 | } 277 | 278 | static func keyG() -> Key { 279 | let frame = UIBezierPath() 280 | frame.move(to: CGPoint(x: 556.428000, y: 102.3510)) 281 | frame.addCurve(to: CGPoint(x: 562.240000, y: 133.5670), 282 | controlPoint1: CGPoint(x: 558.853000, y: 112.5640), 283 | controlPoint2: CGPoint(x: 560.646000, y: 122.9840)) 284 | frame.addCurve(to: CGPoint(x: 598.625000, y: 129.8110), 285 | controlPoint1: CGPoint(x: 574.400000, y: 132.0050), 286 | controlPoint2: CGPoint(x: 586.528000, y: 130.7580)) 287 | frame.addCurve(to: CGPoint(x: 592.694000, y: 98.5150), 288 | controlPoint1: CGPoint(x: 597.168000, y: 119.9350), 289 | controlPoint2: CGPoint(x: 595.281000, y: 109.4400)) 290 | frame.addCurve(to: CGPoint(x: 556.428000, y: 102.3510), 291 | controlPoint1: CGPoint(x: 580.602000, y: 99.5170), 292 | controlPoint2: CGPoint(x: 568.513000, y: 100.7940)) 293 | frame.close() 294 | 295 | let key = UIBezierPath() 296 | key.move(to: CGPoint(x: 578.527000, y: 117.2740)) 297 | key.addLine(to: CGPoint(x: 578.432000, y: 115.3410)) 298 | key.addLine(to: CGPoint(x: 582.870000, y: 115.1220)) 299 | key.addLine(to: CGPoint(x: 583.066000, y: 119.0840)) 300 | key.addCurve(to: CGPoint(x: 580.870000, y: 120.3780), 301 | controlPoint1: CGPoint(x: 582.244000, y: 119.7050), 302 | controlPoint2: CGPoint(x: 581.512000, y: 120.1360)) 303 | key.addCurve(to: CGPoint(x: 578.561000, y: 120.8060), 304 | controlPoint1: CGPoint(x: 580.227000, y: 120.6190), 305 | controlPoint2: CGPoint(x: 579.457000, y: 120.7620)) 306 | key.addCurve(to: CGPoint(x: 575.836000, y: 120.3750), 307 | controlPoint1: CGPoint(x: 577.459000, y: 120.8600), 308 | controlPoint2: CGPoint(x: 576.550000, y: 120.7180)) 309 | key.addCurve(to: CGPoint(x: 574.136000, y: 118.7750), 310 | controlPoint1: CGPoint(x: 575.122000, y: 120.0330), 311 | controlPoint2: CGPoint(x: 574.555000, y: 119.5000)) 312 | key.addCurve(to: CGPoint(x: 573.436000, y: 116.2420), 313 | controlPoint1: CGPoint(x: 573.717000, y: 118.0500), 314 | controlPoint2: CGPoint(x: 573.484000, y: 117.2060)) 315 | key.addCurve(to: CGPoint(x: 573.932000, y: 113.5640), 316 | controlPoint1: CGPoint(x: 573.386000, y: 115.2280), 317 | controlPoint2: CGPoint(x: 573.552000, y: 114.3350)) 318 | key.addCurve(to: CGPoint(x: 575.687000, y: 111.7640), 319 | controlPoint1: CGPoint(x: 574.314000, y: 112.7930), 320 | controlPoint2: CGPoint(x: 574.899000, y: 112.1930)) 321 | key.addCurve(to: CGPoint(x: 578.207000, y: 111.1880), 322 | controlPoint1: CGPoint(x: 576.301000, y: 111.4330), 323 | controlPoint2: CGPoint(x: 577.141000, y: 111.2400)) 324 | key.addCurve(to: CGPoint(x: 580.526000, y: 111.3530), 325 | controlPoint1: CGPoint(x: 579.234000, y: 111.1370), 326 | controlPoint2: CGPoint(x: 580.007000, y: 111.1930)) 327 | key.addCurve(to: CGPoint(x: 581.837000, y: 112.1570), 328 | controlPoint1: CGPoint(x: 581.044000, y: 111.5140), 329 | controlPoint2: CGPoint(x: 581.481000, y: 111.7820)) 330 | key.addCurve(to: CGPoint(x: 582.668000, y: 113.6060), 331 | controlPoint1: CGPoint(x: 582.192000, y: 112.5320), 332 | controlPoint2: CGPoint(x: 582.469000, y: 113.0150)) 333 | key.addLine(to: CGPoint(x: 579.921000, y: 114.2370)) 334 | key.addCurve(to: CGPoint(x: 579.301000, y: 113.4610), 335 | controlPoint1: CGPoint(x: 579.790000, y: 113.8910), 336 | controlPoint2: CGPoint(x: 579.583000, y: 113.6330)) 337 | key.addCurve(to: CGPoint(x: 578.245000, y: 113.2340), 338 | controlPoint1: CGPoint(x: 579.020000, y: 113.2880), 339 | controlPoint2: CGPoint(x: 578.667000, y: 113.2130)) 340 | key.addCurve(to: CGPoint(x: 576.771000, y: 113.9640), 341 | controlPoint1: CGPoint(x: 577.615000, y: 113.2650), 342 | controlPoint2: CGPoint(x: 577.124000, y: 113.5080)) 343 | key.addCurve(to: CGPoint(x: 576.313000, y: 116.0680), 344 | controlPoint1: CGPoint(x: 576.419000, y: 114.4200), 345 | controlPoint2: CGPoint(x: 576.266000, y: 115.1210)) 346 | key.addCurve(to: CGPoint(x: 576.987000, y: 118.1960), 347 | controlPoint1: CGPoint(x: 576.363000, y: 117.0740), 348 | controlPoint2: CGPoint(x: 576.587000, y: 117.7830)) 349 | key.addCurve(to: CGPoint(x: 578.601000, y: 118.7650), 350 | controlPoint1: CGPoint(x: 577.387000, y: 118.6090), 351 | controlPoint2: CGPoint(x: 577.924000, y: 118.7980)) 352 | key.addCurve(to: CGPoint(x: 579.513000, y: 118.5800), 353 | controlPoint1: CGPoint(x: 578.922000, y: 118.7490), 354 | controlPoint2: CGPoint(x: 579.226000, y: 118.6870)) 355 | key.addCurve(to: CGPoint(x: 580.491000, y: 118.0560), 356 | controlPoint1: CGPoint(x: 579.800000, y: 118.4730), 357 | controlPoint2: CGPoint(x: 580.126000, y: 118.2970)) 358 | key.addLine(to: CGPoint(x: 580.448000, y: 117.1800)) 359 | key.addLine(to: CGPoint(x: 578.527000, y: 117.2740)) 360 | key.close() 361 | 362 | return Key(char: "G", keyPath: key, framePath: frame) 363 | } 364 | 365 | static func keyH() -> Key { 366 | let frame = UIBezierPath() 367 | frame.move(to: CGPoint(x: 592.695000, y: 98.5150)) 368 | frame.addCurve(to: CGPoint(x: 598.626000, y: 129.8110), 369 | controlPoint1: CGPoint(x: 595.281000, y: 109.4410), 370 | controlPoint2: CGPoint(x: 597.169000, y: 119.9350)) 371 | frame.addCurve(to: CGPoint(x: 636.586000, y: 127.8280), 372 | controlPoint1: CGPoint(x: 611.313000, y: 128.8180), 373 | controlPoint2: CGPoint(x: 623.966000, y: 128.1590)) 374 | frame.addCurve(to: CGPoint(x: 629.628000, y: 96.3320), 375 | controlPoint1: CGPoint(x: 634.731000, y: 116.9330), 376 | controlPoint2: CGPoint(x: 632.449000, y: 106.4020)) 377 | frame.addCurve(to: CGPoint(x: 592.695000, y: 98.5150), 378 | controlPoint1: CGPoint(x: 617.311000, y: 96.7690), 379 | controlPoint2: CGPoint(x: 605.001000, y: 97.4950)) 380 | frame.close() 381 | 382 | let key = UIBezierPath() 383 | key.move(to: CGPoint(x: 610.458000, y: 108.4990)) 384 | key.addLine(to: CGPoint(x: 613.326000, y: 108.3010)) 385 | key.addLine(to: CGPoint(x: 613.550000, y: 111.5500)) 386 | key.addLine(to: CGPoint(x: 616.685000, y: 111.3340)) 387 | key.addLine(to: CGPoint(x: 616.461000, y: 108.0850)) 388 | key.addLine(to: CGPoint(x: 619.343000, y: 107.8860)) 389 | key.addLine(to: CGPoint(x: 619.982000, y: 117.1700)) 390 | key.addLine(to: CGPoint(x: 617.100000, y: 117.3690)) 391 | key.addLine(to: CGPoint(x: 616.841000, y: 113.6140)) 392 | key.addLine(to: CGPoint(x: 613.706000, y: 113.8300)) 393 | key.addLine(to: CGPoint(x: 613.965000, y: 117.5850)) 394 | key.addLine(to: CGPoint(x: 611.097000, y: 117.7830)) 395 | key.addLine(to: CGPoint(x: 610.458000, y: 108.4990)) 396 | key.close() 397 | 398 | return Key(char: "H", keyPath: key, framePath: frame) 399 | } 400 | 401 | static func keyJ() -> Key { 402 | let frame = UIBezierPath() 403 | frame.move(to: CGPoint(x: 674.511000, y: 127.8170)) 404 | frame.addCurve(to: CGPoint(x: 668.322000, y: 95.9270), 405 | controlPoint1: CGPoint(x: 672.774000, y: 117.5860), 406 | controlPoint2: CGPoint(x: 670.718000, y: 106.9670)) 407 | frame.addCurve(to: CGPoint(x: 629.628000, y: 96.3310), 408 | controlPoint1: CGPoint(x: 655.418000, y: 95.7330), 409 | controlPoint2: CGPoint(x: 642.520000, y: 95.8730)) 410 | frame.addCurve(to: CGPoint(x: 636.586000, y: 127.8270), 411 | controlPoint1: CGPoint(x: 632.449000, y: 106.4020), 412 | controlPoint2: CGPoint(x: 634.732000, y: 116.9320)) 413 | frame.addCurve(to: CGPoint(x: 674.511000, y: 127.8170), 414 | controlPoint1: CGPoint(x: 649.261000, y: 127.4950), 415 | controlPoint2: CGPoint(x: 661.903000, y: 127.4930)) 416 | frame.close() 417 | 418 | let key = UIBezierPath() 419 | key.move(to: CGPoint(x: 652.501000, y: 107.4330)) 420 | key.addLine(to: CGPoint(x: 655.381000, y: 107.3270)) 421 | key.addLine(to: CGPoint(x: 655.566000, y: 112.3790)) 422 | key.addCurve(to: CGPoint(x: 655.373000, y: 114.8110), 423 | controlPoint1: CGPoint(x: 655.605000, y: 113.4400), 424 | controlPoint2: CGPoint(x: 655.541000, y: 114.2510)) 425 | key.addCurve(to: CGPoint(x: 654.289000, y: 116.2600), 426 | controlPoint1: CGPoint(x: 655.205000, y: 115.3720), 427 | controlPoint2: CGPoint(x: 654.843000, y: 115.8550)) 428 | key.addCurve(to: CGPoint(x: 652.125000, y: 116.9170), 429 | controlPoint1: CGPoint(x: 653.734000, y: 116.6650), 430 | controlPoint2: CGPoint(x: 653.013000, y: 116.8840)) 431 | key.addCurve(to: CGPoint(x: 649.929000, y: 116.6160), 432 | controlPoint1: CGPoint(x: 651.186000, y: 116.9510), 433 | controlPoint2: CGPoint(x: 650.454000, y: 116.8510)) 434 | key.addCurve(to: CGPoint(x: 648.693000, y: 115.5470), 435 | controlPoint1: CGPoint(x: 649.403000, y: 116.3810), 436 | controlPoint2: CGPoint(x: 648.992000, y: 116.0250)) 437 | key.addCurve(to: CGPoint(x: 648.129000, y: 113.7530), 438 | controlPoint1: CGPoint(x: 648.394000, y: 115.0680), 439 | controlPoint2: CGPoint(x: 648.206000, y: 114.4710)) 440 | key.addLine(to: CGPoint(x: 650.861000, y: 113.2780)) 441 | key.addCurve(to: CGPoint(x: 651.002000, y: 114.1880), 442 | controlPoint1: CGPoint(x: 650.880000, y: 113.6890), 443 | controlPoint2: CGPoint(x: 650.927000, y: 113.9920)) 444 | key.addCurve(to: CGPoint(x: 651.363000, y: 114.6580), 445 | controlPoint1: CGPoint(x: 651.078000, y: 114.3850), 446 | controlPoint2: CGPoint(x: 651.198000, y: 114.5410)) 447 | key.addCurve(to: CGPoint(x: 651.836000, y: 114.7620), 448 | controlPoint1: CGPoint(x: 651.475000, y: 114.7350), 449 | controlPoint2: CGPoint(x: 651.633000, y: 114.7690)) 450 | key.addCurve(to: CGPoint(x: 652.530000, y: 114.3780), 451 | controlPoint1: CGPoint(x: 652.158000, y: 114.7500), 452 | controlPoint2: CGPoint(x: 652.389000, y: 114.6230)) 453 | key.addCurve(to: CGPoint(x: 652.711000, y: 113.1620), 454 | controlPoint1: CGPoint(x: 652.671000, y: 114.1330), 455 | controlPoint2: CGPoint(x: 652.732000, y: 113.7280)) 456 | key.addLine(to: CGPoint(x: 652.501000, y: 107.4330)) 457 | key.close() 458 | 459 | return Key(char: "J", keyPath: key, framePath: frame) 460 | } 461 | 462 | static func keyK() -> Key { 463 | let frame = UIBezierPath() 464 | frame.move(to: CGPoint(x: 674.511000, y: 127.8170)) 465 | frame.addCurve(to: CGPoint(x: 722.833000, y: 130.6250), 466 | controlPoint1: CGPoint(x: 690.672000, y: 128.2320), 467 | controlPoint2: CGPoint(x: 706.778000, y: 129.1750)) 468 | frame.addCurve(to: CGPoint(x: 715.574000, y: 98.0920), 469 | controlPoint1: CGPoint(x: 720.676000, y: 119.2470), 470 | controlPoint2: CGPoint(x: 718.273000, y: 108.3700)) 471 | frame.addCurve(to: CGPoint(x: 668.322000, y: 95.9270), 472 | controlPoint1: CGPoint(x: 699.815000, y: 96.8840), 473 | controlPoint2: CGPoint(x: 684.064000, y: 96.1630)) 474 | frame.addCurve(to: CGPoint(x: 674.511000, y: 127.8170), 475 | controlPoint1: CGPoint(x: 670.718000, y: 106.9670), 476 | controlPoint2: CGPoint(x: 672.773000, y: 117.5870)) 477 | frame.close() 478 | 479 | let key = UIBezierPath() 480 | key.move(to: CGPoint(x: 690.920000, y: 108.1310)) 481 | key.addLine(to: CGPoint(x: 693.795000, y: 108.1510)) 482 | key.addLine(to: CGPoint(x: 693.771000, y: 111.6680)) 483 | key.addLine(to: CGPoint(x: 696.808000, y: 108.1720)) 484 | key.addLine(to: CGPoint(x: 700.632000, y: 108.1980)) 485 | key.addLine(to: CGPoint(x: 697.213000, y: 111.6880)) 486 | key.addLine(to: CGPoint(x: 700.721000, y: 117.5050)) 487 | key.addLine(to: CGPoint(x: 697.180000, y: 117.4810)) 488 | key.addLine(to: CGPoint(x: 695.244000, y: 113.6410)) 489 | key.addLine(to: CGPoint(x: 693.747000, y: 115.1870)) 490 | key.addLine(to: CGPoint(x: 693.732000, y: 117.4570)) 491 | key.addLine(to: CGPoint(x: 690.857000, y: 117.4370)) 492 | key.addLine(to: CGPoint(x: 690.920000, y: 108.1310)) 493 | key.close() 494 | 495 | return Key(char: "K", keyPath: key, framePath: frame) 496 | } 497 | 498 | static func keyL() -> Key { 499 | let frame = UIBezierPath() 500 | frame.move(to: CGPoint(x: 784.163000, y: 138.6490)) 501 | frame.addCurve(to: CGPoint(x: 779.001000, y: 105.6180), 502 | controlPoint1: CGPoint(x: 783.079000, y: 127.6530), 503 | controlPoint2: CGPoint(x: 781.352000, y: 116.6420)) 504 | frame.addCurve(to: CGPoint(x: 715.573000, y: 98.0930), 505 | controlPoint1: CGPoint(x: 757.843000, y: 102.2090), 506 | controlPoint2: CGPoint(x: 736.701000, y: 99.7120)) 507 | frame.addCurve(to: CGPoint(x: 722.832000, y: 130.6260), 508 | controlPoint1: CGPoint(x: 718.272000, y: 108.3710), 509 | controlPoint2: CGPoint(x: 720.676000, y: 119.2470)) 510 | frame.addCurve(to: CGPoint(x: 784.163000, y: 138.6490), 511 | controlPoint1: CGPoint(x: 743.360000, y: 132.4800), 512 | controlPoint2: CGPoint(x: 763.803000, y: 135.1670)) 513 | frame.close() 514 | 515 | let key = UIBezierPath() 516 | key.move(to: CGPoint(x: 745.941000, y: 112.0510)) 517 | key.addLine(to: CGPoint(x: 748.806000, y: 112.3030)) 518 | key.addLine(to: CGPoint(x: 748.192000, y: 119.2900)) 519 | key.addLine(to: CGPoint(x: 752.662000, y: 119.6830)) 520 | key.addLine(to: CGPoint(x: 752.461000, y: 121.9650)) 521 | key.addLine(to: CGPoint(x: 745.126000, y: 121.3210)) 522 | key.addLine(to: CGPoint(x: 745.941000, y: 112.0510)) 523 | key.close() 524 | 525 | return Key(char: "L", keyPath: key, framePath: frame) 526 | } 527 | 528 | } 529 | -------------------------------------------------------------------------------- /Keyboard/Line4.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line4.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line4 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line4.keyZ(), 16 | Line4.keyX(), 17 | Line4.keyC(), 18 | Line4.keyV(), 19 | Line4.keyB(), 20 | Line4.keyN(), 21 | Line4.keyM() 22 | ] 23 | } 24 | 25 | static func keyZ() -> Key { 26 | let frame = UIBezierPath() 27 | frame.move(to: CGPoint(x: 380.545000, y: 184.2830)) 28 | frame.addLine(to: CGPoint(x: 380.545000, y: 184.2830)) 29 | frame.addCurve(to: CGPoint(x: 383.144000, y: 218.2580), 30 | controlPoint1: CGPoint(x: 381.877000, y: 195.2750), 31 | controlPoint2: CGPoint(x: 382.748000, y: 206.6560)) 32 | frame.addCurve(to: CGPoint(x: 465.676000, y: 190.5980), 33 | controlPoint1: CGPoint(x: 411.178000, y: 207.3210), 34 | controlPoint2: CGPoint(x: 438.668000, y: 198.1410)) 35 | frame.addLine(to: CGPoint(x: 460.917000, y: 157.9680)) 36 | frame.addCurve(to: CGPoint(x: 380.545000, y: 184.2830), 37 | controlPoint1: CGPoint(x: 434.288000, y: 165.1700), 38 | controlPoint2: CGPoint(x: 407.501000, y: 173.9060)) 39 | frame.close() 40 | 41 | let key = UIBezierPath() 42 | key.move(to: CGPoint(x: 416.386000, y: 182.2860)) 43 | key.addLine(to: CGPoint(x: 424.242000, y: 180.1610)) 44 | key.addLine(to: CGPoint(x: 424.728000, y: 181.9570)) 45 | key.addLine(to: CGPoint(x: 421.107000, y: 188.5780)) 46 | key.addLine(to: CGPoint(x: 426.333000, y: 187.1640)) 47 | key.addLine(to: CGPoint(x: 426.855000, y: 189.0950)) 48 | key.addLine(to: CGPoint(x: 418.332000, y: 191.4010)) 49 | key.addLine(to: CGPoint(x: 417.828000, y: 189.5380)) 50 | key.addLine(to: CGPoint(x: 421.410000, y: 182.9860)) 51 | key.addLine(to: CGPoint(x: 416.904000, y: 184.2050)) 52 | key.addLine(to: CGPoint(x: 416.386000, y: 182.2860)) 53 | key.close() 54 | 55 | return Key(char: "Z", keyPath: key, framePath: frame) 56 | } 57 | 58 | static func keyX() -> Key { 59 | let frame = UIBezierPath() 60 | frame.move(to: CGPoint(x: 460.918000, y: 157.9680)) 61 | frame.addLine(to: CGPoint(x: 465.677000, y: 190.5980)) 62 | frame.addCurve(to: CGPoint(x: 503.334000, y: 181.0820), 63 | controlPoint1: CGPoint(x: 478.335000, y: 187.0630), 64 | controlPoint2: CGPoint(x: 490.884000, y: 183.9000)) 65 | frame.addCurve(to: CGPoint(x: 498.497000, y: 148.8100), 66 | controlPoint1: CGPoint(x: 501.709000, y: 169.6100), 67 | controlPoint2: CGPoint(x: 499.936000, y: 157.7050)) 68 | frame.addCurve(to: CGPoint(x: 460.918000, y: 157.9680), 69 | controlPoint1: CGPoint(x: 486.005000, y: 151.5260), 70 | controlPoint2: CGPoint(x: 473.479000, y: 154.5710)) 71 | frame.close() 72 | 73 | let key = UIBezierPath() 74 | key.move(to: CGPoint(x: 476.880000, y: 165.5710)) 75 | key.addLine(to: CGPoint(x: 479.986000, y: 164.9540)) 76 | key.addLine(to: CGPoint(x: 482.160000, y: 167.4400)) 77 | key.addLine(to: CGPoint(x: 483.174000, y: 164.3200)) 78 | key.addLine(to: CGPoint(x: 486.251000, y: 163.7090)) 79 | key.addLine(to: CGPoint(x: 484.288000, y: 168.6940)) 80 | key.addLine(to: CGPoint(x: 488.331000, y: 172.7830)) 81 | key.addLine(to: CGPoint(x: 485.162000, y: 173.4130)) 82 | key.addLine(to: CGPoint(x: 482.778000, y: 170.8380)) 83 | key.addLine(to: CGPoint(x: 481.558000, y: 174.1290)) 84 | key.addLine(to: CGPoint(x: 478.408000, y: 174.7550)) 85 | key.addLine(to: CGPoint(x: 480.611000, y: 169.3730)) 86 | key.addLine(to: CGPoint(x: 476.880000, y: 165.5710)) 87 | key.close() 88 | 89 | return Key(char: "X", keyPath: key, framePath: frame) 90 | } 91 | 92 | static func keyC() -> Key { 93 | let frame = UIBezierPath() 94 | frame.move(to: CGPoint(x: 498.496000, y: 148.8100)) 95 | frame.addCurve(to: CGPoint(x: 503.333000, y: 181.0820), 96 | controlPoint1: CGPoint(x: 499.935000, y: 157.7050), 97 | controlPoint2: CGPoint(x: 501.708000, y: 169.6100)) 98 | frame.addCurve(to: CGPoint(x: 542.395000, y: 173.3630), 99 | controlPoint1: CGPoint(x: 516.466000, y: 178.1100), 100 | controlPoint2: CGPoint(x: 529.480000, y: 175.5560)) 101 | frame.addCurve(to: CGPoint(x: 538.155000, y: 141.3120), 102 | controlPoint1: CGPoint(x: 540.984000, y: 162.6950), 103 | controlPoint2: CGPoint(x: 539.570000, y: 152.0110)) 104 | frame.addCurve(to: CGPoint(x: 498.496000, y: 148.8100), 105 | controlPoint1: CGPoint(x: 524.973000, y: 143.4450), 106 | controlPoint2: CGPoint(x: 511.755000, y: 145.9280)) 107 | frame.close() 108 | 109 | let key = UIBezierPath() 110 | key.move(to: CGPoint(x: 522.795000, y: 160.9930)) 111 | key.addLine(to: CGPoint(x: 525.411000, y: 161.2950)) 112 | key.addCurve(to: CGPoint(x: 524.937000, y: 163.1800), 113 | controlPoint1: CGPoint(x: 525.369000, y: 162.0210), 114 | controlPoint2: CGPoint(x: 525.212000, y: 162.6490)) 115 | key.addCurve(to: CGPoint(x: 523.794000, y: 164.4760), 116 | controlPoint1: CGPoint(x: 524.664000, y: 163.7110), 117 | controlPoint2: CGPoint(x: 524.282000, y: 164.1430)) 118 | key.addCurve(to: CGPoint(x: 521.831000, y: 165.1970), 119 | controlPoint1: CGPoint(x: 523.305000, y: 164.8090), 120 | controlPoint2: CGPoint(x: 522.651000, y: 165.0490)) 121 | key.addCurve(to: CGPoint(x: 519.313000, y: 165.2040), 122 | controlPoint1: CGPoint(x: 520.835000, y: 165.3770), 123 | controlPoint2: CGPoint(x: 519.996000, y: 165.3790)) 124 | key.addCurve(to: CGPoint(x: 517.405000, y: 163.9720), 125 | controlPoint1: CGPoint(x: 518.630000, y: 165.0280), 126 | controlPoint2: CGPoint(x: 517.994000, y: 164.6180)) 127 | key.addCurve(to: CGPoint(x: 516.213000, y: 161.2990), 128 | controlPoint1: CGPoint(x: 516.815000, y: 163.3260), 129 | controlPoint2: CGPoint(x: 516.417000, y: 162.4350)) 130 | key.addCurve(to: CGPoint(x: 516.792000, y: 157.5880), 131 | controlPoint1: CGPoint(x: 515.940000, y: 159.7830), 132 | controlPoint2: CGPoint(x: 516.134000, y: 158.5470)) 133 | key.addCurve(to: CGPoint(x: 519.992000, y: 155.7510), 134 | controlPoint1: CGPoint(x: 517.452000, y: 156.6300), 135 | controlPoint2: CGPoint(x: 518.518000, y: 156.0170)) 136 | key.addCurve(to: CGPoint(x: 522.839000, y: 155.9600), 137 | controlPoint1: CGPoint(x: 521.145000, y: 155.5430), 138 | controlPoint2: CGPoint(x: 522.095000, y: 155.6130)) 139 | key.addCurve(to: CGPoint(x: 524.697000, y: 157.8440), 140 | controlPoint1: CGPoint(x: 523.584000, y: 156.3080), 141 | controlPoint2: CGPoint(x: 524.203000, y: 156.9360)) 142 | key.addLine(to: CGPoint(x: 522.299000, y: 158.8510)) 143 | key.addCurve(to: CGPoint(x: 521.914000, y: 158.2880), 144 | controlPoint1: CGPoint(x: 522.162000, y: 158.5880), 145 | controlPoint2: CGPoint(x: 522.033000, y: 158.4000)) 146 | key.addCurve(to: CGPoint(x: 521.243000, y: 157.8930), 147 | controlPoint1: CGPoint(x: 521.717000, y: 158.1000), 148 | controlPoint2: CGPoint(x: 521.493000, y: 157.9680)) 149 | key.addCurve(to: CGPoint(x: 520.443000, y: 157.8570), 150 | controlPoint1: CGPoint(x: 520.993000, y: 157.8180), 151 | controlPoint2: CGPoint(x: 520.726000, y: 157.8060)) 152 | key.addCurve(to: CGPoint(x: 519.108000, y: 158.8960), 153 | controlPoint1: CGPoint(x: 519.802000, y: 157.9730), 154 | controlPoint2: CGPoint(x: 519.357000, y: 158.3190)) 155 | key.addCurve(to: CGPoint(x: 519.047000, y: 160.7690), 156 | controlPoint1: CGPoint(x: 518.919000, y: 159.3250), 157 | controlPoint2: CGPoint(x: 518.899000, y: 159.9500)) 158 | key.addCurve(to: CGPoint(x: 519.885000, y: 162.7730), 159 | controlPoint1: CGPoint(x: 519.230000, y: 161.7840), 160 | controlPoint2: CGPoint(x: 519.509000, y: 162.4520)) 161 | key.addCurve(to: CGPoint(x: 521.286000, y: 163.1030), 162 | controlPoint1: CGPoint(x: 520.261000, y: 163.0940), 163 | controlPoint2: CGPoint(x: 520.729000, y: 163.2030)) 164 | key.addCurve(to: CGPoint(x: 522.432000, y: 162.4260), 165 | controlPoint1: CGPoint(x: 521.828000, y: 163.0050), 166 | controlPoint2: CGPoint(x: 522.210000, y: 162.7800)) 167 | key.addCurve(to: CGPoint(x: 522.795000, y: 160.9930), 168 | controlPoint1: CGPoint(x: 522.654000, y: 162.0730), 169 | controlPoint2: CGPoint(x: 522.775000, y: 161.5940)) 170 | key.close() 171 | 172 | return Key(char: "C", keyPath: key, framePath: frame) 173 | } 174 | 175 | static func keyV() -> Key { 176 | let frame = UIBezierPath() 177 | frame.move(to: CGPoint(x: 538.155000, y: 141.3110)) 178 | frame.addCurve(to: CGPoint(x: 542.395000, y: 173.3620), 179 | controlPoint1: CGPoint(x: 539.570000, y: 152.0100), 180 | controlPoint2: CGPoint(x: 540.984000, y: 162.6940)) 181 | frame.addCurve(to: CGPoint(x: 576.058000, y: 168.4840), 182 | controlPoint1: CGPoint(x: 553.696000, y: 171.4420), 183 | controlPoint2: CGPoint(x: 564.915000, y: 169.8240)) 184 | frame.addLine(to: CGPoint(x: 572.512000, y: 136.5680)) 185 | frame.addCurve(to: CGPoint(x: 538.155000, y: 141.3110), 186 | controlPoint1: CGPoint(x: 561.088000, y: 137.8740), 187 | controlPoint2: CGPoint(x: 549.636000, y: 139.4530)) 188 | frame.close() 189 | 190 | let key = UIBezierPath() 191 | key.move(to: CGPoint(x: 551.896000, y: 151.2690)) 192 | key.addLine(to: CGPoint(x: 554.868000, y: 150.8210)) 193 | key.addLine(to: CGPoint(x: 557.938000, y: 157.1300)) 194 | key.addLine(to: CGPoint(x: 558.983000, y: 150.2000)) 195 | key.addLine(to: CGPoint(x: 561.869000, y: 149.7650)) 196 | key.addLine(to: CGPoint(x: 559.840000, y: 159.4820)) 197 | key.addLine(to: CGPoint(x: 556.759000, y: 159.9470)) 198 | key.addLine(to: CGPoint(x: 551.896000, y: 151.2690)) 199 | key.close() 200 | 201 | return Key(char: "V", keyPath: key, framePath: frame) 202 | } 203 | 204 | static func keyB() -> Key { 205 | let frame = UIBezierPath() 206 | frame.move(to: CGPoint(x: 572.513000, y: 136.5690)) 207 | frame.addLine(to: CGPoint(x: 576.059000, y: 168.4850)) 208 | frame.addCurve(to: CGPoint(x: 611.554000, y: 165.1710), 209 | controlPoint1: CGPoint(x: 587.977000, y: 167.0520), 210 | controlPoint2: CGPoint(x: 599.806000, y: 165.9550)) 211 | frame.addCurve(to: CGPoint(x: 607.329000, y: 133.4340), 212 | controlPoint1: CGPoint(x: 610.089000, y: 154.1630), 213 | controlPoint2: CGPoint(x: 608.674000, y: 143.5380)) 214 | frame.addCurve(to: CGPoint(x: 572.513000, y: 136.5690), 215 | controlPoint1: CGPoint(x: 595.752000, y: 134.2010), 216 | controlPoint2: CGPoint(x: 584.147000, y: 135.2390)) 217 | frame.close() 218 | 219 | let key = UIBezierPath() 220 | key.move(to: CGPoint(x: 587.233000, y: 146.0680)) 221 | key.addLine(to: CGPoint(x: 592.594000, y: 145.5820)) 222 | key.addCurve(to: CGPoint(x: 594.711000, y: 146.0600), 223 | controlPoint1: CGPoint(x: 593.487000, y: 145.5010), 224 | controlPoint2: CGPoint(x: 594.193000, y: 145.6600)) 225 | key.addCurve(to: CGPoint(x: 595.578000, y: 147.6390), 226 | controlPoint1: CGPoint(x: 595.230000, y: 146.4580), 227 | controlPoint2: CGPoint(x: 595.519000, y: 146.9850)) 228 | key.addCurve(to: CGPoint(x: 595.193000, y: 149.0950), 229 | controlPoint1: CGPoint(x: 595.628000, y: 148.1870), 230 | controlPoint2: CGPoint(x: 595.500000, y: 148.6720)) 231 | key.addCurve(to: CGPoint(x: 594.251000, y: 149.8050), 232 | controlPoint1: CGPoint(x: 594.989000, y: 149.3770), 233 | controlPoint2: CGPoint(x: 594.675000, y: 149.6140)) 234 | key.addCurve(to: CGPoint(x: 595.795000, y: 150.4960), 235 | controlPoint1: CGPoint(x: 594.931000, y: 149.9050), 236 | controlPoint2: CGPoint(x: 595.446000, y: 150.1350)) 237 | key.addCurve(to: CGPoint(x: 596.399000, y: 151.9240), 238 | controlPoint1: CGPoint(x: 596.144000, y: 150.8580), 239 | controlPoint2: CGPoint(x: 596.346000, y: 151.3330)) 240 | key.addCurve(to: CGPoint(x: 596.181000, y: 153.2500), 241 | controlPoint1: CGPoint(x: 596.443000, y: 152.4040), 242 | controlPoint2: CGPoint(x: 596.370000, y: 152.8460)) 243 | key.addCurve(to: CGPoint(x: 595.347000, y: 154.2430), 244 | controlPoint1: CGPoint(x: 595.993000, y: 153.6530), 245 | controlPoint2: CGPoint(x: 595.715000, y: 153.9850)) 246 | key.addCurve(to: CGPoint(x: 594.287000, y: 154.6450), 247 | controlPoint1: CGPoint(x: 595.119000, y: 154.4040), 248 | controlPoint2: CGPoint(x: 594.766000, y: 154.5380)) 249 | key.addCurve(to: CGPoint(x: 593.015000, y: 154.8880), 250 | controlPoint1: CGPoint(x: 593.650000, y: 154.7880), 251 | controlPoint2: CGPoint(x: 593.226000, y: 154.8690)) 252 | key.addLine(to: CGPoint(x: 588.072000, y: 155.3360)) 253 | key.addLine(to: CGPoint(x: 587.233000, y: 146.0680)) 254 | key.close() 255 | key.move(to: CGPoint(x: 590.452000, y: 149.4400)) 256 | key.addLine(to: CGPoint(x: 591.697000, y: 149.3270)) 257 | key.addCurve(to: CGPoint(x: 592.609000, y: 149.0120), 258 | controlPoint1: CGPoint(x: 592.144000, y: 149.2860), 259 | controlPoint2: CGPoint(x: 592.448000, y: 149.1810)) 260 | key.addCurve(to: CGPoint(x: 592.811000, y: 148.3220), 261 | controlPoint1: CGPoint(x: 592.770000, y: 148.8420), 262 | controlPoint2: CGPoint(x: 592.837000, y: 148.6120)) 263 | key.addCurve(to: CGPoint(x: 592.491000, y: 147.7140), 264 | controlPoint1: CGPoint(x: 592.786000, y: 148.0520), 265 | controlPoint2: CGPoint(x: 592.680000, y: 147.8490)) 266 | key.addCurve(to: CGPoint(x: 591.557000, y: 147.5690), 267 | controlPoint1: CGPoint(x: 592.302000, y: 147.5780), 268 | controlPoint2: CGPoint(x: 591.991000, y: 147.5300)) 269 | key.addLine(to: CGPoint(x: 590.293000, y: 147.6840)) 270 | key.addLine(to: CGPoint(x: 590.452000, y: 149.4400)) 271 | key.close() 272 | key.move(to: CGPoint(x: 590.782000, y: 153.0820)) 273 | key.addLine(to: CGPoint(x: 592.243000, y: 152.9490)) 274 | key.addCurve(to: CGPoint(x: 593.262000, y: 152.5930), 275 | controlPoint1: CGPoint(x: 592.735000, y: 152.9040), 276 | controlPoint2: CGPoint(x: 593.075000, y: 152.7860)) 277 | key.addCurve(to: CGPoint(x: 593.502000, y: 151.8600), 278 | controlPoint1: CGPoint(x: 593.448000, y: 152.4000), 279 | controlPoint2: CGPoint(x: 593.528000, y: 152.1550)) 280 | key.addCurve(to: CGPoint(x: 593.142000, y: 151.2270), 281 | controlPoint1: CGPoint(x: 593.477000, y: 151.5860), 282 | controlPoint2: CGPoint(x: 593.357000, y: 151.3750)) 283 | key.addCurve(to: CGPoint(x: 592.067000, y: 151.0730), 284 | controlPoint1: CGPoint(x: 592.927000, y: 151.0790), 285 | controlPoint2: CGPoint(x: 592.569000, y: 151.0270)) 286 | key.addLine(to: CGPoint(x: 590.613000, y: 151.2050)) 287 | key.addLine(to: CGPoint(x: 590.782000, y: 153.0820)) 288 | key.close() 289 | 290 | return Key(char: "B", keyPath: key, framePath: frame) 291 | } 292 | 293 | static func keyN() -> Key { 294 | let frame = UIBezierPath() 295 | frame.move(to: CGPoint(x: 607.329000, y: 133.4340)) 296 | frame.addCurve(to: CGPoint(x: 611.554000, y: 165.1710), 297 | controlPoint1: CGPoint(x: 608.674000, y: 143.5380), 298 | controlPoint2: CGPoint(x: 610.088000, y: 154.1630)) 299 | frame.addCurve(to: CGPoint(x: 644.693000, y: 163.8040), 300 | controlPoint1: CGPoint(x: 622.673000, y: 164.4290), 301 | controlPoint2: CGPoint(x: 633.717000, y: 163.9790)) 302 | frame.addLine(to: CGPoint(x: 640.560000, y: 131.9910)) 303 | frame.addCurve(to: CGPoint(x: 607.329000, y: 133.4340), 304 | controlPoint1: CGPoint(x: 629.509000, y: 132.2210), 305 | controlPoint2: CGPoint(x: 618.432000, y: 132.6980)) 306 | frame.close() 307 | 308 | let key = UIBezierPath() 309 | key.move(to: CGPoint(x: 621.471000, y: 143.9960)) 310 | key.addLine(to: CGPoint(x: 624.153000, y: 143.8640)) 311 | key.addLine(to: CGPoint(x: 627.905000, y: 148.8340)) 312 | key.addLine(to: CGPoint(x: 627.652000, y: 143.6920)) 313 | key.addLine(to: CGPoint(x: 630.360000, y: 143.5590)) 314 | key.addLine(to: CGPoint(x: 630.817000, y: 152.8530)) 315 | key.addLine(to: CGPoint(x: 628.109000, y: 152.9860)) 316 | key.addLine(to: CGPoint(x: 624.378000, y: 148.0540)) 317 | key.addLine(to: CGPoint(x: 624.629000, y: 153.1570)) 318 | key.addLine(to: CGPoint(x: 621.927000, y: 153.2900)) 319 | key.addLine(to: CGPoint(x: 621.471000, y: 143.9960)) 320 | key.close() 321 | 322 | return Key(char: "N", keyPath: key, framePath: frame) 323 | } 324 | 325 | static func keyM() -> Key { 326 | let frame = UIBezierPath() 327 | frame.move(to: CGPoint(x: 679.573000, y: 164.1970)) 328 | frame.addCurve(to: CGPoint(x: 675.222000, y: 132.0890), 329 | controlPoint1: CGPoint(x: 678.476000, y: 153.9240), 330 | controlPoint2: CGPoint(x: 677.039000, y: 143.2390)) 331 | frame.addCurve(to: CGPoint(x: 640.561000, y: 131.9920), 332 | controlPoint1: CGPoint(x: 663.696000, y: 131.7820), 333 | controlPoint2: CGPoint(x: 652.143000, y: 131.7510)) 334 | frame.addLine(to: CGPoint(x: 644.694000, y: 163.8050)) 335 | frame.addCurve(to: CGPoint(x: 679.573000, y: 164.1970), 336 | controlPoint1: CGPoint(x: 656.397000, y: 163.6180), 337 | controlPoint2: CGPoint(x: 668.023000, y: 163.7470)) 338 | frame.close() 339 | 340 | let key = UIBezierPath() 341 | key.move(to: CGPoint(x: 654.582000, y: 143.6500)) 342 | key.addLine(to: CGPoint(x: 658.363000, y: 143.7390)) 343 | key.addLine(to: CGPoint(x: 659.688000, y: 149.4340)) 344 | key.addLine(to: CGPoint(x: 661.268000, y: 143.8070)) 345 | key.addLine(to: CGPoint(x: 665.046000, y: 143.8950)) 346 | key.addLine(to: CGPoint(x: 664.828000, y: 153.1980)) 347 | key.addLine(to: CGPoint(x: 662.474000, y: 153.1430)) 348 | key.addLine(to: CGPoint(x: 662.640000, y: 146.0480)) 349 | key.addLine(to: CGPoint(x: 660.659000, y: 153.1000)) 350 | key.addLine(to: CGPoint(x: 658.529000, y: 153.0500)) 351 | key.addLine(to: CGPoint(x: 656.884000, y: 145.9130)) 352 | key.addLine(to: CGPoint(x: 656.718000, y: 153.0080)) 353 | key.addLine(to: CGPoint(x: 654.363000, y: 152.9530)) 354 | key.addLine(to: CGPoint(x: 654.582000, y: 143.6500)) 355 | key.close() 356 | 357 | return Key(char: "M", keyPath: key, framePath: frame) 358 | } 359 | 360 | } 361 | -------------------------------------------------------------------------------- /Keyboard/Line5.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line5.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line5 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line5.hat(), 16 | Line5.ampersand(), 17 | Line5.asterisk(), 18 | Line5.parenthesesLeft(), 19 | Line5.parenthesesRight() 20 | ] 21 | } 22 | 23 | static func hat() -> Key { 24 | let frame = UIBezierPath() 25 | frame.move(to: CGPoint(x: 170.723000, y: 0.0000)) 26 | frame.addLine(to: CGPoint(x: 142.795000, y: 0.0000)) 27 | frame.addLine(to: CGPoint(x: 135.176000, y: 16.4410)) 28 | frame.addCurve(to: CGPoint(x: 219.351000, y: 70.7810), 29 | controlPoint1: CGPoint(x: 167.361000, y: 27.9250), 30 | controlPoint2: CGPoint(x: 196.079000, y: 46.7050)) 31 | frame.addLine(to: CGPoint(x: 238.414000, y: 48.7850)) 32 | frame.addCurve(to: CGPoint(x: 170.723000, y: 0.0000), 33 | controlPoint1: CGPoint(x: 218.854000, y: 28.9600), 34 | controlPoint2: CGPoint(x: 195.997000, y: 12.3970)) 35 | frame.close() 36 | 37 | let key = UIBezierPath() 38 | key.move(to: CGPoint(x: 190.747000, y: 23.3980)) 39 | key.addLine(to: CGPoint(x: 192.194000, y: 24.4190)) 40 | key.addLine(to: CGPoint(x: 191.334000, y: 30.1300)) 41 | key.addLine(to: CGPoint(x: 189.503000, y: 28.8370)) 42 | key.addLine(to: CGPoint(x: 190.299000, y: 25.5840)) 43 | key.addLine(to: CGPoint(x: 187.490000, y: 27.4170)) 44 | key.addLine(to: CGPoint(x: 185.655000, y: 26.1200)) 45 | key.addLine(to: CGPoint(x: 190.747000, y: 23.3980)) 46 | key.close() 47 | 48 | return Key(char: "^", keyPath: key, framePath: frame) 49 | } 50 | 51 | static func ampersand() -> Key { 52 | let frame = UIBezierPath() 53 | frame.move(to: CGPoint(x: 238.414000, y: 48.7850)) 54 | frame.addLine(to: CGPoint(x: 219.351000, y: 70.7810)) 55 | frame.addCurve(to: CGPoint(x: 253.520000, y: 116.8420), 56 | controlPoint1: CGPoint(x: 232.641000, y: 84.5300), 57 | controlPoint2: CGPoint(x: 244.156000, y: 100.0050)) 58 | frame.addLine(to: CGPoint(x: 277.811000, y: 100.8450)) 59 | frame.addCurve(to: CGPoint(x: 238.414000, y: 48.7850), 60 | controlPoint1: CGPoint(x: 266.984000, y: 81.7780), 61 | controlPoint2: CGPoint(x: 253.707000, y: 64.2850)) 62 | frame.close() 63 | 64 | let key = UIBezierPath() 65 | key.move(to: CGPoint(x: 250.642000, y: 84.0950)) 66 | key.addLine(to: CGPoint(x: 251.507000, y: 85.9750)) 67 | key.addCurve(to: CGPoint(x: 250.611000, y: 86.2750), 68 | controlPoint1: CGPoint(x: 251.147000, y: 86.1170), 69 | controlPoint2: CGPoint(x: 250.848000, y: 86.2160)) 70 | key.addCurve(to: CGPoint(x: 249.730000, y: 86.4270), 71 | controlPoint1: CGPoint(x: 250.374000, y: 86.3340), 72 | controlPoint2: CGPoint(x: 250.080000, y: 86.3840)) 73 | key.addLine(to: CGPoint(x: 249.789000, y: 87.6040)) 74 | key.addCurve(to: CGPoint(x: 249.849000, y: 88.1320), 75 | controlPoint1: CGPoint(x: 249.800000, y: 87.7450), 76 | controlPoint2: CGPoint(x: 249.820000, y: 87.9210)) 77 | key.addLine(to: CGPoint(x: 247.734000, y: 87.9960)) 78 | key.addCurve(to: CGPoint(x: 247.629000, y: 87.0830), 79 | controlPoint1: CGPoint(x: 247.688000, y: 87.7120), 80 | controlPoint2: CGPoint(x: 247.653000, y: 87.4070)) 81 | key.addCurve(to: CGPoint(x: 247.548000, y: 86.2220), 82 | controlPoint1: CGPoint(x: 247.605000, y: 86.7580), 83 | controlPoint2: CGPoint(x: 247.578000, y: 86.4720)) 84 | key.addCurve(to: CGPoint(x: 246.217000, y: 85.5440), 85 | controlPoint1: CGPoint(x: 247.040000, y: 86.0450), 86 | controlPoint2: CGPoint(x: 246.596000, y: 85.8200)) 87 | key.addCurve(to: CGPoint(x: 244.710000, y: 84.0270), 88 | controlPoint1: CGPoint(x: 245.692000, y: 85.1630), 89 | controlPoint2: CGPoint(x: 245.190000, y: 84.6570)) 90 | key.addCurve(to: CGPoint(x: 243.648000, y: 81.3560), 91 | controlPoint1: CGPoint(x: 243.959000, y: 83.0420), 92 | controlPoint2: CGPoint(x: 243.605000, y: 82.1500)) 93 | key.addCurve(to: CGPoint(x: 244.593000, y: 79.4960), 94 | controlPoint1: CGPoint(x: 243.692000, y: 80.5620), 95 | controlPoint2: CGPoint(x: 244.007000, y: 79.9420)) 96 | key.addCurve(to: CGPoint(x: 246.111000, y: 79.0110), 97 | controlPoint1: CGPoint(x: 245.014000, y: 79.1750), 98 | controlPoint2: CGPoint(x: 245.519000, y: 79.0140)) 99 | key.addCurve(to: CGPoint(x: 248.120000, y: 79.6730), 100 | controlPoint1: CGPoint(x: 246.702000, y: 79.0070), 101 | controlPoint2: CGPoint(x: 247.372000, y: 79.2290)) 102 | key.addCurve(to: CGPoint(x: 248.548000, y: 78.4700), 103 | controlPoint1: CGPoint(x: 248.242000, y: 79.1550), 104 | controlPoint2: CGPoint(x: 248.384000, y: 78.7550)) 105 | key.addCurve(to: CGPoint(x: 249.167000, y: 77.7590), 106 | controlPoint1: CGPoint(x: 248.712000, y: 78.1860), 107 | controlPoint2: CGPoint(x: 248.918000, y: 77.9490)) 108 | key.addCurve(to: CGPoint(x: 250.923000, y: 77.3710), 109 | controlPoint1: CGPoint(x: 249.692000, y: 77.3590), 110 | controlPoint2: CGPoint(x: 250.278000, y: 77.2300)) 111 | key.addCurve(to: CGPoint(x: 252.821000, y: 78.8060), 112 | controlPoint1: CGPoint(x: 251.568000, y: 77.5130), 113 | controlPoint2: CGPoint(x: 252.201000, y: 77.9910)) 114 | key.addCurve(to: CGPoint(x: 253.733000, y: 81.0080), 115 | controlPoint1: CGPoint(x: 253.454000, y: 79.6370), 116 | controlPoint2: CGPoint(x: 253.758000, y: 80.3710)) 117 | key.addCurve(to: CGPoint(x: 253.018000, y: 82.4790), 118 | controlPoint1: CGPoint(x: 253.707000, y: 81.6440), 119 | controlPoint2: CGPoint(x: 253.469000, y: 82.1350)) 120 | key.addCurve(to: CGPoint(x: 252.155000, y: 82.8530), 121 | controlPoint1: CGPoint(x: 252.766000, y: 82.6710), 122 | controlPoint2: CGPoint(x: 252.478000, y: 82.7960)) 123 | key.addCurve(to: CGPoint(x: 251.260000, y: 82.8520), 124 | controlPoint1: CGPoint(x: 251.831000, y: 82.9110), 125 | controlPoint2: CGPoint(x: 251.533000, y: 82.9100)) 126 | key.addCurve(to: CGPoint(x: 249.925000, y: 82.4410), 127 | controlPoint1: CGPoint(x: 250.987000, y: 82.7940), 128 | controlPoint2: CGPoint(x: 250.542000, y: 82.6580)) 129 | key.addCurve(to: CGPoint(x: 249.778000, y: 84.3330), 130 | controlPoint1: CGPoint(x: 249.840000, y: 83.0760), 131 | controlPoint2: CGPoint(x: 249.790000, y: 83.7070)) 132 | key.addCurve(to: CGPoint(x: 250.642000, y: 84.0950), 133 | controlPoint1: CGPoint(x: 250.065000, y: 84.2780), 134 | controlPoint2: CGPoint(x: 250.352000, y: 84.1980)) 135 | key.close() 136 | key.move(to: CGPoint(x: 247.784000, y: 81.3810)) 137 | key.addCurve(to: CGPoint(x: 246.845000, y: 81.2060), 138 | controlPoint1: CGPoint(x: 247.370000, y: 81.2490), 139 | controlPoint2: CGPoint(x: 247.057000, y: 81.1930)) 140 | key.addCurve(to: CGPoint(x: 246.290000, y: 81.4100), 141 | controlPoint1: CGPoint(x: 246.633000, y: 81.2220), 142 | controlPoint2: CGPoint(x: 246.448000, y: 81.2900)) 143 | key.addCurve(to: CGPoint(x: 245.875000, y: 82.2270), 144 | controlPoint1: CGPoint(x: 246.044000, y: 81.5980), 145 | controlPoint2: CGPoint(x: 245.906000, y: 81.8700)) 146 | key.addCurve(to: CGPoint(x: 246.218000, y: 83.2750), 147 | controlPoint1: CGPoint(x: 245.845000, y: 82.5860), 148 | controlPoint2: CGPoint(x: 245.959000, y: 82.9350)) 149 | key.addCurve(to: CGPoint(x: 247.590000, y: 84.1860), 150 | controlPoint1: CGPoint(x: 246.498000, y: 83.6420), 151 | controlPoint2: CGPoint(x: 246.955000, y: 83.9460)) 152 | key.addCurve(to: CGPoint(x: 247.784000, y: 81.3810), 153 | controlPoint1: CGPoint(x: 247.593000, y: 83.4910), 154 | controlPoint2: CGPoint(x: 247.658000, y: 82.5580)) 155 | key.close() 156 | key.move(to: CGPoint(x: 250.139000, y: 80.7440)) 157 | key.addCurve(to: CGPoint(x: 251.080000, y: 81.0000), 158 | controlPoint1: CGPoint(x: 250.486000, y: 80.8990), 159 | controlPoint2: CGPoint(x: 250.800000, y: 80.9850)) 160 | key.addCurve(to: CGPoint(x: 251.727000, y: 80.8510), 161 | controlPoint1: CGPoint(x: 251.360000, y: 81.0160), 162 | controlPoint2: CGPoint(x: 251.576000, y: 80.9660)) 163 | key.addCurve(to: CGPoint(x: 251.990000, y: 80.3630), 164 | controlPoint1: CGPoint(x: 251.885000, y: 80.7300), 165 | controlPoint2: CGPoint(x: 251.973000, y: 80.5680)) 166 | key.addCurve(to: CGPoint(x: 251.773000, y: 79.7380), 167 | controlPoint1: CGPoint(x: 252.007000, y: 80.1590), 168 | controlPoint2: CGPoint(x: 251.934000, y: 79.9500)) 169 | key.addCurve(to: CGPoint(x: 251.203000, y: 79.3670), 170 | controlPoint1: CGPoint(x: 251.614000, y: 79.5290), 171 | controlPoint2: CGPoint(x: 251.424000, y: 79.4060)) 172 | key.addCurve(to: CGPoint(x: 250.624000, y: 79.4970), 173 | controlPoint1: CGPoint(x: 250.982000, y: 79.3280), 174 | controlPoint2: CGPoint(x: 250.789000, y: 79.3710)) 175 | key.addCurve(to: CGPoint(x: 250.139000, y: 80.7440), 176 | controlPoint1: CGPoint(x: 250.416000, y: 79.6550), 177 | controlPoint2: CGPoint(x: 250.254000, y: 80.0710)) 178 | key.close() 179 | 180 | return Key(char: "&", keyPath: key, framePath: frame) 181 | } 182 | 183 | static func asterisk() -> Key { 184 | let frame = UIBezierPath() 185 | frame.move(to: CGPoint(x: 280.564000, y: 105.8430)) 186 | frame.addLine(to: CGPoint(x: 255.715000, y: 120.9030)) 187 | frame.addCurve(to: CGPoint(x: 272.384000, y: 162.0630), 188 | controlPoint1: CGPoint(x: 262.592000, y: 133.9050), 189 | controlPoint2: CGPoint(x: 268.203000, y: 147.6800)) 190 | frame.addLine(to: CGPoint(x: 298.469000, y: 148.1100)) 191 | frame.addCurve(to: CGPoint(x: 280.564000, y: 105.8430), 192 | controlPoint1: CGPoint(x: 293.789000, y: 133.3790), 193 | controlPoint2: CGPoint(x: 287.771000, y: 119.2440)) 194 | frame.close() 195 | 196 | let key = UIBezierPath() 197 | key.move(to: CGPoint(x: 283.136000, y: 132.0370)) 198 | key.addLine(to: CGPoint(x: 283.701000, y: 133.3200)) 199 | key.addLine(to: CGPoint(x: 282.778000, y: 133.6020)) 200 | key.addCurve(to: CGPoint(x: 281.988000, y: 133.7770), 201 | controlPoint1: CGPoint(x: 282.554000, y: 133.6730), 202 | controlPoint2: CGPoint(x: 282.292000, y: 133.7310)) 203 | key.addCurve(to: CGPoint(x: 282.267000, y: 134.0010), 204 | controlPoint1: CGPoint(x: 282.126000, y: 133.8910), 205 | controlPoint2: CGPoint(x: 282.219000, y: 133.9660)) 206 | key.addCurve(to: CGPoint(x: 282.622000, y: 134.2880), 207 | controlPoint1: CGPoint(x: 282.427000, y: 134.1250), 208 | controlPoint2: CGPoint(x: 282.546000, y: 134.2210)) 209 | key.addLine(to: CGPoint(x: 283.361000, y: 134.9270)) 210 | key.addLine(to: CGPoint(x: 282.312000, y: 135.8680)) 211 | key.addLine(to: CGPoint(x: 281.732000, y: 135.0560)) 212 | key.addCurve(to: CGPoint(x: 281.348000, y: 134.3580), 213 | controlPoint1: CGPoint(x: 281.629000, y: 134.9070), 214 | controlPoint2: CGPoint(x: 281.501000, y: 134.6730)) 215 | key.addCurve(to: CGPoint(x: 281.112000, y: 135.0800), 216 | controlPoint1: CGPoint(x: 281.274000, y: 134.6490), 217 | controlPoint2: CGPoint(x: 281.194000, y: 134.8910)) 218 | key.addLine(to: CGPoint(x: 280.721000, y: 135.9740)) 219 | key.addLine(to: CGPoint(x: 279.476000, y: 135.2740)) 220 | key.addLine(to: CGPoint(x: 280.071000, y: 134.4990)) 221 | key.addCurve(to: CGPoint(x: 280.594000, y: 133.9070), 222 | controlPoint1: CGPoint(x: 280.155000, y: 134.3880), 223 | controlPoint2: CGPoint(x: 280.330000, y: 134.1900)) 224 | key.addCurve(to: CGPoint(x: 279.805000, y: 133.8940), 225 | controlPoint1: CGPoint(x: 280.172000, y: 133.9140), 226 | controlPoint2: CGPoint(x: 279.908000, y: 133.9090)) 227 | key.addLine(to: CGPoint(x: 278.828000, y: 133.8040)) 228 | key.addLine(to: CGPoint(x: 279.139000, y: 132.3840)) 229 | key.addLine(to: CGPoint(x: 280.082000, y: 132.7450)) 230 | key.addCurve(to: CGPoint(x: 280.782000, y: 133.0740), 231 | controlPoint1: CGPoint(x: 280.344000, y: 132.8470), 232 | controlPoint2: CGPoint(x: 280.578000, y: 132.9570)) 233 | key.addCurve(to: CGPoint(x: 280.577000, y: 132.3250), 234 | controlPoint1: CGPoint(x: 280.720000, y: 132.8890), 235 | controlPoint2: CGPoint(x: 280.651000, y: 132.6390)) 236 | key.addLine(to: CGPoint(x: 280.325000, y: 131.3610)) 237 | key.addLine(to: CGPoint(x: 281.735000, y: 131.2390)) 238 | key.addLine(to: CGPoint(x: 281.725000, y: 132.2080)) 239 | key.addCurve(to: CGPoint(x: 281.643000, y: 133.0000), 240 | controlPoint1: CGPoint(x: 281.723000, y: 132.3110), 241 | controlPoint2: CGPoint(x: 281.697000, y: 132.5740)) 242 | key.addCurve(to: CGPoint(x: 282.308000, y: 132.5400), 243 | controlPoint1: CGPoint(x: 281.935000, y: 132.7830), 244 | controlPoint2: CGPoint(x: 282.157000, y: 132.6300)) 245 | key.addLine(to: CGPoint(x: 283.136000, y: 132.0370)) 246 | key.close() 247 | 248 | return Key(char: "*", keyPath: key, framePath: frame) 249 | } 250 | 251 | static func parenthesesLeft() -> Key { 252 | let frame = UIBezierPath() 253 | frame.move(to: CGPoint(x: 298.469000, y: 148.1110)) 254 | frame.addLine(to: CGPoint(x: 272.384000, y: 162.0640)) 255 | frame.addCurve(to: CGPoint(x: 280.163000, y: 203.1650), 256 | controlPoint1: CGPoint(x: 276.229000, y: 175.2920), 257 | controlPoint2: CGPoint(x: 278.863000, y: 189.0350)) 258 | frame.addLine(to: CGPoint(x: 308.230000, y: 192.8870)) 259 | frame.addCurve(to: CGPoint(x: 298.469000, y: 148.1110), 260 | controlPoint1: CGPoint(x: 306.336000, y: 177.4820), 261 | controlPoint2: CGPoint(x: 303.045000, y: 162.5110)) 262 | frame.close() 263 | 264 | let key = UIBezierPath() 265 | key.move(to: CGPoint(x: 295.507000, y: 174.5910)) 266 | key.addLine(to: CGPoint(x: 295.947000, y: 176.1420)) 267 | key.addCurve(to: CGPoint(x: 292.346000, y: 175.9170), 268 | controlPoint1: CGPoint(x: 294.615000, y: 175.9450), 269 | controlPoint2: CGPoint(x: 293.415000, y: 175.8710)) 270 | key.addCurve(to: CGPoint(x: 289.538000, y: 176.3920), 271 | controlPoint1: CGPoint(x: 291.439000, y: 175.9600), 272 | controlPoint2: CGPoint(x: 290.503000, y: 176.1170)) 273 | key.addCurve(to: CGPoint(x: 284.210000, y: 179.4750), 274 | controlPoint1: CGPoint(x: 287.677000, y: 176.9200), 275 | controlPoint2: CGPoint(x: 285.902000, y: 177.9480)) 276 | key.addLine(to: CGPoint(x: 283.770000, y: 177.9240)) 277 | key.addCurve(to: CGPoint(x: 286.335000, y: 175.3980), 278 | controlPoint1: CGPoint(x: 284.666000, y: 176.8170), 279 | controlPoint2: CGPoint(x: 285.521000, y: 175.9740)) 280 | key.addCurve(to: CGPoint(x: 289.048000, y: 174.1100), 281 | controlPoint1: CGPoint(x: 287.150000, y: 174.8210), 282 | controlPoint2: CGPoint(x: 288.054000, y: 174.3920)) 283 | key.addCurve(to: CGPoint(x: 292.128000, y: 173.7790), 284 | controlPoint1: CGPoint(x: 290.078000, y: 173.8170), 285 | controlPoint2: CGPoint(x: 291.105000, y: 173.7080)) 286 | key.addCurve(to: CGPoint(x: 295.507000, y: 174.5910), 287 | controlPoint1: CGPoint(x: 293.153000, y: 173.8520), 288 | controlPoint2: CGPoint(x: 294.279000, y: 174.1220)) 289 | key.close() 290 | 291 | return Key(char: "(", keyPath: key, framePath: frame) 292 | } 293 | 294 | static func parenthesesRight() -> Key { 295 | let frame = UIBezierPath() 296 | frame.move(to: CGPoint(x: 280.797000, y: 234.9750)) 297 | frame.addLine(to: CGPoint(x: 309.843000, y: 234.9750)) 298 | frame.addCurve(to: CGPoint(x: 310.109000, y: 223.5220), 299 | controlPoint1: CGPoint(x: 310.015000, y: 231.1780), 300 | controlPoint2: CGPoint(x: 310.109000, y: 227.3610)) 301 | frame.addCurve(to: CGPoint(x: 308.230000, y: 192.8860), 302 | controlPoint1: CGPoint(x: 310.109000, y: 213.1480), 303 | controlPoint2: CGPoint(x: 309.464000, y: 202.9260)) 304 | frame.addLine(to: CGPoint(x: 280.163000, y: 203.1640)) 305 | frame.addCurve(to: CGPoint(x: 281.099000, y: 223.5220), 306 | controlPoint1: CGPoint(x: 280.780000, y: 209.8680), 307 | controlPoint2: CGPoint(x: 281.099000, y: 216.6570)) 308 | frame.addCurve(to: CGPoint(x: 280.797000, y: 234.9750), 309 | controlPoint1: CGPoint(x: 281.099000, y: 227.3650), 310 | controlPoint2: CGPoint(x: 280.991000, y: 231.1820)) 311 | frame.close() 312 | 313 | let key = UIBezierPath() 314 | key.move(to: CGPoint(x: 298.078000, y: 218.7920)) 315 | key.addCurve(to: CGPoint(x: 295.166000, y: 219.8500), 316 | controlPoint1: CGPoint(x: 297.190000, y: 219.3080), 317 | controlPoint2: CGPoint(x: 296.220000, y: 219.6590)) 318 | key.addCurve(to: CGPoint(x: 292.163000, y: 219.8850), 319 | controlPoint1: CGPoint(x: 294.150000, y: 220.0340), 320 | controlPoint2: CGPoint(x: 293.149000, y: 220.0450)) 321 | key.addCurve(to: CGPoint(x: 288.748000, y: 218.7430), 322 | controlPoint1: CGPoint(x: 291.178000, y: 219.7260), 323 | controlPoint2: CGPoint(x: 290.039000, y: 219.3450)) 324 | key.addLine(to: CGPoint(x: 288.462000, y: 217.1560)) 325 | key.addCurve(to: CGPoint(x: 294.602000, y: 217.5840), 326 | controlPoint1: CGPoint(x: 290.652000, y: 217.7850), 327 | controlPoint2: CGPoint(x: 292.699000, y: 217.9270)) 328 | key.addCurve(to: CGPoint(x: 297.333000, y: 216.7750), 329 | controlPoint1: CGPoint(x: 295.589000, y: 217.4060), 330 | controlPoint2: CGPoint(x: 296.500000, y: 217.1370)) 331 | key.addCurve(to: CGPoint(x: 300.468000, y: 214.9910), 332 | controlPoint1: CGPoint(x: 298.314000, y: 216.3480), 333 | controlPoint2: CGPoint(x: 299.359000, y: 215.7540)) 334 | key.addLine(to: CGPoint(x: 300.754000, y: 216.5780)) 335 | key.addCurve(to: CGPoint(x: 298.078000, y: 218.7920), 336 | controlPoint1: CGPoint(x: 299.858000, y: 217.5390), 337 | controlPoint2: CGPoint(x: 298.965000, y: 218.2790)) 338 | key.close() 339 | 340 | return Key(char: ")", keyPath: key, framePath: frame) 341 | } 342 | 343 | } 344 | -------------------------------------------------------------------------------- /Keyboard/Line7.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line7.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line7 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line7.tilde(), 16 | Line7.braceLeft(), 17 | Line7.braceRight(), 18 | Line7.apostrophe(), 19 | Line7.bracketLeft(), 20 | Line7.bracketRight() 21 | ] 22 | } 23 | 24 | static func tilde() -> Key { 25 | let frame = UIBezierPath() 26 | frame.move(to: CGPoint(x: 0.000000, y: 50.6910)) 27 | frame.addLine(to: CGPoint(x: 0.000000, y: 76.4470)) 28 | frame.addCurve(to: CGPoint(x: 22.581000, y: 68.9690), 29 | controlPoint1: CGPoint(x: 7.270000, y: 73.4140), 30 | controlPoint2: CGPoint(x: 14.814000, y: 70.9090)) 31 | frame.addLine(to: CGPoint(x: 24.237000, y: 43.9470)) 32 | frame.addCurve(to: CGPoint(x: 0.000000, y: 50.6910), 33 | controlPoint1: CGPoint(x: 15.942000, y: 45.6520), 34 | controlPoint2: CGPoint(x: 7.847000, y: 47.9080)) 35 | frame.close() 36 | 37 | let key = UIBezierPath() 38 | key.move(to: CGPoint(x: 14.413000, y: 58.7330)) 39 | key.addLine(to: CGPoint(x: 14.335000, y: 60.8010)) 40 | key.addCurve(to: CGPoint(x: 13.126000, y: 61.5360), 41 | controlPoint1: CGPoint(x: 13.834000, y: 61.1720), 42 | controlPoint2: CGPoint(x: 13.431000, y: 61.4170)) 43 | key.addCurve(to: CGPoint(x: 12.186000, y: 61.6980), 44 | controlPoint1: CGPoint(x: 12.821000, y: 61.6570), 45 | controlPoint2: CGPoint(x: 12.507000, y: 61.7110)) 46 | key.addCurve(to: CGPoint(x: 11.451000, y: 61.5620), 47 | controlPoint1: CGPoint(x: 11.940000, y: 61.6890), 48 | controlPoint2: CGPoint(x: 11.696000, y: 61.6430)) 49 | key.addCurve(to: CGPoint(x: 10.310000, y: 61.0110), 50 | controlPoint1: CGPoint(x: 11.206000, y: 61.4810), 51 | controlPoint2: CGPoint(x: 10.826000, y: 61.2970)) 52 | key.addCurve(to: CGPoint(x: 9.078000, y: 60.5650), 53 | controlPoint1: CGPoint(x: 9.792000, y: 60.7250), 54 | controlPoint2: CGPoint(x: 9.383000, y: 60.5760)) 55 | key.addCurve(to: CGPoint(x: 7.023000, y: 61.5040), 56 | controlPoint1: CGPoint(x: 8.427000, y: 60.5410), 57 | controlPoint2: CGPoint(x: 7.742000, y: 60.8540)) 58 | key.addLine(to: CGPoint(x: 7.101000, y: 59.4170)) 59 | key.addCurve(to: CGPoint(x: 8.233000, y: 58.7050), 60 | controlPoint1: CGPoint(x: 7.508000, y: 59.0780), 61 | controlPoint2: CGPoint(x: 7.885000, y: 58.8410)) 62 | key.addCurve(to: CGPoint(x: 9.364000, y: 58.5230), 63 | controlPoint1: CGPoint(x: 8.581000, y: 58.5680), 64 | controlPoint2: CGPoint(x: 8.958000, y: 58.5080)) 65 | key.addCurve(to: CGPoint(x: 10.013000, y: 58.6470), 66 | controlPoint1: CGPoint(x: 9.572000, y: 58.5310), 67 | controlPoint2: CGPoint(x: 9.787000, y: 58.5720)) 68 | key.addCurve(to: CGPoint(x: 11.003000, y: 59.1090), 69 | controlPoint1: CGPoint(x: 10.239000, y: 58.7210), 70 | controlPoint2: CGPoint(x: 10.569000, y: 58.8760)) 71 | key.addCurve(to: CGPoint(x: 11.929000, y: 59.5520), 72 | controlPoint1: CGPoint(x: 11.436000, y: 59.3420), 73 | controlPoint2: CGPoint(x: 11.746000, y: 59.4910)) 74 | key.addCurve(to: CGPoint(x: 12.453000, y: 59.6560), 75 | controlPoint1: CGPoint(x: 12.113000, y: 59.6140), 76 | controlPoint2: CGPoint(x: 12.288000, y: 59.6490)) 77 | key.addCurve(to: CGPoint(x: 14.413000, y: 58.7330), 78 | controlPoint1: CGPoint(x: 13.020000, y: 59.6780), 79 | controlPoint2: CGPoint(x: 13.673000, y: 59.3710)) 80 | key.close() 81 | 82 | return Key(char: "~", keyPath: key, framePath: frame) 83 | } 84 | 85 | static func braceLeft() -> Key { 86 | let frame = UIBezierPath() 87 | frame.move(to: CGPoint(x: 61.292000, y: 40.1810)) 88 | frame.addCurve(to: CGPoint(x: 24.237000, y: 43.9460), 89 | controlPoint1: CGPoint(x: 48.595000, y: 40.1810), 90 | controlPoint2: CGPoint(x: 36.205000, y: 41.4860)) 91 | frame.addLine(to: CGPoint(x: 22.581000, y: 68.9680)) 92 | frame.addCurve(to: CGPoint(x: 58.803000, y: 64.2580), 93 | controlPoint1: CGPoint(x: 34.201000, y: 66.0650), 94 | controlPoint2: CGPoint(x: 46.329000, y: 64.4510)) 95 | frame.addLine(to: CGPoint(x: 63.234000, y: 40.2050)) 96 | frame.addCurve(to: CGPoint(x: 61.292000, y: 40.1810), 97 | controlPoint1: CGPoint(x: 62.586000, y: 40.1990), 98 | controlPoint2: CGPoint(x: 61.942000, y: 40.1810)) 99 | frame.close() 100 | 101 | let key = UIBezierPath() 102 | key.move(to: CGPoint(x: 43.534000, y: 47.9160)) 103 | key.addLine(to: CGPoint(x: 43.359000, y: 49.9910)) 104 | key.addLine(to: CGPoint(x: 43.076000, y: 49.9670)) 105 | key.addCurve(to: CGPoint(x: 42.468000, y: 50.0850), 106 | controlPoint1: CGPoint(x: 42.812000, y: 49.9450), 107 | controlPoint2: CGPoint(x: 42.609000, y: 49.9850)) 108 | key.addCurve(to: CGPoint(x: 42.145000, y: 50.5760), 109 | controlPoint1: CGPoint(x: 42.327000, y: 50.1850), 110 | controlPoint2: CGPoint(x: 42.218000, y: 50.3490)) 111 | key.addCurve(to: CGPoint(x: 42.006000, y: 51.6130), 112 | controlPoint1: CGPoint(x: 42.104000, y: 50.7000), 113 | controlPoint2: CGPoint(x: 42.058000, y: 51.0460)) 114 | key.addCurve(to: CGPoint(x: 41.715000, y: 52.9350), 115 | controlPoint1: CGPoint(x: 41.954000, y: 52.1790), 116 | controlPoint2: CGPoint(x: 41.857000, y: 52.6200)) 117 | key.addCurve(to: CGPoint(x: 41.302000, y: 53.5050), 118 | controlPoint1: CGPoint(x: 41.609000, y: 53.1760), 119 | controlPoint2: CGPoint(x: 41.471000, y: 53.3670)) 120 | key.addCurve(to: CGPoint(x: 40.687000, y: 53.8040), 121 | controlPoint1: CGPoint(x: 41.174000, y: 53.6090), 122 | controlPoint2: CGPoint(x: 40.969000, y: 53.7080)) 123 | key.addCurve(to: CGPoint(x: 41.282000, y: 54.2650), 124 | controlPoint1: CGPoint(x: 40.959000, y: 53.9580), 125 | controlPoint2: CGPoint(x: 41.157000, y: 54.1120)) 126 | key.addCurve(to: CGPoint(x: 41.579000, y: 54.9400), 127 | controlPoint1: CGPoint(x: 41.407000, y: 54.4170), 128 | controlPoint2: CGPoint(x: 41.506000, y: 54.6430)) 129 | key.addCurve(to: CGPoint(x: 41.608000, y: 56.3340), 130 | controlPoint1: CGPoint(x: 41.651000, y: 55.2370), 131 | controlPoint2: CGPoint(x: 41.662000, y: 55.7020)) 132 | key.addCurve(to: CGPoint(x: 41.603000, y: 57.4550), 133 | controlPoint1: CGPoint(x: 41.560000, y: 56.9030), 134 | controlPoint2: CGPoint(x: 41.559000, y: 57.2780)) 135 | key.addCurve(to: CGPoint(x: 41.866000, y: 57.8470), 136 | controlPoint1: CGPoint(x: 41.647000, y: 57.6330), 137 | controlPoint2: CGPoint(x: 41.735000, y: 57.7640)) 138 | key.addCurve(to: CGPoint(x: 42.682000, y: 58.0250), 139 | controlPoint1: CGPoint(x: 41.997000, y: 57.9300), 140 | controlPoint2: CGPoint(x: 42.269000, y: 57.9900)) 141 | key.addLine(to: CGPoint(x: 42.509000, y: 60.0740)) 142 | key.addLine(to: CGPoint(x: 41.712000, y: 60.0070)) 143 | key.addCurve(to: CGPoint(x: 39.983000, y: 59.5910), 144 | controlPoint1: CGPoint(x: 40.890000, y: 59.9380), 145 | controlPoint2: CGPoint(x: 40.314000, y: 59.8000)) 146 | key.addCurve(to: CGPoint(x: 39.309000, y: 58.7440), 147 | controlPoint1: CGPoint(x: 39.652000, y: 59.3830), 148 | controlPoint2: CGPoint(x: 39.427000, y: 59.1010)) 149 | key.addCurve(to: CGPoint(x: 39.218000, y: 57.1790), 150 | controlPoint1: CGPoint(x: 39.191000, y: 58.3870), 151 | controlPoint2: CGPoint(x: 39.160000, y: 57.8660)) 152 | key.addCurve(to: CGPoint(x: 39.269000, y: 56.7250), 153 | controlPoint1: CGPoint(x: 39.231000, y: 57.0280), 154 | controlPoint2: CGPoint(x: 39.248000, y: 56.8760)) 155 | key.addCurve(to: CGPoint(x: 39.299000, y: 56.4410), 156 | controlPoint1: CGPoint(x: 39.281000, y: 56.6320), 157 | controlPoint2: CGPoint(x: 39.291000, y: 56.5380)) 158 | key.addCurve(to: CGPoint(x: 39.254000, y: 55.3860), 159 | controlPoint1: CGPoint(x: 39.341000, y: 55.9530), 160 | controlPoint2: CGPoint(x: 39.325000, y: 55.6000)) 161 | key.addCurve(to: CGPoint(x: 38.909000, y: 54.9050), 162 | controlPoint1: CGPoint(x: 39.183000, y: 55.1720), 163 | controlPoint2: CGPoint(x: 39.068000, y: 55.0120)) 164 | key.addCurve(to: CGPoint(x: 38.198000, y: 54.6920), 165 | controlPoint1: CGPoint(x: 38.750000, y: 54.7990), 166 | controlPoint2: CGPoint(x: 38.513000, y: 54.7270)) 167 | key.addLine(to: CGPoint(x: 38.381000, y: 52.5230)) 168 | key.addCurve(to: CGPoint(x: 39.125000, y: 52.4320), 169 | controlPoint1: CGPoint(x: 38.706000, y: 52.5500), 170 | controlPoint2: CGPoint(x: 38.954000, y: 52.5200)) 171 | key.addCurve(to: CGPoint(x: 39.534000, y: 51.9980), 172 | controlPoint1: CGPoint(x: 39.296000, y: 52.3450), 173 | controlPoint2: CGPoint(x: 39.432000, y: 52.2010)) 174 | key.addCurve(to: CGPoint(x: 39.750000, y: 50.9490), 175 | controlPoint1: CGPoint(x: 39.636000, y: 51.7970), 176 | controlPoint2: CGPoint(x: 39.708000, y: 51.4470)) 177 | key.addLine(to: CGPoint(x: 39.768000, y: 50.7340)) 178 | key.addCurve(to: CGPoint(x: 39.786000, y: 50.4420), 179 | controlPoint1: CGPoint(x: 39.772000, y: 50.6360), 180 | controlPoint2: CGPoint(x: 39.778000, y: 50.5390)) 181 | key.addCurve(to: CGPoint(x: 40.108000, y: 48.8390), 182 | controlPoint1: CGPoint(x: 39.849000, y: 49.6960), 183 | controlPoint2: CGPoint(x: 39.956000, y: 49.1620)) 184 | key.addCurve(to: CGPoint(x: 40.689000, y: 48.1160), 185 | controlPoint1: CGPoint(x: 40.261000, y: 48.5160), 186 | controlPoint2: CGPoint(x: 40.454000, y: 48.2760)) 187 | key.addCurve(to: CGPoint(x: 41.385000, y: 47.8690), 188 | controlPoint1: CGPoint(x: 40.865000, y: 47.9950), 189 | controlPoint2: CGPoint(x: 41.097000, y: 47.9130)) 190 | key.addCurve(to: CGPoint(x: 42.680000, y: 47.8450), 191 | controlPoint1: CGPoint(x: 41.767000, y: 47.8120), 192 | controlPoint2: CGPoint(x: 42.199000, y: 47.8040)) 193 | key.addLine(to: CGPoint(x: 43.534000, y: 47.9160)) 194 | key.close() 195 | 196 | return Key(char: "{", keyPath: key, framePath: frame) 197 | } 198 | 199 | static func braceRight() -> Key { 200 | let frame = UIBezierPath() 201 | frame.move(to: CGPoint(x: 63.234000, y: 40.2050)) 202 | frame.addLine(to: CGPoint(x: 58.803000, y: 64.2580)) 203 | frame.addCurve(to: CGPoint(x: 61.292000, y: 64.2200), 204 | controlPoint1: CGPoint(x: 59.633000, y: 64.2450), 205 | controlPoint2: CGPoint(x: 60.459000, y: 64.2200)) 206 | frame.addCurve(to: CGPoint(x: 122.567000, y: 76.4390), 207 | controlPoint1: CGPoint(x: 83.007000, y: 64.2200), 208 | controlPoint2: CGPoint(x: 103.703000, y: 68.5720)) 209 | frame.addLine(to: CGPoint(x: 133.119000, y: 54.8070)) 210 | frame.addCurve(to: CGPoint(x: 63.234000, y: 40.2050), 211 | controlPoint1: CGPoint(x: 111.621000, y: 45.6450), 212 | controlPoint2: CGPoint(x: 88.018000, y: 40.4630)) 213 | frame.close() 214 | 215 | let key = UIBezierPath() 216 | key.move(to: CGPoint(x: 92.703000, y: 49.5490)) 217 | key.addCurve(to: CGPoint(x: 93.924000, y: 49.9830), 218 | controlPoint1: CGPoint(x: 93.172000, y: 49.6620), 219 | controlPoint2: CGPoint(x: 93.578000, y: 49.8070)) 220 | key.addCurve(to: CGPoint(x: 94.506000, y: 50.4370), 221 | controlPoint1: CGPoint(x: 94.184000, y: 50.1160), 222 | controlPoint2: CGPoint(x: 94.378000, y: 50.2670)) 223 | key.addCurve(to: CGPoint(x: 94.828000, y: 51.3050), 224 | controlPoint1: CGPoint(x: 94.678000, y: 50.6620), 225 | controlPoint2: CGPoint(x: 94.785000, y: 50.9520)) 226 | key.addCurve(to: CGPoint(x: 94.627000, y: 52.9290), 227 | controlPoint1: CGPoint(x: 94.870000, y: 51.6590), 228 | controlPoint2: CGPoint(x: 94.804000, y: 52.2010)) 229 | key.addCurve(to: CGPoint(x: 94.552000, y: 53.2110), 230 | controlPoint1: CGPoint(x: 94.604000, y: 53.0240), 231 | controlPoint2: CGPoint(x: 94.579000, y: 53.1170)) 232 | key.addLine(to: CGPoint(x: 94.501000, y: 53.4200)) 233 | key.addCurve(to: CGPoint(x: 94.374000, y: 54.4830), 234 | controlPoint1: CGPoint(x: 94.383000, y: 53.9060), 235 | controlPoint2: CGPoint(x: 94.341000, y: 54.2610)) 236 | key.addCurve(to: CGPoint(x: 94.625000, y: 55.0240), 237 | controlPoint1: CGPoint(x: 94.407000, y: 54.7070), 238 | controlPoint2: CGPoint(x: 94.491000, y: 54.8870)) 239 | key.addCurve(to: CGPoint(x: 95.301000, y: 55.3450), 240 | controlPoint1: CGPoint(x: 94.759000, y: 55.1620), 241 | controlPoint2: CGPoint(x: 94.984000, y: 55.2680)) 242 | key.addLine(to: CGPoint(x: 94.788000, y: 57.4610)) 243 | key.addCurve(to: CGPoint(x: 94.046000, y: 57.4380), 244 | controlPoint1: CGPoint(x: 94.477000, y: 57.3940), 245 | controlPoint2: CGPoint(x: 94.230000, y: 57.3860)) 246 | key.addCurve(to: CGPoint(x: 93.567000, y: 57.7850), 247 | controlPoint1: CGPoint(x: 93.861000, y: 57.4890), 248 | controlPoint2: CGPoint(x: 93.702000, y: 57.6050)) 249 | key.addCurve(to: CGPoint(x: 93.190000, y: 58.7710), 250 | controlPoint1: CGPoint(x: 93.432000, y: 57.9670), 251 | controlPoint2: CGPoint(x: 93.306000, y: 58.2950)) 252 | key.addCurve(to: CGPoint(x: 93.129000, y: 59.0500), 253 | controlPoint1: CGPoint(x: 93.168000, y: 58.8660), 254 | controlPoint2: CGPoint(x: 93.147000, y: 58.9590)) 255 | key.addCurve(to: CGPoint(x: 93.033000, y: 59.4970), 256 | controlPoint1: CGPoint(x: 93.101000, y: 59.2000), 257 | controlPoint2: CGPoint(x: 93.069000, y: 59.3490)) 258 | key.addCurve(to: CGPoint(x: 92.451000, y: 60.9530), 259 | controlPoint1: CGPoint(x: 92.870000, y: 60.1680), 260 | controlPoint2: CGPoint(x: 92.677000, y: 60.6530)) 261 | key.addCurve(to: CGPoint(x: 91.544000, y: 61.5430), 262 | controlPoint1: CGPoint(x: 92.226000, y: 61.2540), 263 | controlPoint2: CGPoint(x: 91.924000, y: 61.4500)) 264 | key.addCurve(to: CGPoint(x: 89.772000, y: 61.3910), 265 | controlPoint1: CGPoint(x: 91.164000, y: 61.6360), 266 | controlPoint2: CGPoint(x: 90.574000, y: 61.5850)) 267 | key.addLine(to: CGPoint(x: 88.995000, y: 61.2030)) 268 | key.addLine(to: CGPoint(x: 89.479000, y: 59.2050)) 269 | key.addCurve(to: CGPoint(x: 90.310000, y: 59.2950), 270 | controlPoint1: CGPoint(x: 89.882000, y: 59.3030), 271 | controlPoint2: CGPoint(x: 90.159000, y: 59.3320)) 272 | key.addCurve(to: CGPoint(x: 90.683000, y: 59.0070), 273 | controlPoint1: CGPoint(x: 90.460000, y: 59.2580), 274 | controlPoint2: CGPoint(x: 90.585000, y: 59.1610)) 275 | key.addCurve(to: CGPoint(x: 91.033000, y: 57.9430), 276 | controlPoint1: CGPoint(x: 90.781000, y: 58.8530), 277 | controlPoint2: CGPoint(x: 90.898000, y: 58.4970)) 278 | key.addCurve(to: CGPoint(x: 91.502000, y: 56.6300), 279 | controlPoint1: CGPoint(x: 91.183000, y: 57.3260), 280 | controlPoint2: CGPoint(x: 91.339000, y: 56.8880)) 281 | key.addCurve(to: CGPoint(x: 91.997000, y: 56.0830), 282 | controlPoint1: CGPoint(x: 91.665000, y: 56.3700), 283 | controlPoint2: CGPoint(x: 91.830000, y: 56.1890)) 284 | key.addCurve(to: CGPoint(x: 92.707000, y: 55.8350), 285 | controlPoint1: CGPoint(x: 92.164000, y: 55.9770), 286 | controlPoint2: CGPoint(x: 92.401000, y: 55.8950)) 287 | key.addCurve(to: CGPoint(x: 92.219000, y: 55.3560), 288 | controlPoint1: CGPoint(x: 92.471000, y: 55.6550), 289 | controlPoint2: CGPoint(x: 92.308000, y: 55.4950)) 290 | key.addCurve(to: CGPoint(x: 92.007000, y: 54.6840), 291 | controlPoint1: CGPoint(x: 92.101000, y: 55.1710), 292 | controlPoint2: CGPoint(x: 92.031000, y: 54.9470)) 293 | key.addCurve(to: CGPoint(x: 92.150000, y: 53.3370), 294 | controlPoint1: CGPoint(x: 91.972000, y: 54.3400), 295 | controlPoint2: CGPoint(x: 92.020000, y: 53.8910)) 296 | key.addCurve(to: CGPoint(x: 92.347000, y: 52.3110), 297 | controlPoint1: CGPoint(x: 92.280000, y: 52.7830), 298 | controlPoint2: CGPoint(x: 92.345000, y: 52.4410)) 299 | key.addCurve(to: CGPoint(x: 92.196000, y: 51.7420), 300 | controlPoint1: CGPoint(x: 92.348000, y: 52.0720), 301 | controlPoint2: CGPoint(x: 92.298000, y: 51.8820)) 302 | key.addCurve(to: CGPoint(x: 91.655000, y: 51.4380), 303 | controlPoint1: CGPoint(x: 92.093000, y: 51.6020), 304 | controlPoint2: CGPoint(x: 91.913000, y: 51.5010)) 305 | key.addLine(to: CGPoint(x: 91.379000, y: 51.3710)) 306 | key.addLine(to: CGPoint(x: 91.870000, y: 49.3480)) 307 | key.addLine(to: CGPoint(x: 92.703000, y: 49.5490)) 308 | key.close() 309 | 310 | return Key(char: "}", keyPath: key, framePath: frame) 311 | } 312 | 313 | static func apostrophe() -> Key { 314 | let frame = UIBezierPath() 315 | frame.move(to: CGPoint(x: 169.974000, y: 75.8770)) 316 | frame.addLine(to: CGPoint(x: 156.626000, y: 95.9000)) 317 | frame.addCurve(to: CGPoint(x: 199.009000, y: 143.4250), 318 | controlPoint1: CGPoint(x: 173.743000, y: 108.7050), 319 | controlPoint2: CGPoint(x: 188.194000, y: 124.8750)) 320 | frame.addLine(to: CGPoint(x: 217.047000, y: 126.8000)) 321 | frame.addCurve(to: CGPoint(x: 169.974000, y: 75.8770), 322 | controlPoint1: CGPoint(x: 204.711000, y: 106.9830), 323 | controlPoint2: CGPoint(x: 188.709000, y: 89.6870)) 324 | frame.close() 325 | 326 | let key = UIBezierPath() 327 | key.move(to: CGPoint(x: 188.432000, y: 101.9220)) 328 | key.addLine(to: CGPoint(x: 190.006000, y: 103.4630)) 329 | key.addLine(to: CGPoint(x: 189.426000, y: 105.5430)) 330 | key.addLine(to: CGPoint(x: 188.555000, y: 104.6900)) 331 | key.addLine(to: CGPoint(x: 188.432000, y: 101.9220)) 332 | key.close() 333 | 334 | return Key(char: "`", keyPath: key, framePath: frame) 335 | } 336 | 337 | static func bracketLeft() -> Key { 338 | let frame = UIBezierPath() 339 | frame.move(to: CGPoint(x: 217.047000, y: 126.7980)) 340 | frame.addLine(to: CGPoint(x: 199.009000, y: 143.4230)) 341 | frame.addCurve(to: CGPoint(x: 214.549000, y: 179.9810), 342 | controlPoint1: CGPoint(x: 205.635000, y: 154.7880), 343 | controlPoint2: CGPoint(x: 210.880000, y: 167.0530)) 344 | frame.addLine(to: CGPoint(x: 235.629000, y: 166.6500)) 345 | frame.addCurve(to: CGPoint(x: 217.047000, y: 126.7980), 346 | controlPoint1: CGPoint(x: 231.022000, y: 152.5370), 347 | controlPoint2: CGPoint(x: 224.752000, y: 139.1750)) 348 | frame.close() 349 | 350 | let key = UIBezierPath() 351 | key.move(to: CGPoint(x: 220.643000, y: 147.1630)) 352 | key.addLine(to: CGPoint(x: 222.738000, y: 150.4560)) 353 | key.addLine(to: CGPoint(x: 221.045000, y: 151.5320)) 354 | key.addLine(to: CGPoint(x: 220.217000, y: 150.2310)) 355 | key.addLine(to: CGPoint(x: 213.570000, y: 154.4580)) 356 | key.addLine(to: CGPoint(x: 214.398000, y: 155.7590)) 357 | key.addLine(to: CGPoint(x: 212.705000, y: 156.8350)) 358 | key.addLine(to: CGPoint(x: 210.610000, y: 153.5400)) 359 | key.addLine(to: CGPoint(x: 220.643000, y: 147.1630)) 360 | key.close() 361 | 362 | return Key(char: "[", keyPath: key, framePath: frame) 363 | } 364 | 365 | static func bracketRight() -> Key { 366 | let frame = UIBezierPath() 367 | frame.move(to: CGPoint(x: 235.628000, y: 166.6510)) 368 | frame.addLine(to: CGPoint(x: 214.548000, y: 179.9820)) 369 | frame.addCurve(to: CGPoint(x: 220.594000, y: 223.5220), 370 | controlPoint1: CGPoint(x: 218.475000, y: 193.8220), 371 | controlPoint2: CGPoint(x: 220.594000, y: 208.4230)) 372 | frame.addCurve(to: CGPoint(x: 220.183000, y: 234.9750), 373 | controlPoint1: CGPoint(x: 220.594000, y: 227.3740), 374 | controlPoint2: CGPoint(x: 220.452000, y: 231.1920)) 375 | frame.addLine(to: CGPoint(x: 244.268000, y: 234.9750)) 376 | frame.addCurve(to: CGPoint(x: 244.633000, y: 223.5220), 377 | controlPoint1: CGPoint(x: 244.502000, y: 231.1860), 378 | controlPoint2: CGPoint(x: 244.633000, y: 227.3700)) 379 | frame.addCurve(to: CGPoint(x: 235.628000, y: 166.6510), 380 | controlPoint1: CGPoint(x: 244.634000, y: 203.6670), 381 | controlPoint2: CGPoint(x: 241.471000, y: 184.5530)) 382 | frame.close() 383 | 384 | let key = UIBezierPath() 385 | key.move(to: CGPoint(x: 225.508000, y: 205.0130)) 386 | key.addLine(to: CGPoint(x: 224.907000, y: 201.1560)) 387 | key.addLine(to: CGPoint(x: 226.888000, y: 200.8470)) 388 | key.addLine(to: CGPoint(x: 227.126000, y: 202.3700)) 389 | key.addLine(to: CGPoint(x: 234.910000, y: 201.1570)) 390 | key.addLine(to: CGPoint(x: 234.673000, y: 199.6330)) 391 | key.addLine(to: CGPoint(x: 236.654000, y: 199.3240)) 392 | key.addLine(to: CGPoint(x: 237.256000, y: 203.1810)) 393 | key.addLine(to: CGPoint(x: 225.508000, y: 205.0130)) 394 | key.close() 395 | 396 | return Key(char: "]", keyPath: key, framePath: frame) 397 | } 398 | 399 | } 400 | -------------------------------------------------------------------------------- /Keyboard/Line8.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line8.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line8 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line8.pipe(), 16 | Line8.colon(), 17 | Line8.doubleQuotation(), 18 | Line8.backSlash(), 19 | Line8.semicolon(), 20 | Line8.singleQuotation() 21 | ] 22 | } 23 | 24 | static func pipe() -> Key { 25 | let frame = UIBezierPath() 26 | frame.move(to: CGPoint(x: 0.000000, y: 80.9010)) 27 | frame.addLine(to: CGPoint(x: 0.000000, y: 107.4500)) 28 | frame.addCurve(to: CGPoint(x: 26.247000, y: 97.0250), 29 | controlPoint1: CGPoint(x: 8.265000, y: 103.0770), 30 | controlPoint2: CGPoint(x: 17.056000, y: 99.5680)) 31 | frame.addLine(to: CGPoint(x: 28.220000, y: 71.8660)) 32 | frame.addCurve(to: CGPoint(x: 0.000000, y: 80.9010), 33 | controlPoint1: CGPoint(x: 18.440000, y: 73.9910), 34 | controlPoint2: CGPoint(x: 8.999000, y: 77.0280)) 35 | frame.close() 36 | 37 | let key = UIBezierPath() 38 | key.move(to: CGPoint(x: 11.180000, y: 82.2850)) 39 | key.addLine(to: CGPoint(x: 12.799000, y: 82.2830)) 40 | key.addLine(to: CGPoint(x: 12.818000, y: 94.1530)) 41 | key.addLine(to: CGPoint(x: 11.199000, y: 94.1550)) 42 | key.addLine(to: CGPoint(x: 11.180000, y: 82.2850)) 43 | key.close() 44 | 45 | return Key(char: "|", keyPath: key, framePath: frame) 46 | } 47 | 48 | static func colon() -> Key { 49 | let frame = UIBezierPath() 50 | frame.move(to: CGPoint(x: 61.292000, y: 68.3190)) 51 | frame.addCurve(to: CGPoint(x: 28.220000, y: 71.8660), 52 | controlPoint1: CGPoint(x: 49.940000, y: 68.3190), 53 | controlPoint2: CGPoint(x: 38.878000, y: 69.5500)) 54 | frame.addLine(to: CGPoint(x: 26.247000, y: 97.0250)) 55 | frame.addCurve(to: CGPoint(x: 61.292000, y: 92.2780), 56 | controlPoint1: CGPoint(x: 37.404000, y: 93.9380), 57 | controlPoint2: CGPoint(x: 49.153000, y: 92.2780)) 58 | frame.addCurve(to: CGPoint(x: 61.688000, y: 92.2830), 59 | controlPoint1: CGPoint(x: 61.424000, y: 92.2780), 60 | controlPoint2: CGPoint(x: 61.555000, y: 92.2830)) 61 | frame.addLine(to: CGPoint(x: 67.644000, y: 68.4590)) 62 | frame.addCurve(to: CGPoint(x: 61.292000, y: 68.3190), 63 | controlPoint1: CGPoint(x: 65.536000, y: 68.3740), 64 | controlPoint2: CGPoint(x: 63.421000, y: 68.3190)) 65 | frame.close() 66 | 67 | let key = UIBezierPath() 68 | key.move(to: CGPoint(x: 42.853000, y: 81.2320)) 69 | key.addLine(to: CGPoint(x: 45.609000, y: 81.3980)) 70 | key.addLine(to: CGPoint(x: 45.453000, y: 83.9830)) 71 | key.addLine(to: CGPoint(x: 42.697000, y: 83.8170)) 72 | key.addLine(to: CGPoint(x: 42.853000, y: 81.2320)) 73 | key.close() 74 | key.move(to: CGPoint(x: 43.104000, y: 77.0880)) 75 | key.addLine(to: CGPoint(x: 45.860000, y: 77.2550)) 76 | key.addLine(to: CGPoint(x: 45.704000, y: 79.8400)) 77 | key.addLine(to: CGPoint(x: 42.948000, y: 79.6740)) 78 | key.addLine(to: CGPoint(x: 43.104000, y: 77.0880)) 79 | key.close() 80 | 81 | return Key(char: ":", keyPath: key, framePath: frame) 82 | } 83 | 84 | static func doubleQuotation() -> Key { 85 | let frame = UIBezierPath() 86 | frame.move(to: CGPoint(x: 67.644000, y: 68.4590)) 87 | frame.addLine(to: CGPoint(x: 61.688000, y: 92.2830)) 88 | frame.addCurve(to: CGPoint(x: 112.751000, y: 102.7560), 89 | controlPoint1: CGPoint(x: 79.808000, y: 92.3370), 90 | controlPoint2: CGPoint(x: 97.064000, y: 96.0630)) 91 | frame.addLine(to: CGPoint(x: 124.503000, y: 81.7560)) 92 | frame.addCurve(to: CGPoint(x: 67.644000, y: 68.4590), 93 | controlPoint1: CGPoint(x: 107.019000, y: 73.9490), 94 | controlPoint2: CGPoint(x: 87.830000, y: 69.2720)) 95 | frame.close() 96 | 97 | let key = UIBezierPath() 98 | key.move(to: CGPoint(x: 87.864000, y: 77.7270)) 99 | key.addLine(to: CGPoint(x: 90.567000, y: 78.2890)) 100 | key.addLine(to: CGPoint(x: 90.133000, y: 80.3710)) 101 | key.addCurve(to: CGPoint(x: 89.277000, y: 82.0890), 102 | controlPoint1: CGPoint(x: 89.974000, y: 81.1380), 103 | controlPoint2: CGPoint(x: 89.688000, y: 81.7100)) 104 | key.addCurve(to: CGPoint(x: 87.398000, y: 82.9200), 105 | controlPoint1: CGPoint(x: 88.866000, y: 82.4680), 106 | controlPoint2: CGPoint(x: 88.239000, y: 82.7450)) 107 | key.addLine(to: CGPoint(x: 87.039000, y: 81.6910)) 108 | key.addCurve(to: CGPoint(x: 88.169000, y: 81.2290), 109 | controlPoint1: CGPoint(x: 87.565000, y: 81.5670), 110 | controlPoint2: CGPoint(x: 87.943000, y: 81.4140)) 111 | key.addCurve(to: CGPoint(x: 88.635000, y: 80.5050), 112 | controlPoint1: CGPoint(x: 88.396000, y: 81.0450), 113 | controlPoint2: CGPoint(x: 88.551000, y: 80.8030)) 114 | key.addLine(to: CGPoint(x: 87.342000, y: 80.2360)) 115 | key.addLine(to: CGPoint(x: 87.864000, y: 77.7270)) 116 | key.close() 117 | key.move(to: CGPoint(x: 91.014000, y: 78.3830)) 118 | key.addLine(to: CGPoint(x: 93.717000, y: 78.9460)) 119 | key.addLine(to: CGPoint(x: 93.283000, y: 81.0280)) 120 | key.addCurve(to: CGPoint(x: 92.427000, y: 82.7460), 121 | controlPoint1: CGPoint(x: 93.124000, y: 81.7940), 122 | controlPoint2: CGPoint(x: 92.838000, y: 82.3670)) 123 | key.addCurve(to: CGPoint(x: 90.549000, y: 83.5770), 124 | controlPoint1: CGPoint(x: 92.016000, y: 83.1250), 125 | controlPoint2: CGPoint(x: 91.389000, y: 83.4020)) 126 | key.addLine(to: CGPoint(x: 90.189000, y: 82.3480)) 127 | key.addCurve(to: CGPoint(x: 91.320000, y: 81.8870), 128 | controlPoint1: CGPoint(x: 90.716000, y: 82.2250), 129 | controlPoint2: CGPoint(x: 91.093000, y: 82.0710)) 130 | key.addCurve(to: CGPoint(x: 91.785000, y: 81.1630), 131 | controlPoint1: CGPoint(x: 91.546000, y: 81.7020), 132 | controlPoint2: CGPoint(x: 91.701000, y: 81.4610)) 133 | key.addLine(to: CGPoint(x: 90.492000, y: 80.8930)) 134 | key.addLine(to: CGPoint(x: 91.014000, y: 78.3830)) 135 | key.close() 136 | 137 | return Key(char: "\"", keyPath: key, framePath: frame) 138 | } 139 | 140 | static func backSlash() -> Key { 141 | let frame = UIBezierPath() 142 | frame.move(to: CGPoint(x: 151.241000, y: 97.0380)) 143 | frame.addLine(to: CGPoint(x: 138.842000, y: 117.6420)) 144 | frame.addCurve(to: CGPoint(x: 171.829000, y: 152.7590), 145 | controlPoint1: CGPoint(x: 151.878000, y: 127.2060), 146 | controlPoint2: CGPoint(x: 163.078000, y: 139.1220)) 147 | frame.addCurve(to: CGPoint(x: 188.266000, y: 134.2810), 148 | controlPoint1: CGPoint(x: 177.879000, y: 145.9020), 149 | controlPoint2: CGPoint(x: 184.662000, y: 138.2440)) 150 | frame.addCurve(to: CGPoint(x: 151.241000, y: 97.0380), 151 | controlPoint1: CGPoint(x: 178.118000, y: 119.8740), 152 | controlPoint2: CGPoint(x: 165.593000, y: 107.2610)) 153 | frame.close() 154 | 155 | let key = UIBezierPath() 156 | key.move(to: CGPoint(x: 161.993000, y: 126.6970)) 157 | key.addLine(to: CGPoint(x: 161.015000, y: 125.8310)) 158 | key.addLine(to: CGPoint(x: 165.642000, y: 117.0760)) 159 | key.addLine(to: CGPoint(x: 166.630000, y: 117.9500)) 160 | key.addLine(to: CGPoint(x: 161.993000, y: 126.6970)) 161 | key.close() 162 | 163 | return Key(char: "\\", keyPath: key, framePath: frame) 164 | } 165 | 166 | static func semicolon() -> Key { 167 | let frame = UIBezierPath() 168 | frame.move(to: CGPoint(x: 188.266000, y: 134.2830)) 169 | frame.addCurve(to: CGPoint(x: 171.829000, y: 152.7610), 170 | controlPoint1: CGPoint(x: 184.662000, y: 138.2450), 171 | controlPoint2: CGPoint(x: 177.878000, y: 145.9030)) 172 | frame.addCurve(to: CGPoint(x: 187.557000, y: 187.6230), 173 | controlPoint1: CGPoint(x: 178.673000, y: 163.4260), 174 | controlPoint2: CGPoint(x: 184.015000, y: 175.1450)) 175 | frame.addLine(to: CGPoint(x: 208.156000, y: 173.2390)) 176 | frame.addCurve(to: CGPoint(x: 188.266000, y: 134.2830), 177 | controlPoint1: CGPoint(x: 203.364000, y: 159.2420), 178 | controlPoint2: CGPoint(x: 196.625000, y: 146.1520)) 179 | frame.close() 180 | 181 | let key = UIBezierPath() 182 | key.move(to: CGPoint(x: 188.190000, y: 160.2830)) 183 | key.addLine(to: CGPoint(x: 189.671000, y: 162.6130)) 184 | key.addLine(to: CGPoint(x: 187.877000, y: 163.7550)) 185 | key.addCurve(to: CGPoint(x: 186.050000, y: 164.3360), 186 | controlPoint1: CGPoint(x: 187.216000, y: 164.1750), 187 | controlPoint2: CGPoint(x: 186.607000, y: 164.3690)) 188 | key.addCurve(to: CGPoint(x: 184.142000, y: 163.5710), 189 | controlPoint1: CGPoint(x: 185.494000, y: 164.3050), 190 | controlPoint2: CGPoint(x: 184.858000, y: 164.0490)) 191 | key.addLine(to: CGPoint(x: 184.772000, y: 162.4560)) 192 | key.addCurve(to: CGPoint(x: 185.891000, y: 162.9450), 193 | controlPoint1: CGPoint(x: 185.228000, y: 162.7480), 194 | controlPoint2: CGPoint(x: 185.601000, y: 162.9100)) 195 | key.addCurve(to: CGPoint(x: 186.733000, y: 162.7730), 196 | controlPoint1: CGPoint(x: 186.180000, y: 162.9780), 197 | controlPoint2: CGPoint(x: 186.461000, y: 162.9220)) 198 | key.addLine(to: CGPoint(x: 186.025000, y: 161.6590)) 199 | key.addLine(to: CGPoint(x: 188.190000, y: 160.2830)) 200 | key.close() 201 | key.move(to: CGPoint(x: 191.715000, y: 158.0430)) 202 | key.addLine(to: CGPoint(x: 193.196000, y: 160.3730)) 203 | key.addLine(to: CGPoint(x: 191.010000, y: 161.7630)) 204 | key.addLine(to: CGPoint(x: 189.529000, y: 159.4320)) 205 | key.addLine(to: CGPoint(x: 191.715000, y: 158.0430)) 206 | key.close() 207 | 208 | return Key(char: ";", keyPath: key, framePath: frame) 209 | } 210 | 211 | static func singleQuotation() -> Key { 212 | let frame = UIBezierPath() 213 | frame.move(to: CGPoint(x: 208.156000, y: 173.2390)) 214 | frame.addLine(to: CGPoint(x: 187.557000, y: 187.6230)) 215 | frame.addCurve(to: CGPoint(x: 192.537000, y: 223.5230), 216 | controlPoint1: CGPoint(x: 190.796000, y: 199.0330), 217 | controlPoint2: CGPoint(x: 192.537000, y: 211.0740)) 218 | frame.addCurve(to: CGPoint(x: 192.036000, y: 234.9760), 219 | controlPoint1: CGPoint(x: 192.537000, y: 227.3830), 220 | controlPoint2: CGPoint(x: 192.362000, y: 231.2010)) 221 | frame.addLine(to: CGPoint(x: 216.078000, y: 234.9760)) 222 | frame.addCurve(to: CGPoint(x: 216.495000, y: 223.5230), 223 | controlPoint1: CGPoint(x: 216.354000, y: 231.1940), 224 | controlPoint2: CGPoint(x: 216.495000, y: 227.3750)) 225 | frame.addCurve(to: CGPoint(x: 208.156000, y: 173.2390), 226 | controlPoint1: CGPoint(x: 216.496000, y: 205.9210), 227 | controlPoint2: CGPoint(x: 213.555000, y: 189.0090)) 228 | frame.close() 229 | 230 | let key = UIBezierPath() 231 | key.move(to: CGPoint(x: 208.499000, y: 203.5690)) 232 | key.addLine(to: CGPoint(x: 209.031000, y: 206.2790)) 233 | key.addLine(to: CGPoint(x: 206.944000, y: 206.6880)) 234 | key.addCurve(to: CGPoint(x: 205.028000, y: 206.5670), 235 | controlPoint1: CGPoint(x: 206.175000, y: 206.8390), 236 | controlPoint2: CGPoint(x: 205.537000, y: 206.7980)) 237 | key.addCurve(to: CGPoint(x: 203.531000, y: 205.1600), 238 | controlPoint1: CGPoint(x: 204.518000, y: 206.3350), 239 | controlPoint2: CGPoint(x: 204.019000, y: 205.8660)) 240 | key.addLine(to: CGPoint(x: 204.523000, y: 204.3500)) 241 | key.addCurve(to: CGPoint(x: 205.388000, y: 205.2110), 242 | controlPoint1: CGPoint(x: 204.842000, y: 204.7880), 243 | controlPoint2: CGPoint(x: 205.130000, y: 205.0750)) 244 | key.addCurve(to: CGPoint(x: 206.236000, y: 205.3580), 245 | controlPoint1: CGPoint(x: 205.646000, y: 205.3480), 246 | controlPoint2: CGPoint(x: 205.929000, y: 205.3980)) 247 | key.addLine(to: CGPoint(x: 205.982000, y: 204.0620)) 248 | key.addLine(to: CGPoint(x: 208.499000, y: 203.5690)) 249 | key.close() 250 | 251 | return Key(char: "\'", keyPath: key, framePath: frame) 252 | } 253 | 254 | } 255 | -------------------------------------------------------------------------------- /Keyboard/Line9.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line9.swift 3 | // IronKeyboard 4 | // 5 | // Created by Takuto Nakamura on 2020/09/19. 6 | // Copyright © 2020 Takuto Nakamura. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Line9 { 12 | 13 | static func keys() -> [Key] { 14 | return [ 15 | Line9.angleBracketLeft(), 16 | Line9.angleBracketRight(), 17 | Line9.question(), 18 | Line9.comma(), 19 | Line9.period(), 20 | Line9.slash() 21 | ] 22 | } 23 | 24 | static func angleBracketLeft() -> Key { 25 | let frame = UIBezierPath() 26 | frame.move(to: CGPoint(x: 0.000000, y: 113.9750)) 27 | frame.addLine(to: CGPoint(x: 0.000000, y: 147.7250)) 28 | frame.addCurve(to: CGPoint(x: 31.577000, y: 130.6670), 29 | controlPoint1: CGPoint(x: 9.272000, y: 140.2180), 30 | controlPoint2: CGPoint(x: 19.952000, y: 134.3860)) 31 | frame.addLine(to: CGPoint(x: 33.799000, y: 101.0430)) 32 | frame.addCurve(to: CGPoint(x: 0.000000, y: 113.9750), 33 | controlPoint1: CGPoint(x: 21.794000, y: 103.7280), 34 | controlPoint2: CGPoint(x: 10.435000, y: 108.1240)) 35 | frame.close() 36 | 37 | let key = UIBezierPath() 38 | key.move(to: CGPoint(x: 17.404000, y: 126.7620)) 39 | key.addLine(to: CGPoint(x: 10.020000, y: 124.2060)) 40 | key.addLine(to: CGPoint(x: 9.907000, y: 122.3250)) 41 | key.addLine(to: CGPoint(x: 16.931000, y: 118.8980)) 42 | key.addLine(to: CGPoint(x: 17.067000, y: 121.1480)) 43 | key.addLine(to: CGPoint(x: 12.790000, y: 123.1000)) 44 | key.addLine(to: CGPoint(x: 17.269000, y: 124.5250)) 45 | key.addLine(to: CGPoint(x: 17.404000, y: 126.7620)) 46 | key.close() 47 | 48 | return Key(char: "<", keyPath: key, framePath: frame) 49 | } 50 | 51 | static func angleBracketRight() -> Key { 52 | let frame = UIBezierPath() 53 | frame.move(to: CGPoint(x: 61.292000, y: 98.0070)) 54 | frame.addCurve(to: CGPoint(x: 33.799000, y: 101.0420), 55 | controlPoint1: CGPoint(x: 51.846000, y: 98.0070), 56 | controlPoint2: CGPoint(x: 42.648000, y: 99.0620)) 57 | frame.addLine(to: CGPoint(x: 31.577000, y: 130.6660)) 58 | frame.addCurve(to: CGPoint(x: 61.292000, y: 126.0400), 59 | controlPoint1: CGPoint(x: 40.946000, y: 127.6690), 60 | controlPoint2: CGPoint(x: 50.928000, y: 126.0400)) 61 | frame.addCurve(to: CGPoint(x: 67.205000, y: 126.2240), 62 | controlPoint1: CGPoint(x: 63.278000, y: 126.0400), 63 | controlPoint2: CGPoint(x: 65.248000, y: 126.1070)) 64 | frame.addLine(to: CGPoint(x: 74.179000, y: 98.6610)) 65 | frame.addCurve(to: CGPoint(x: 61.292000, y: 98.0070), 66 | controlPoint1: CGPoint(x: 69.942000, y: 98.2290), 67 | controlPoint2: CGPoint(x: 65.643000, y: 98.0070)) 68 | frame.close() 69 | 70 | let key = UIBezierPath() 71 | key.move(to: CGPoint(x: 47.110000, y: 114.4760)) 72 | key.addLine(to: CGPoint(x: 51.590000, y: 113.0510)) 73 | key.addLine(to: CGPoint(x: 47.313000, y: 111.1000)) 74 | key.addLine(to: CGPoint(x: 47.448000, y: 108.8500)) 75 | key.addLine(to: CGPoint(x: 54.472000, y: 112.2760)) 76 | key.addLine(to: CGPoint(x: 54.359000, y: 114.1570)) 77 | key.addLine(to: CGPoint(x: 46.975000, y: 116.7140)) 78 | key.addLine(to: CGPoint(x: 47.110000, y: 114.4760)) 79 | key.close() 80 | 81 | return Key(char: ">", keyPath: key, framePath: frame) 82 | } 83 | 84 | static func question() -> Key { 85 | let frame = UIBezierPath() 86 | frame.move(to: CGPoint(x: 74.179000, y: 98.6610)) 87 | frame.addLine(to: CGPoint(x: 67.205000, y: 126.2240)) 88 | frame.addCurve(to: CGPoint(x: 102.012000, y: 134.9410), 89 | controlPoint1: CGPoint(x: 79.571000, y: 126.9640), 90 | controlPoint2: CGPoint(x: 91.312000, y: 130.0150)) 91 | frame.addLine(to: CGPoint(x: 115.301000, y: 110.1960)) 92 | frame.addCurve(to: CGPoint(x: 74.179000, y: 98.6610), 93 | controlPoint1: CGPoint(x: 102.623000, y: 104.1430), 94 | controlPoint2: CGPoint(x: 88.772000, y: 100.1500)) 95 | frame.close() 96 | 97 | let key = UIBezierPath() 98 | key.move(to: CGPoint(x: 89.580000, y: 118.3340)) 99 | key.addLine(to: CGPoint(x: 87.236000, y: 117.7660)) 100 | key.addLine(to: CGPoint(x: 87.293000, y: 117.5320)) 101 | key.addCurve(to: CGPoint(x: 87.665000, y: 116.5930), 102 | controlPoint1: CGPoint(x: 87.390000, y: 117.1330), 103 | controlPoint2: CGPoint(x: 87.513000, y: 116.8200)) 104 | key.addCurve(to: CGPoint(x: 88.234000, y: 116.0100), 105 | controlPoint1: CGPoint(x: 87.815000, y: 116.3660), 106 | controlPoint2: CGPoint(x: 88.006000, y: 116.1720)) 107 | key.addCurve(to: CGPoint(x: 89.703000, y: 115.2160), 108 | controlPoint1: CGPoint(x: 88.463000, y: 115.8480), 109 | controlPoint2: CGPoint(x: 88.953000, y: 115.5830)) 110 | key.addCurve(to: CGPoint(x: 90.384000, y: 114.5920), 111 | controlPoint1: CGPoint(x: 90.102000, y: 115.0270), 112 | controlPoint2: CGPoint(x: 90.328000, y: 114.8180)) 113 | key.addCurve(to: CGPoint(x: 90.311000, y: 114.0160), 114 | controlPoint1: CGPoint(x: 90.439000, y: 114.3650), 115 | controlPoint2: CGPoint(x: 90.415000, y: 114.1730)) 116 | key.addCurve(to: CGPoint(x: 89.749000, y: 113.6800), 117 | controlPoint1: CGPoint(x: 90.208000, y: 113.8580), 118 | controlPoint2: CGPoint(x: 90.021000, y: 113.7450)) 119 | key.addCurve(to: CGPoint(x: 88.953000, y: 113.7940), 120 | controlPoint1: CGPoint(x: 89.457000, y: 113.6090), 121 | controlPoint2: CGPoint(x: 89.192000, y: 113.6480)) 122 | key.addCurve(to: CGPoint(x: 88.341000, y: 114.7170), 123 | controlPoint1: CGPoint(x: 88.716000, y: 113.9400), 124 | controlPoint2: CGPoint(x: 88.512000, y: 114.2490)) 125 | key.addLine(to: CGPoint(x: 86.019000, y: 113.8400)) 126 | key.addCurve(to: CGPoint(x: 87.494000, y: 111.9470), 127 | controlPoint1: CGPoint(x: 86.315000, y: 112.9800), 128 | controlPoint2: CGPoint(x: 86.807000, y: 112.3490)) 129 | key.addCurve(to: CGPoint(x: 90.253000, y: 111.7640), 130 | controlPoint1: CGPoint(x: 88.182000, y: 111.5460), 131 | controlPoint2: CGPoint(x: 89.101000, y: 111.4850)) 132 | key.addCurve(to: CGPoint(x: 92.288000, y: 112.8520), 133 | controlPoint1: CGPoint(x: 91.149000, y: 111.9810), 134 | controlPoint2: CGPoint(x: 91.828000, y: 112.3440)) 135 | key.addCurve(to: CGPoint(x: 92.920000, y: 115.1470), 136 | controlPoint1: CGPoint(x: 92.914000, y: 113.5400), 137 | controlPoint2: CGPoint(x: 93.125000, y: 114.3040)) 138 | key.addCurve(to: CGPoint(x: 92.385000, y: 116.0880), 139 | controlPoint1: CGPoint(x: 92.836000, y: 115.4970), 140 | controlPoint2: CGPoint(x: 92.656000, y: 115.8100)) 141 | key.addCurve(to: CGPoint(x: 90.911000, y: 116.9910), 142 | controlPoint1: CGPoint(x: 92.113000, y: 116.3670), 143 | controlPoint2: CGPoint(x: 91.622000, y: 116.6670)) 144 | key.addCurve(to: CGPoint(x: 89.932000, y: 117.5940), 145 | controlPoint1: CGPoint(x: 90.416000, y: 117.2200), 146 | controlPoint2: CGPoint(x: 90.090000, y: 117.4200)) 147 | key.addCurve(to: CGPoint(x: 89.580000, y: 118.3340), 148 | controlPoint1: CGPoint(x: 89.775000, y: 117.7670), 149 | controlPoint2: CGPoint(x: 89.658000, y: 118.0140)) 150 | key.close() 151 | key.move(to: CGPoint(x: 87.004000, y: 118.3690)) 152 | key.addLine(to: CGPoint(x: 89.514000, y: 118.9780)) 153 | key.addLine(to: CGPoint(x: 88.977000, y: 121.1920)) 154 | key.addLine(to: CGPoint(x: 86.467000, y: 120.5830)) 155 | key.addLine(to: CGPoint(x: 87.004000, y: 118.3690)) 156 | key.close() 157 | 158 | return Key(char: "?", keyPath: key, framePath: frame) 159 | } 160 | 161 | static func comma() -> Key { 162 | let frame = UIBezierPath() 163 | frame.move(to: CGPoint(x: 132.225000, y: 119.9670)) 164 | frame.addLine(to: CGPoint(x: 116.673000, y: 143.2960)) 165 | frame.addCurve(to: CGPoint(x: 141.515000, y: 168.1420), 166 | controlPoint1: CGPoint(x: 126.379000, y: 150.0070), 167 | controlPoint2: CGPoint(x: 134.802000, y: 158.4380)) 168 | frame.addLine(to: CGPoint(x: 160.848000, y: 147.1040)) 169 | frame.addCurve(to: CGPoint(x: 132.225000, y: 119.9670), 170 | controlPoint1: CGPoint(x: 152.794000, y: 136.6310), 171 | controlPoint2: CGPoint(x: 143.136000, y: 127.4560)) 172 | frame.close() 173 | let key = UIBezierPath() 174 | key.move(to: CGPoint(x: 135.558000, y: 142.7780)) 175 | key.addLine(to: CGPoint(x: 137.586000, y: 144.6530)) 176 | key.addLine(to: CGPoint(x: 136.143000, y: 146.2140)) 177 | key.addCurve(to: CGPoint(x: 134.526000, y: 147.2440), 178 | controlPoint1: CGPoint(x: 135.612000, y: 146.7900), 179 | controlPoint2: CGPoint(x: 135.072000, y: 147.1320)) 180 | key.addCurve(to: CGPoint(x: 132.485000, y: 146.9920), 181 | controlPoint1: CGPoint(x: 133.980000, y: 147.3550), 182 | controlPoint2: CGPoint(x: 133.299000, y: 147.2710)) 183 | key.addLine(to: CGPoint(x: 132.809000, y: 145.7530)) 184 | key.addCurve(to: CGPoint(x: 134.016000, y: 145.9400), 185 | controlPoint1: CGPoint(x: 133.324000, y: 145.9190), 186 | controlPoint2: CGPoint(x: 133.727000, y: 145.9800)) 187 | key.addCurve(to: CGPoint(x: 134.787000, y: 145.5580), 188 | controlPoint1: CGPoint(x: 134.305000, y: 145.8980), 189 | controlPoint2: CGPoint(x: 134.562000, y: 145.7710)) 190 | key.addLine(to: CGPoint(x: 133.817000, y: 144.6620)) 191 | key.addLine(to: CGPoint(x: 135.558000, y: 142.7780)) 192 | key.close() 193 | 194 | return Key(char: ",", keyPath: key, framePath: frame) 195 | } 196 | 197 | static func period() -> Key { 198 | let frame = UIBezierPath() 199 | frame.move(to: CGPoint(x: 160.847000, y: 147.1040)) 200 | frame.addLine(to: CGPoint(x: 141.514000, y: 168.1420)) 201 | frame.addCurve(to: CGPoint(x: 156.055000, y: 200.6120), 202 | controlPoint1: CGPoint(x: 148.220000, y: 177.8360), 203 | controlPoint2: CGPoint(x: 153.210000, y: 188.8050)) 204 | frame.addLine(to: CGPoint(x: 179.680000, y: 181.7450)) 205 | frame.addCurve(to: CGPoint(x: 160.847000, y: 147.1040), 206 | controlPoint1: CGPoint(x: 175.235000, y: 169.1540), 207 | controlPoint2: CGPoint(x: 168.833000, y: 157.4900)) 208 | frame.close() 209 | 210 | let key = UIBezierPath() 211 | key.move(to: CGPoint(x: 158.623000, y: 172.6730)) 212 | key.addLine(to: CGPoint(x: 160.311000, y: 174.8590)) 213 | key.addLine(to: CGPoint(x: 158.262000, y: 176.4430)) 214 | key.addLine(to: CGPoint(x: 156.574000, y: 174.2570)) 215 | key.addLine(to: CGPoint(x: 158.623000, y: 172.6730)) 216 | key.close() 217 | 218 | return Key(char: ".", keyPath: key, framePath: frame) 219 | } 220 | 221 | static func slash() -> Key { 222 | let frame = UIBezierPath() 223 | frame.move(to: CGPoint(x: 179.680000, y: 181.7460)) 224 | frame.addLine(to: CGPoint(x: 156.055000, y: 200.6130)) 225 | frame.addCurve(to: CGPoint(x: 158.774000, y: 223.5220), 226 | controlPoint1: CGPoint(x: 157.826000, y: 207.9610), 227 | controlPoint2: CGPoint(x: 158.774000, y: 215.6300)) 228 | frame.addCurve(to: CGPoint(x: 158.085000, y: 234.9750), 229 | controlPoint1: CGPoint(x: 158.774000, y: 227.3990), 230 | controlPoint2: CGPoint(x: 158.525000, y: 231.2160)) 231 | frame.addLine(to: CGPoint(x: 186.286000, y: 234.9750)) 232 | frame.addCurve(to: CGPoint(x: 186.808000, y: 223.5220), 233 | controlPoint1: CGPoint(x: 186.627000, y: 231.2020), 234 | controlPoint2: CGPoint(x: 186.808000, y: 227.3830)) 235 | frame.addCurve(to: CGPoint(x: 179.680000, y: 181.7460), 236 | controlPoint1: CGPoint(x: 186.807000, y: 208.8740), 237 | controlPoint2: CGPoint(x: 184.293000, y: 194.8150)) 238 | frame.close() 239 | 240 | let key = UIBezierPath() 241 | key.move(to: CGPoint(x: 177.192000, y: 212.1660)) 242 | key.addLine(to: CGPoint(x: 177.389000, y: 213.4710)) 243 | key.addLine(to: CGPoint(x: 167.525000, y: 212.5940)) 244 | key.addLine(to: CGPoint(x: 167.330000, y: 211.3030)) 245 | key.addLine(to: CGPoint(x: 177.192000, y: 212.1660)) 246 | key.close() 247 | 248 | return Key(char: "/", keyPath: key, framePath: frame) 249 | } 250 | 251 | } 252 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IronKeyboard 2 | 3 | 4 | 5 | A software keyboard like Tony's one. 6 | 7 | 8 | 9 | [![Github issues](https://img.shields.io/github/issues/Kyome22/IronKeyboard)](https://github.com/Kyome22/IronKeyboard/issues) 10 | [![Github forks](https://img.shields.io/github/forks/Kyome22/IronKeyboard)](https://github.com/Kyome22/IronKeyboard/network/members) 11 | [![Github stars](https://img.shields.io/github/stars/Kyome22/IronKeyboard)](https://github.com/Kyome22/IronKeyboard/stargazers) 12 | [![Github top language](https://img.shields.io/github/languages/top/Kyome22/IronKeyboard)](https://github.com/Kyome22/IronKeyboard/) 13 | 14 | # Tags 15 | 16 | `Swift` `Custom Keyboards Extension` 17 | 18 | # Demo 19 | 20 | ![Demo](resources/file-0.gif) 21 | 22 | # Contributors 23 | 24 | - [Kyome22](https://github.com/Kyome22) 25 | 26 | -------------------------------------------------------------------------------- /resources/file-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyome22/IronKeyboard/202539cc89367714c97d21f57deec8d6acea97ed/resources/file-0.gif --------------------------------------------------------------------------------