├── .gitignore ├── Jimoni.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── Jimoni.xccheckout │ └── xcuserdata │ │ └── admin.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── admin.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── Jimoni.xcscheme │ ├── JimoniKeyboard.xcscheme │ └── xcschememanagement.plist ├── Jimoni ├── AppDelegate.swift ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── Demo │ └── ViewController.swift ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json └── Info.plist ├── JimoniKeyboard ├── ImageCollectionViewCell.xib ├── Info.plist ├── KeyboardView.xib ├── KeyboardViewController.swift └── pngs │ ├── a1.png │ ├── a10.png │ ├── a11.png │ ├── a12.png │ ├── a13.png │ ├── a14.png │ ├── a15.png │ ├── a16.png │ ├── a17.png │ ├── a18.png │ ├── a19.png │ ├── a2.png │ ├── a20.png │ ├── a21.png │ ├── a22.png │ ├── a23.png │ ├── a24.png │ ├── a25.png │ ├── a26.png │ ├── a27.png │ ├── a28.png │ ├── a29.png │ ├── a3.png │ ├── a30.png │ ├── a4.png │ ├── a5.png │ ├── a6.png │ ├── a7.png │ ├── a8.png │ ├── a9.png │ └── earth.png ├── JimoniTests ├── Info.plist └── JimoniTests.swift ├── LICENSE ├── README.md └── keyboard.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Cache and logs (Symfony2) 2 | /app/cache/* 3 | /app/logs/* 4 | !app/cache/.gitkeep 5 | !app/logs/.gitkeep 6 | 7 | # Cache and logs (Symfony3) 8 | /var/cache/* 9 | /var/logs/* 10 | !var/cache/.gitkeep 11 | !var/logs/.gitkeep 12 | 13 | # Parameters 14 | /app/config/parameters.yml 15 | /app/config/parameters.ini 16 | 17 | # Managed by Composer 18 | /app/bootstrap.php.cache 19 | /var/bootstrap.php.cache 20 | /bin/* 21 | !bin/console 22 | !bin/symfony_requirements 23 | /vendor/ 24 | 25 | # Assets and user uploads 26 | /web/bundles/ 27 | /web/uploads/ 28 | 29 | # Assets managed by Bower 30 | /web/assets/vendor/ 31 | 32 | # PHPUnit 33 | /app/phpunit.xml 34 | /phpunit.xml 35 | 36 | # Build data 37 | /build/ 38 | 39 | # Composer PHAR 40 | /composer.phar 41 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 84AADE901C86123500028505 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AADE8F1C86123500028505 /* AppDelegate.swift */; }; 11 | 84AADE951C86123500028505 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84AADE931C86123500028505 /* Main.storyboard */; }; 12 | 84AADE971C86123500028505 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84AADE961C86123500028505 /* Images.xcassets */; }; 13 | 84AADE9A1C86123500028505 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84AADE981C86123500028505 /* LaunchScreen.xib */; }; 14 | 84AADEA61C86123500028505 /* JimoniTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AADEA51C86123500028505 /* JimoniTests.swift */; }; 15 | 84AADEB81C86126900028505 /* KeyboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AADEB71C86126900028505 /* KeyboardViewController.swift */; }; 16 | 84AADEBB1C86126900028505 /* JimoniKeyboard.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 84AADEB31C86126900028505 /* JimoniKeyboard.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 17 | 84AADEC31C86179100028505 /* ImageCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84AADEC21C86179100028505 /* ImageCollectionViewCell.xib */; }; 18 | 84AADEC51C86248F00028505 /* KeyboardView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84AADEC41C86248E00028505 /* KeyboardView.xib */; }; 19 | 84D0FA681C8B5EA4003F6A2A /* a1.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4A1C8B5EA4003F6A2A /* a1.png */; }; 20 | 84D0FA691C8B5EA4003F6A2A /* a2.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4B1C8B5EA4003F6A2A /* a2.png */; }; 21 | 84D0FA6A1C8B5EA4003F6A2A /* a3.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4C1C8B5EA4003F6A2A /* a3.png */; }; 22 | 84D0FA6B1C8B5EA4003F6A2A /* a4.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4D1C8B5EA4003F6A2A /* a4.png */; }; 23 | 84D0FA6C1C8B5EA4003F6A2A /* a5.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4E1C8B5EA4003F6A2A /* a5.png */; }; 24 | 84D0FA6D1C8B5EA4003F6A2A /* a6.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA4F1C8B5EA4003F6A2A /* a6.png */; }; 25 | 84D0FA6E1C8B5EA4003F6A2A /* a7.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA501C8B5EA4003F6A2A /* a7.png */; }; 26 | 84D0FA6F1C8B5EA4003F6A2A /* a8.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA511C8B5EA4003F6A2A /* a8.png */; }; 27 | 84D0FA701C8B5EA4003F6A2A /* a9.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA521C8B5EA4003F6A2A /* a9.png */; }; 28 | 84D0FA711C8B5EA4003F6A2A /* a10.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA531C8B5EA4003F6A2A /* a10.png */; }; 29 | 84D0FA721C8B5EA4003F6A2A /* a11.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA541C8B5EA4003F6A2A /* a11.png */; }; 30 | 84D0FA731C8B5EA4003F6A2A /* a12.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA551C8B5EA4003F6A2A /* a12.png */; }; 31 | 84D0FA741C8B5EA4003F6A2A /* a13.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA561C8B5EA4003F6A2A /* a13.png */; }; 32 | 84D0FA751C8B5EA4003F6A2A /* a14.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA571C8B5EA4003F6A2A /* a14.png */; }; 33 | 84D0FA761C8B5EA4003F6A2A /* a15.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA581C8B5EA4003F6A2A /* a15.png */; }; 34 | 84D0FA771C8B5EA4003F6A2A /* a16.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA591C8B5EA4003F6A2A /* a16.png */; }; 35 | 84D0FA781C8B5EA4003F6A2A /* a17.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5A1C8B5EA4003F6A2A /* a17.png */; }; 36 | 84D0FA791C8B5EA4003F6A2A /* a18.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5B1C8B5EA4003F6A2A /* a18.png */; }; 37 | 84D0FA7A1C8B5EA4003F6A2A /* a19.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5C1C8B5EA4003F6A2A /* a19.png */; }; 38 | 84D0FA7B1C8B5EA4003F6A2A /* a20.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5D1C8B5EA4003F6A2A /* a20.png */; }; 39 | 84D0FA7C1C8B5EA4003F6A2A /* a21.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5E1C8B5EA4003F6A2A /* a21.png */; }; 40 | 84D0FA7D1C8B5EA4003F6A2A /* a22.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA5F1C8B5EA4003F6A2A /* a22.png */; }; 41 | 84D0FA7E1C8B5EA4003F6A2A /* a23.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA601C8B5EA4003F6A2A /* a23.png */; }; 42 | 84D0FA7F1C8B5EA4003F6A2A /* a24.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA611C8B5EA4003F6A2A /* a24.png */; }; 43 | 84D0FA801C8B5EA4003F6A2A /* a25.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA621C8B5EA4003F6A2A /* a25.png */; }; 44 | 84D0FA811C8B5EA4003F6A2A /* a26.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA631C8B5EA4003F6A2A /* a26.png */; }; 45 | 84D0FA821C8B5EA4003F6A2A /* a27.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA641C8B5EA4003F6A2A /* a27.png */; }; 46 | 84D0FA831C8B5EA4003F6A2A /* a28.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA651C8B5EA4003F6A2A /* a28.png */; }; 47 | 84D0FA841C8B5EA4003F6A2A /* a29.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA661C8B5EA4003F6A2A /* a29.png */; }; 48 | 84D0FA851C8B5EA4003F6A2A /* a30.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA671C8B5EA4003F6A2A /* a30.png */; }; 49 | 84D0FA871C8B5EBD003F6A2A /* earth.png in Resources */ = {isa = PBXBuildFile; fileRef = 84D0FA861C8B5EBD003F6A2A /* earth.png */; }; 50 | /* End PBXBuildFile section */ 51 | 52 | /* Begin PBXContainerItemProxy section */ 53 | 84AADEA01C86123500028505 /* PBXContainerItemProxy */ = { 54 | isa = PBXContainerItemProxy; 55 | containerPortal = 84AADE821C86123500028505 /* Project object */; 56 | proxyType = 1; 57 | remoteGlobalIDString = 84AADE891C86123500028505; 58 | remoteInfo = Jimoni; 59 | }; 60 | 84AADEB91C86126900028505 /* PBXContainerItemProxy */ = { 61 | isa = PBXContainerItemProxy; 62 | containerPortal = 84AADE821C86123500028505 /* Project object */; 63 | proxyType = 1; 64 | remoteGlobalIDString = 84AADEB21C86126900028505; 65 | remoteInfo = JimoniKeyboard; 66 | }; 67 | 84AADEBC1C86126900028505 /* PBXContainerItemProxy */ = { 68 | isa = PBXContainerItemProxy; 69 | containerPortal = 84AADE821C86123500028505 /* Project object */; 70 | proxyType = 1; 71 | remoteGlobalIDString = 84AADEB21C86126900028505; 72 | remoteInfo = JimoniKeyboard; 73 | }; 74 | /* End PBXContainerItemProxy section */ 75 | 76 | /* Begin PBXCopyFilesBuildPhase section */ 77 | 84AADEC11C86126900028505 /* Embed App Extensions */ = { 78 | isa = PBXCopyFilesBuildPhase; 79 | buildActionMask = 2147483647; 80 | dstPath = ""; 81 | dstSubfolderSpec = 13; 82 | files = ( 83 | 84AADEBB1C86126900028505 /* JimoniKeyboard.appex in Embed App Extensions */, 84 | ); 85 | name = "Embed App Extensions"; 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | /* End PBXCopyFilesBuildPhase section */ 89 | 90 | /* Begin PBXFileReference section */ 91 | 84AADE8A1C86123500028505 /* Jimoni.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Jimoni.app; sourceTree = BUILT_PRODUCTS_DIR; }; 92 | 84AADE8E1C86123500028505 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 93 | 84AADE8F1C86123500028505 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 94 | 84AADE941C86123500028505 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 95 | 84AADE961C86123500028505 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 96 | 84AADE991C86123500028505 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 97 | 84AADE9F1C86123500028505 /* JimoniTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JimoniTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 98 | 84AADEA41C86123500028505 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 99 | 84AADEA51C86123500028505 /* JimoniTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JimoniTests.swift; sourceTree = ""; }; 100 | 84AADEB31C86126900028505 /* JimoniKeyboard.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = JimoniKeyboard.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 101 | 84AADEB61C86126900028505 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 102 | 84AADEB71C86126900028505 /* KeyboardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardViewController.swift; sourceTree = ""; }; 103 | 84AADEC21C86179100028505 /* ImageCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ImageCollectionViewCell.xib; sourceTree = ""; }; 104 | 84AADEC41C86248E00028505 /* KeyboardView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KeyboardView.xib; sourceTree = ""; }; 105 | 84D0FA4A1C8B5EA4003F6A2A /* a1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a1.png; sourceTree = ""; }; 106 | 84D0FA4B1C8B5EA4003F6A2A /* a2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a2.png; sourceTree = ""; }; 107 | 84D0FA4C1C8B5EA4003F6A2A /* a3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a3.png; sourceTree = ""; }; 108 | 84D0FA4D1C8B5EA4003F6A2A /* a4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a4.png; sourceTree = ""; }; 109 | 84D0FA4E1C8B5EA4003F6A2A /* a5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a5.png; sourceTree = ""; }; 110 | 84D0FA4F1C8B5EA4003F6A2A /* a6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a6.png; sourceTree = ""; }; 111 | 84D0FA501C8B5EA4003F6A2A /* a7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a7.png; sourceTree = ""; }; 112 | 84D0FA511C8B5EA4003F6A2A /* a8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a8.png; sourceTree = ""; }; 113 | 84D0FA521C8B5EA4003F6A2A /* a9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a9.png; sourceTree = ""; }; 114 | 84D0FA531C8B5EA4003F6A2A /* a10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a10.png; sourceTree = ""; }; 115 | 84D0FA541C8B5EA4003F6A2A /* a11.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a11.png; sourceTree = ""; }; 116 | 84D0FA551C8B5EA4003F6A2A /* a12.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a12.png; sourceTree = ""; }; 117 | 84D0FA561C8B5EA4003F6A2A /* a13.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a13.png; sourceTree = ""; }; 118 | 84D0FA571C8B5EA4003F6A2A /* a14.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a14.png; sourceTree = ""; }; 119 | 84D0FA581C8B5EA4003F6A2A /* a15.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a15.png; sourceTree = ""; }; 120 | 84D0FA591C8B5EA4003F6A2A /* a16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a16.png; sourceTree = ""; }; 121 | 84D0FA5A1C8B5EA4003F6A2A /* a17.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a17.png; sourceTree = ""; }; 122 | 84D0FA5B1C8B5EA4003F6A2A /* a18.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a18.png; sourceTree = ""; }; 123 | 84D0FA5C1C8B5EA4003F6A2A /* a19.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a19.png; sourceTree = ""; }; 124 | 84D0FA5D1C8B5EA4003F6A2A /* a20.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a20.png; sourceTree = ""; }; 125 | 84D0FA5E1C8B5EA4003F6A2A /* a21.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a21.png; sourceTree = ""; }; 126 | 84D0FA5F1C8B5EA4003F6A2A /* a22.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a22.png; sourceTree = ""; }; 127 | 84D0FA601C8B5EA4003F6A2A /* a23.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a23.png; sourceTree = ""; }; 128 | 84D0FA611C8B5EA4003F6A2A /* a24.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a24.png; sourceTree = ""; }; 129 | 84D0FA621C8B5EA4003F6A2A /* a25.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a25.png; sourceTree = ""; }; 130 | 84D0FA631C8B5EA4003F6A2A /* a26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a26.png; sourceTree = ""; }; 131 | 84D0FA641C8B5EA4003F6A2A /* a27.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a27.png; sourceTree = ""; }; 132 | 84D0FA651C8B5EA4003F6A2A /* a28.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a28.png; sourceTree = ""; }; 133 | 84D0FA661C8B5EA4003F6A2A /* a29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a29.png; sourceTree = ""; }; 134 | 84D0FA671C8B5EA4003F6A2A /* a30.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = a30.png; sourceTree = ""; }; 135 | 84D0FA861C8B5EBD003F6A2A /* earth.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = earth.png; sourceTree = ""; }; 136 | /* End PBXFileReference section */ 137 | 138 | /* Begin PBXFrameworksBuildPhase section */ 139 | 84AADE871C86123500028505 /* Frameworks */ = { 140 | isa = PBXFrameworksBuildPhase; 141 | buildActionMask = 2147483647; 142 | files = ( 143 | ); 144 | runOnlyForDeploymentPostprocessing = 0; 145 | }; 146 | 84AADE9C1C86123500028505 /* Frameworks */ = { 147 | isa = PBXFrameworksBuildPhase; 148 | buildActionMask = 2147483647; 149 | files = ( 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | 84AADEB01C86126900028505 /* Frameworks */ = { 154 | isa = PBXFrameworksBuildPhase; 155 | buildActionMask = 2147483647; 156 | files = ( 157 | ); 158 | runOnlyForDeploymentPostprocessing = 0; 159 | }; 160 | /* End PBXFrameworksBuildPhase section */ 161 | 162 | /* Begin PBXGroup section */ 163 | 84AADE811C86123500028505 = { 164 | isa = PBXGroup; 165 | children = ( 166 | 84AADE8C1C86123500028505 /* Jimoni */, 167 | 84AADEA21C86123500028505 /* JimoniTests */, 168 | 84AADEB41C86126900028505 /* JimoniKeyboard */, 169 | 84AADE8B1C86123500028505 /* Products */, 170 | ); 171 | sourceTree = ""; 172 | }; 173 | 84AADE8B1C86123500028505 /* Products */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 84AADE8A1C86123500028505 /* Jimoni.app */, 177 | 84AADE9F1C86123500028505 /* JimoniTests.xctest */, 178 | 84AADEB31C86126900028505 /* JimoniKeyboard.appex */, 179 | ); 180 | name = Products; 181 | sourceTree = ""; 182 | }; 183 | 84AADE8C1C86123500028505 /* Jimoni */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 84E6016D1CDCFF8D00CC2CFE /* Demo */, 187 | 84AADE8F1C86123500028505 /* AppDelegate.swift */, 188 | 84AADE931C86123500028505 /* Main.storyboard */, 189 | 84AADE961C86123500028505 /* Images.xcassets */, 190 | 84AADE981C86123500028505 /* LaunchScreen.xib */, 191 | 84AADE8D1C86123500028505 /* Supporting Files */, 192 | ); 193 | path = Jimoni; 194 | sourceTree = ""; 195 | }; 196 | 84AADE8D1C86123500028505 /* Supporting Files */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | 84AADE8E1C86123500028505 /* Info.plist */, 200 | ); 201 | name = "Supporting Files"; 202 | sourceTree = ""; 203 | }; 204 | 84AADEA21C86123500028505 /* JimoniTests */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 84AADEA51C86123500028505 /* JimoniTests.swift */, 208 | 84AADEA31C86123500028505 /* Supporting Files */, 209 | ); 210 | path = JimoniTests; 211 | sourceTree = ""; 212 | }; 213 | 84AADEA31C86123500028505 /* Supporting Files */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 84AADEA41C86123500028505 /* Info.plist */, 217 | ); 218 | name = "Supporting Files"; 219 | sourceTree = ""; 220 | }; 221 | 84AADEB41C86126900028505 /* JimoniKeyboard */ = { 222 | isa = PBXGroup; 223 | children = ( 224 | 84AADEC61C8625C100028505 /* pngs */, 225 | 84AADEB71C86126900028505 /* KeyboardViewController.swift */, 226 | 84AADEC41C86248E00028505 /* KeyboardView.xib */, 227 | 84AADEC21C86179100028505 /* ImageCollectionViewCell.xib */, 228 | 84AADEB51C86126900028505 /* Supporting Files */, 229 | ); 230 | path = JimoniKeyboard; 231 | sourceTree = ""; 232 | }; 233 | 84AADEB51C86126900028505 /* Supporting Files */ = { 234 | isa = PBXGroup; 235 | children = ( 236 | 84AADEB61C86126900028505 /* Info.plist */, 237 | ); 238 | name = "Supporting Files"; 239 | sourceTree = ""; 240 | }; 241 | 84AADEC61C8625C100028505 /* pngs */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | 84D0FA4A1C8B5EA4003F6A2A /* a1.png */, 245 | 84D0FA4B1C8B5EA4003F6A2A /* a2.png */, 246 | 84D0FA4C1C8B5EA4003F6A2A /* a3.png */, 247 | 84D0FA4D1C8B5EA4003F6A2A /* a4.png */, 248 | 84D0FA4E1C8B5EA4003F6A2A /* a5.png */, 249 | 84D0FA4F1C8B5EA4003F6A2A /* a6.png */, 250 | 84D0FA501C8B5EA4003F6A2A /* a7.png */, 251 | 84D0FA511C8B5EA4003F6A2A /* a8.png */, 252 | 84D0FA521C8B5EA4003F6A2A /* a9.png */, 253 | 84D0FA531C8B5EA4003F6A2A /* a10.png */, 254 | 84D0FA541C8B5EA4003F6A2A /* a11.png */, 255 | 84D0FA551C8B5EA4003F6A2A /* a12.png */, 256 | 84D0FA561C8B5EA4003F6A2A /* a13.png */, 257 | 84D0FA571C8B5EA4003F6A2A /* a14.png */, 258 | 84D0FA581C8B5EA4003F6A2A /* a15.png */, 259 | 84D0FA591C8B5EA4003F6A2A /* a16.png */, 260 | 84D0FA5A1C8B5EA4003F6A2A /* a17.png */, 261 | 84D0FA5B1C8B5EA4003F6A2A /* a18.png */, 262 | 84D0FA5C1C8B5EA4003F6A2A /* a19.png */, 263 | 84D0FA5D1C8B5EA4003F6A2A /* a20.png */, 264 | 84D0FA5E1C8B5EA4003F6A2A /* a21.png */, 265 | 84D0FA5F1C8B5EA4003F6A2A /* a22.png */, 266 | 84D0FA601C8B5EA4003F6A2A /* a23.png */, 267 | 84D0FA611C8B5EA4003F6A2A /* a24.png */, 268 | 84D0FA621C8B5EA4003F6A2A /* a25.png */, 269 | 84D0FA631C8B5EA4003F6A2A /* a26.png */, 270 | 84D0FA641C8B5EA4003F6A2A /* a27.png */, 271 | 84D0FA651C8B5EA4003F6A2A /* a28.png */, 272 | 84D0FA661C8B5EA4003F6A2A /* a29.png */, 273 | 84D0FA671C8B5EA4003F6A2A /* a30.png */, 274 | 84D0FA861C8B5EBD003F6A2A /* earth.png */, 275 | ); 276 | path = pngs; 277 | sourceTree = ""; 278 | }; 279 | 84E6016D1CDCFF8D00CC2CFE /* Demo */ = { 280 | isa = PBXGroup; 281 | children = ( 282 | ); 283 | path = Demo; 284 | sourceTree = ""; 285 | }; 286 | /* End PBXGroup section */ 287 | 288 | /* Begin PBXNativeTarget section */ 289 | 84AADE891C86123500028505 /* Jimoni */ = { 290 | isa = PBXNativeTarget; 291 | buildConfigurationList = 84AADEA91C86123600028505 /* Build configuration list for PBXNativeTarget "Jimoni" */; 292 | buildPhases = ( 293 | 84AADE861C86123500028505 /* Sources */, 294 | 84AADE871C86123500028505 /* Frameworks */, 295 | 84AADE881C86123500028505 /* Resources */, 296 | 84AADEC11C86126900028505 /* Embed App Extensions */, 297 | ); 298 | buildRules = ( 299 | ); 300 | dependencies = ( 301 | 84AADEBA1C86126900028505 /* PBXTargetDependency */, 302 | 84AADEBD1C86126900028505 /* PBXTargetDependency */, 303 | ); 304 | name = Jimoni; 305 | productName = Jimoni; 306 | productReference = 84AADE8A1C86123500028505 /* Jimoni.app */; 307 | productType = "com.apple.product-type.application"; 308 | }; 309 | 84AADE9E1C86123500028505 /* JimoniTests */ = { 310 | isa = PBXNativeTarget; 311 | buildConfigurationList = 84AADEAC1C86123600028505 /* Build configuration list for PBXNativeTarget "JimoniTests" */; 312 | buildPhases = ( 313 | 84AADE9B1C86123500028505 /* Sources */, 314 | 84AADE9C1C86123500028505 /* Frameworks */, 315 | 84AADE9D1C86123500028505 /* Resources */, 316 | ); 317 | buildRules = ( 318 | ); 319 | dependencies = ( 320 | 84AADEA11C86123500028505 /* PBXTargetDependency */, 321 | ); 322 | name = JimoniTests; 323 | productName = JimoniTests; 324 | productReference = 84AADE9F1C86123500028505 /* JimoniTests.xctest */; 325 | productType = "com.apple.product-type.bundle.unit-test"; 326 | }; 327 | 84AADEB21C86126900028505 /* JimoniKeyboard */ = { 328 | isa = PBXNativeTarget; 329 | buildConfigurationList = 84AADEBE1C86126900028505 /* Build configuration list for PBXNativeTarget "JimoniKeyboard" */; 330 | buildPhases = ( 331 | 84AADEAF1C86126900028505 /* Sources */, 332 | 84AADEB01C86126900028505 /* Frameworks */, 333 | 84AADEB11C86126900028505 /* Resources */, 334 | ); 335 | buildRules = ( 336 | ); 337 | dependencies = ( 338 | ); 339 | name = JimoniKeyboard; 340 | productName = JimoniKeyboard; 341 | productReference = 84AADEB31C86126900028505 /* JimoniKeyboard.appex */; 342 | productType = "com.apple.product-type.app-extension"; 343 | }; 344 | /* End PBXNativeTarget section */ 345 | 346 | /* Begin PBXProject section */ 347 | 84AADE821C86123500028505 /* Project object */ = { 348 | isa = PBXProject; 349 | attributes = { 350 | LastSwiftMigration = 0720; 351 | LastSwiftUpdateCheck = 0720; 352 | LastUpgradeCheck = 0600; 353 | ORGANIZATIONNAME = withalsolution; 354 | TargetAttributes = { 355 | 84AADE891C86123500028505 = { 356 | CreatedOnToolsVersion = 6.0.1; 357 | }; 358 | 84AADE9E1C86123500028505 = { 359 | CreatedOnToolsVersion = 6.0.1; 360 | TestTargetID = 84AADE891C86123500028505; 361 | }; 362 | 84AADEB21C86126900028505 = { 363 | CreatedOnToolsVersion = 6.0.1; 364 | }; 365 | }; 366 | }; 367 | buildConfigurationList = 84AADE851C86123500028505 /* Build configuration list for PBXProject "Jimoni" */; 368 | compatibilityVersion = "Xcode 3.2"; 369 | developmentRegion = English; 370 | hasScannedForEncodings = 0; 371 | knownRegions = ( 372 | en, 373 | Base, 374 | ); 375 | mainGroup = 84AADE811C86123500028505; 376 | productRefGroup = 84AADE8B1C86123500028505 /* Products */; 377 | projectDirPath = ""; 378 | projectRoot = ""; 379 | targets = ( 380 | 84AADE891C86123500028505 /* Jimoni */, 381 | 84AADE9E1C86123500028505 /* JimoniTests */, 382 | 84AADEB21C86126900028505 /* JimoniKeyboard */, 383 | ); 384 | }; 385 | /* End PBXProject section */ 386 | 387 | /* Begin PBXResourcesBuildPhase section */ 388 | 84AADE881C86123500028505 /* Resources */ = { 389 | isa = PBXResourcesBuildPhase; 390 | buildActionMask = 2147483647; 391 | files = ( 392 | 84AADE951C86123500028505 /* Main.storyboard in Resources */, 393 | 84AADE9A1C86123500028505 /* LaunchScreen.xib in Resources */, 394 | 84AADE971C86123500028505 /* Images.xcassets in Resources */, 395 | ); 396 | runOnlyForDeploymentPostprocessing = 0; 397 | }; 398 | 84AADE9D1C86123500028505 /* Resources */ = { 399 | isa = PBXResourcesBuildPhase; 400 | buildActionMask = 2147483647; 401 | files = ( 402 | ); 403 | runOnlyForDeploymentPostprocessing = 0; 404 | }; 405 | 84AADEB11C86126900028505 /* Resources */ = { 406 | isa = PBXResourcesBuildPhase; 407 | buildActionMask = 2147483647; 408 | files = ( 409 | 84D0FA7B1C8B5EA4003F6A2A /* a20.png in Resources */, 410 | 84D0FA731C8B5EA4003F6A2A /* a12.png in Resources */, 411 | 84D0FA691C8B5EA4003F6A2A /* a2.png in Resources */, 412 | 84AADEC31C86179100028505 /* ImageCollectionViewCell.xib in Resources */, 413 | 84D0FA761C8B5EA4003F6A2A /* a15.png in Resources */, 414 | 84D0FA6D1C8B5EA4003F6A2A /* a6.png in Resources */, 415 | 84D0FA841C8B5EA4003F6A2A /* a29.png in Resources */, 416 | 84D0FA7C1C8B5EA4003F6A2A /* a21.png in Resources */, 417 | 84AADEC51C86248F00028505 /* KeyboardView.xib in Resources */, 418 | 84D0FA7E1C8B5EA4003F6A2A /* a23.png in Resources */, 419 | 84D0FA801C8B5EA4003F6A2A /* a25.png in Resources */, 420 | 84D0FA871C8B5EBD003F6A2A /* earth.png in Resources */, 421 | 84D0FA7A1C8B5EA4003F6A2A /* a19.png in Resources */, 422 | 84D0FA721C8B5EA4003F6A2A /* a11.png in Resources */, 423 | 84D0FA6E1C8B5EA4003F6A2A /* a7.png in Resources */, 424 | 84D0FA6B1C8B5EA4003F6A2A /* a4.png in Resources */, 425 | 84D0FA811C8B5EA4003F6A2A /* a26.png in Resources */, 426 | 84D0FA7D1C8B5EA4003F6A2A /* a22.png in Resources */, 427 | 84D0FA681C8B5EA4003F6A2A /* a1.png in Resources */, 428 | 84D0FA821C8B5EA4003F6A2A /* a27.png in Resources */, 429 | 84D0FA711C8B5EA4003F6A2A /* a10.png in Resources */, 430 | 84D0FA791C8B5EA4003F6A2A /* a18.png in Resources */, 431 | 84D0FA831C8B5EA4003F6A2A /* a28.png in Resources */, 432 | 84D0FA751C8B5EA4003F6A2A /* a14.png in Resources */, 433 | 84D0FA6F1C8B5EA4003F6A2A /* a8.png in Resources */, 434 | 84D0FA6A1C8B5EA4003F6A2A /* a3.png in Resources */, 435 | 84D0FA781C8B5EA4003F6A2A /* a17.png in Resources */, 436 | 84D0FA851C8B5EA4003F6A2A /* a30.png in Resources */, 437 | 84D0FA6C1C8B5EA4003F6A2A /* a5.png in Resources */, 438 | 84D0FA771C8B5EA4003F6A2A /* a16.png in Resources */, 439 | 84D0FA7F1C8B5EA4003F6A2A /* a24.png in Resources */, 440 | 84D0FA701C8B5EA4003F6A2A /* a9.png in Resources */, 441 | 84D0FA741C8B5EA4003F6A2A /* a13.png in Resources */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | /* End PBXResourcesBuildPhase section */ 446 | 447 | /* Begin PBXSourcesBuildPhase section */ 448 | 84AADE861C86123500028505 /* Sources */ = { 449 | isa = PBXSourcesBuildPhase; 450 | buildActionMask = 2147483647; 451 | files = ( 452 | 84AADE901C86123500028505 /* AppDelegate.swift in Sources */, 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | }; 456 | 84AADE9B1C86123500028505 /* Sources */ = { 457 | isa = PBXSourcesBuildPhase; 458 | buildActionMask = 2147483647; 459 | files = ( 460 | 84AADEA61C86123500028505 /* JimoniTests.swift in Sources */, 461 | ); 462 | runOnlyForDeploymentPostprocessing = 0; 463 | }; 464 | 84AADEAF1C86126900028505 /* Sources */ = { 465 | isa = PBXSourcesBuildPhase; 466 | buildActionMask = 2147483647; 467 | files = ( 468 | 84AADEB81C86126900028505 /* KeyboardViewController.swift in Sources */, 469 | ); 470 | runOnlyForDeploymentPostprocessing = 0; 471 | }; 472 | /* End PBXSourcesBuildPhase section */ 473 | 474 | /* Begin PBXTargetDependency section */ 475 | 84AADEA11C86123500028505 /* PBXTargetDependency */ = { 476 | isa = PBXTargetDependency; 477 | target = 84AADE891C86123500028505 /* Jimoni */; 478 | targetProxy = 84AADEA01C86123500028505 /* PBXContainerItemProxy */; 479 | }; 480 | 84AADEBA1C86126900028505 /* PBXTargetDependency */ = { 481 | isa = PBXTargetDependency; 482 | target = 84AADEB21C86126900028505 /* JimoniKeyboard */; 483 | targetProxy = 84AADEB91C86126900028505 /* PBXContainerItemProxy */; 484 | }; 485 | 84AADEBD1C86126900028505 /* PBXTargetDependency */ = { 486 | isa = PBXTargetDependency; 487 | target = 84AADEB21C86126900028505 /* JimoniKeyboard */; 488 | targetProxy = 84AADEBC1C86126900028505 /* PBXContainerItemProxy */; 489 | }; 490 | /* End PBXTargetDependency section */ 491 | 492 | /* Begin PBXVariantGroup section */ 493 | 84AADE931C86123500028505 /* Main.storyboard */ = { 494 | isa = PBXVariantGroup; 495 | children = ( 496 | 84AADE941C86123500028505 /* Base */, 497 | ); 498 | name = Main.storyboard; 499 | sourceTree = ""; 500 | }; 501 | 84AADE981C86123500028505 /* LaunchScreen.xib */ = { 502 | isa = PBXVariantGroup; 503 | children = ( 504 | 84AADE991C86123500028505 /* Base */, 505 | ); 506 | name = LaunchScreen.xib; 507 | sourceTree = ""; 508 | }; 509 | /* End PBXVariantGroup section */ 510 | 511 | /* Begin XCBuildConfiguration section */ 512 | 84AADEA71C86123600028505 /* Debug */ = { 513 | isa = XCBuildConfiguration; 514 | buildSettings = { 515 | ALWAYS_SEARCH_USER_PATHS = NO; 516 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 517 | CLANG_CXX_LIBRARY = "libc++"; 518 | CLANG_ENABLE_MODULES = YES; 519 | CLANG_ENABLE_OBJC_ARC = YES; 520 | CLANG_WARN_BOOL_CONVERSION = YES; 521 | CLANG_WARN_CONSTANT_CONVERSION = YES; 522 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 523 | CLANG_WARN_EMPTY_BODY = YES; 524 | CLANG_WARN_ENUM_CONVERSION = YES; 525 | CLANG_WARN_INT_CONVERSION = YES; 526 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 527 | CLANG_WARN_UNREACHABLE_CODE = YES; 528 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 529 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 530 | COPY_PHASE_STRIP = NO; 531 | ENABLE_STRICT_OBJC_MSGSEND = YES; 532 | GCC_C_LANGUAGE_STANDARD = gnu99; 533 | GCC_DYNAMIC_NO_PIC = NO; 534 | GCC_OPTIMIZATION_LEVEL = 0; 535 | GCC_PREPROCESSOR_DEFINITIONS = ( 536 | "DEBUG=1", 537 | "$(inherited)", 538 | ); 539 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 540 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 541 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 542 | GCC_WARN_UNDECLARED_SELECTOR = YES; 543 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 544 | GCC_WARN_UNUSED_FUNCTION = YES; 545 | GCC_WARN_UNUSED_VARIABLE = YES; 546 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 547 | MTL_ENABLE_DEBUG_INFO = YES; 548 | ONLY_ACTIVE_ARCH = YES; 549 | SDKROOT = iphoneos; 550 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 551 | TARGETED_DEVICE_FAMILY = "1,2"; 552 | }; 553 | name = Debug; 554 | }; 555 | 84AADEA81C86123600028505 /* Release */ = { 556 | isa = XCBuildConfiguration; 557 | buildSettings = { 558 | ALWAYS_SEARCH_USER_PATHS = NO; 559 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 560 | CLANG_CXX_LIBRARY = "libc++"; 561 | CLANG_ENABLE_MODULES = YES; 562 | CLANG_ENABLE_OBJC_ARC = YES; 563 | CLANG_WARN_BOOL_CONVERSION = YES; 564 | CLANG_WARN_CONSTANT_CONVERSION = YES; 565 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 566 | CLANG_WARN_EMPTY_BODY = YES; 567 | CLANG_WARN_ENUM_CONVERSION = YES; 568 | CLANG_WARN_INT_CONVERSION = YES; 569 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 570 | CLANG_WARN_UNREACHABLE_CODE = YES; 571 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 572 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 573 | COPY_PHASE_STRIP = YES; 574 | ENABLE_NS_ASSERTIONS = NO; 575 | ENABLE_STRICT_OBJC_MSGSEND = YES; 576 | GCC_C_LANGUAGE_STANDARD = gnu99; 577 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 578 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 579 | GCC_WARN_UNDECLARED_SELECTOR = YES; 580 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 581 | GCC_WARN_UNUSED_FUNCTION = YES; 582 | GCC_WARN_UNUSED_VARIABLE = YES; 583 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 584 | MTL_ENABLE_DEBUG_INFO = NO; 585 | SDKROOT = iphoneos; 586 | TARGETED_DEVICE_FAMILY = "1,2"; 587 | VALIDATE_PRODUCT = YES; 588 | }; 589 | name = Release; 590 | }; 591 | 84AADEAA1C86123600028505 /* Debug */ = { 592 | isa = XCBuildConfiguration; 593 | buildSettings = { 594 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 595 | INFOPLIST_FILE = Jimoni/Info.plist; 596 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 597 | PRODUCT_NAME = "$(TARGET_NAME)"; 598 | }; 599 | name = Debug; 600 | }; 601 | 84AADEAB1C86123600028505 /* Release */ = { 602 | isa = XCBuildConfiguration; 603 | buildSettings = { 604 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 605 | INFOPLIST_FILE = Jimoni/Info.plist; 606 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 607 | PRODUCT_NAME = "$(TARGET_NAME)"; 608 | }; 609 | name = Release; 610 | }; 611 | 84AADEAD1C86123600028505 /* Debug */ = { 612 | isa = XCBuildConfiguration; 613 | buildSettings = { 614 | BUNDLE_LOADER = "$(TEST_HOST)"; 615 | FRAMEWORK_SEARCH_PATHS = ( 616 | "$(SDKROOT)/Developer/Library/Frameworks", 617 | "$(inherited)", 618 | ); 619 | GCC_PREPROCESSOR_DEFINITIONS = ( 620 | "DEBUG=1", 621 | "$(inherited)", 622 | ); 623 | INFOPLIST_FILE = JimoniTests/Info.plist; 624 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 625 | PRODUCT_NAME = "$(TARGET_NAME)"; 626 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Jimoni.app/Jimoni"; 627 | }; 628 | name = Debug; 629 | }; 630 | 84AADEAE1C86123600028505 /* Release */ = { 631 | isa = XCBuildConfiguration; 632 | buildSettings = { 633 | BUNDLE_LOADER = "$(TEST_HOST)"; 634 | FRAMEWORK_SEARCH_PATHS = ( 635 | "$(SDKROOT)/Developer/Library/Frameworks", 636 | "$(inherited)", 637 | ); 638 | INFOPLIST_FILE = JimoniTests/Info.plist; 639 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 640 | PRODUCT_NAME = "$(TARGET_NAME)"; 641 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Jimoni.app/Jimoni"; 642 | }; 643 | name = Release; 644 | }; 645 | 84AADEBF1C86126900028505 /* Debug */ = { 646 | isa = XCBuildConfiguration; 647 | buildSettings = { 648 | GCC_PREPROCESSOR_DEFINITIONS = ( 649 | "DEBUG=1", 650 | "$(inherited)", 651 | ); 652 | INFOPLIST_FILE = JimoniKeyboard/Info.plist; 653 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 654 | PRODUCT_NAME = "$(TARGET_NAME)"; 655 | SKIP_INSTALL = YES; 656 | }; 657 | name = Debug; 658 | }; 659 | 84AADEC01C86126900028505 /* Release */ = { 660 | isa = XCBuildConfiguration; 661 | buildSettings = { 662 | INFOPLIST_FILE = JimoniKeyboard/Info.plist; 663 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 664 | PRODUCT_NAME = "$(TARGET_NAME)"; 665 | SKIP_INSTALL = YES; 666 | }; 667 | name = Release; 668 | }; 669 | /* End XCBuildConfiguration section */ 670 | 671 | /* Begin XCConfigurationList section */ 672 | 84AADE851C86123500028505 /* Build configuration list for PBXProject "Jimoni" */ = { 673 | isa = XCConfigurationList; 674 | buildConfigurations = ( 675 | 84AADEA71C86123600028505 /* Debug */, 676 | 84AADEA81C86123600028505 /* Release */, 677 | ); 678 | defaultConfigurationIsVisible = 0; 679 | defaultConfigurationName = Release; 680 | }; 681 | 84AADEA91C86123600028505 /* Build configuration list for PBXNativeTarget "Jimoni" */ = { 682 | isa = XCConfigurationList; 683 | buildConfigurations = ( 684 | 84AADEAA1C86123600028505 /* Debug */, 685 | 84AADEAB1C86123600028505 /* Release */, 686 | ); 687 | defaultConfigurationIsVisible = 0; 688 | defaultConfigurationName = Release; 689 | }; 690 | 84AADEAC1C86123600028505 /* Build configuration list for PBXNativeTarget "JimoniTests" */ = { 691 | isa = XCConfigurationList; 692 | buildConfigurations = ( 693 | 84AADEAD1C86123600028505 /* Debug */, 694 | 84AADEAE1C86123600028505 /* Release */, 695 | ); 696 | defaultConfigurationIsVisible = 0; 697 | defaultConfigurationName = Release; 698 | }; 699 | 84AADEBE1C86126900028505 /* Build configuration list for PBXNativeTarget "JimoniKeyboard" */ = { 700 | isa = XCConfigurationList; 701 | buildConfigurations = ( 702 | 84AADEBF1C86126900028505 /* Debug */, 703 | 84AADEC01C86126900028505 /* Release */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | /* End XCConfigurationList section */ 709 | }; 710 | rootObject = 84AADE821C86123500028505 /* Project object */; 711 | } 712 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/project.xcworkspace/xcshareddata/Jimoni.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 213CCD9A-9F3F-4BA8-8BD2-FCF7D686DEF0 9 | IDESourceControlProjectName 10 | Jimoni 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | FFD0EE708583BA562FFF710BA8F541B8144D2320 14 | https://github.com/jigneshbodarya/JimoniKeyboard.git 15 | 16 | IDESourceControlProjectPath 17 | Jimoni.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | FFD0EE708583BA562FFF710BA8F541B8144D2320 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/jigneshbodarya/JimoniKeyboard.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | FFD0EE708583BA562FFF710BA8F541B8144D2320 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | FFD0EE708583BA562FFF710BA8F541B8144D2320 36 | IDESourceControlWCCName 37 | JimoniKeyboard 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/Jimoni.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Jimoni.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Jimoni.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/JimoniKeyboard.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 16 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 67 | 68 | 74 | 75 | 76 | 77 | 78 | 79 | 86 | 87 | 93 | 94 | 95 | 96 | 98 | 99 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /Jimoni.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Jimoni.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | JimoniKeyboard.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 84AADE891C86123500028505 21 | 22 | primary 23 | 24 | 25 | 84AADE9E1C86123500028505 26 | 27 | primary 28 | 29 | 30 | 84AADEB21C86126900028505 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Jimoni/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Jimoni 4 | // 5 | // Created by Admin on 3/1/16. 6 | // Copyright (c) 2016 withalsolution. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Jimoni/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Jimoni/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 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /Jimoni/Demo/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Jimoni 4 | // 5 | // Created by Admin on 3/1/16. 6 | // Copyright (c) 2016 withalsolution. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MobileCoreServices 11 | 12 | 13 | class ViewController: UIViewController, UITextViewDelegate { 14 | 15 | @IBOutlet var txtView:UITextView! 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | } 20 | 21 | override func didReceiveMemoryWarning() { 22 | super.didReceiveMemoryWarning() 23 | 24 | } 25 | 26 | /*================================================= 27 | * Function Name: addNavigationRightButton 28 | * Function Parameter: 29 | * Function Return Type: UIImage 30 | * Function Purpose: To add share button as navigation rightbar 31 | ==================================================*/ 32 | func addNavigationRightButton() 33 | { 34 | let button = UIButton(frame: CGRectMake(0,0,20,25)) 35 | button.setImage(UIImage(named: "share"), forState: UIControlState.Normal) 36 | button.addTarget(self, action: Selector("shareMenu:"), forControlEvents: .TouchUpInside) 37 | let rightItem = UIBarButtonItem(customView: button) 38 | self.navigationItem.rightBarButtonItem = rightItem 39 | } 40 | //Paste from System UIMenuController 41 | override func paste(sender: AnyObject!) { 42 | 43 | let pasteBoard = UIPasteboard.generalPasteboard() 44 | 45 | 46 | if let _ = pasteBoard.pasteboardTypes() as? [String] 47 | { 48 | 49 | } 50 | else 51 | { 52 | return 53 | } 54 | 55 | let itemTypeArray = pasteBoard.pasteboardTypes() as NSArray 56 | var attributedString = NSMutableAttributedString(string: "") 57 | if (itemTypeArray.containsObject(kUTTypePNG as NSString)) 58 | { 59 | if let data = pasteBoard.dataForPasteboardType(kUTTypePNG as NSString as String) 60 | { 61 | let textAttachment = NSTextAttachment() 62 | textAttachment.image = UIImage(data: data) 63 | textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 3, orientation: .Up) 64 | let attrStringWithImage = NSAttributedString(attachment: textAttachment) 65 | attributedString.appendAttributedString(attrStringWithImage); 66 | let mutableString = NSMutableAttributedString(attributedString: self.txtView.attributedText) 67 | mutableString.appendAttributedString(attributedString) 68 | self.txtView.attributedText = mutableString; 69 | 70 | 71 | } 72 | } 73 | else if (itemTypeArray.containsObject(kUTTypeJPEG as NSString)) 74 | { 75 | 76 | if let data = pasteBoard.dataForPasteboardType(kUTTypeJPEG as NSString as String) 77 | { 78 | let textAttachment = NSTextAttachment() 79 | textAttachment.image = UIImage(data: data) 80 | textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 3, orientation: .Up) 81 | let attrStringWithImage = NSAttributedString(attachment: textAttachment) 82 | attributedString.appendAttributedString(attrStringWithImage); 83 | let mutableString = NSMutableAttributedString(attributedString: self.txtView.attributedText) 84 | mutableString.appendAttributedString(attributedString) 85 | self.txtView.attributedText = mutableString; 86 | 87 | 88 | } 89 | 90 | } 91 | else 92 | { 93 | if let img = pasteBoard.image 94 | { 95 | let textAttachment = NSTextAttachment() 96 | textAttachment.image = img 97 | textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 3, orientation: .Up) 98 | let attrStringWithImage = NSAttributedString(attachment: textAttachment) 99 | attributedString.appendAttributedString(attrStringWithImage); 100 | let mutableString = NSMutableAttributedString(attributedString: self.txtView.attributedText) 101 | mutableString.appendAttributedString(attributedString) 102 | self.txtView.attributedText = mutableString; 103 | } 104 | } 105 | } 106 | 107 | //================================================== 108 | // Function Name: pasteJMoniImage 109 | // Function Parameter: nil 110 | // Function ReturnType: nil 111 | // Function Purpose: To paste image in textview 112 | //================================================== 113 | func pasteJMoniImage() 114 | { 115 | let pasteBoard = UIPasteboard.generalPasteboard() 116 | 117 | 118 | let attributedString = NSMutableAttributedString(string: "") 119 | if let data = pasteBoard.dataForPasteboardType(kUTTypePNG as NSString as String) 120 | { 121 | let textAttachment = NSTextAttachment() 122 | textAttachment.image = UIImage(data: data) 123 | textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 3, orientation: .Up) 124 | let attrStringWithImage = NSAttributedString(attachment: textAttachment) 125 | attributedString.appendAttributedString(attrStringWithImage); 126 | let mutableString = NSMutableAttributedString(attributedString: self.txtView.attributedText) 127 | mutableString.appendAttributedString(attributedString) 128 | self.txtView.attributedText = mutableString; 129 | } 130 | } 131 | 132 | 133 | 134 | /*================================================= 135 | * Function Name: shareMenu 136 | * Function Parameter: sender:UIButton 137 | * Function Return Type: 138 | * Function Purpose: To open share menu 139 | ==================================================*/ 140 | @IBAction func shareMenu(sender: AnyObject) { 141 | let myApp = NSURL(string:"https://play.google.com/apps/publish/?dev_acc=03575560666186575401#ContentRatingPlace:p=withalsolution.helptoworld") 142 | let img: UIImage = self.getImage() 143 | 144 | 145 | let shareItems = NSArray(objects:[img, myApp!]) 146 | let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems as [AnyObject], applicationActivities: nil) 147 | activityViewController.excludedActivityTypes = [UIActivityTypePrint, UIActivityTypePostToWeibo, UIActivityTypeCopyToPasteboard, UIActivityTypeAddToReadingList, UIActivityTypePostToVimeo] 148 | self.presentViewController(activityViewController, animated: true, completion: nil) 149 | 150 | } 151 | 152 | 153 | /*================================================= 154 | * Function Name: getImage 155 | * Function Parameter: 156 | * Function Return Type: UIImage 157 | * Function Purpose: To take screenshot of textview 158 | ==================================================*/ 159 | func getImage() -> UIImage 160 | { 161 | UIGraphicsBeginImageContext(self.txtView.frame.size) 162 | self.txtView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 163 | let image = UIGraphicsGetImageFromCurrentImageContext() 164 | UIGraphicsEndImageContext() 165 | return image 166 | 167 | } 168 | //textview delegate methods 169 | func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 170 | 171 | if(text == " ") 172 | { 173 | self.pasteJMoniImage() 174 | return false 175 | } 176 | if(text == "\n") 177 | { 178 | self.txtView.resignFirstResponder() 179 | return false 180 | } 181 | return true 182 | } 183 | 184 | } 185 | 186 | -------------------------------------------------------------------------------- /Jimoni/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "3x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "3x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "57x57", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "57x57", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "iphone", 45 | "size" : "60x60", 46 | "scale" : "3x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "29x29", 51 | "scale" : "1x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "2x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "40x40", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "2x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "50x50", 71 | "scale" : "1x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "50x50", 76 | "scale" : "2x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "72x72", 81 | "scale" : "1x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "72x72", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ipad", 90 | "size" : "76x76", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "idiom" : "ipad", 95 | "size" : "76x76", 96 | "scale" : "2x" 97 | }, 98 | { 99 | "idiom" : "ipad", 100 | "size" : "83.5x83.5", 101 | "scale" : "2x" 102 | } 103 | ], 104 | "info" : { 105 | "version" : 1, 106 | "author" : "xcode" 107 | } 108 | } -------------------------------------------------------------------------------- /Jimoni/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Jimoni/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.withalsolution.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | 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 | -------------------------------------------------------------------------------- /JimoniKeyboard/ImageCollectionViewCell.xib: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /JimoniKeyboard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | JimoniKeyboard 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | com.withalsolution.Jimoni.$(PRODUCT_NAME:rfc1034identifier) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | IsASCIICapable 30 | 31 | PrefersRightToLeft 32 | 33 | PrimaryLanguage 34 | en-US 35 | RequestsOpenAccess 36 | 37 | 38 | NSExtensionPointIdentifier 39 | com.apple.keyboard-service 40 | NSExtensionPrincipalClass 41 | $(PRODUCT_MODULE_NAME).KeyboardViewController 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /JimoniKeyboard/KeyboardView.xib: -------------------------------------------------------------------------------- 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 | 57 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /JimoniKeyboard/KeyboardViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyboardViewController.swift 3 | // JimoniKeyboard 4 | // 5 | // Created by Admin on 3/1/16. 6 | // Copyright (c) 2016 withalsolution. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MobileCoreServices 11 | class ImageCollectionViewCell:UICollectionViewCell { 12 | @IBOutlet var imgView:UIImageView! 13 | } 14 | 15 | class KeyboardViewController: UIInputViewController, UICollectionViewDataSource, UICollectionViewDelegate { 16 | 17 | @IBOutlet var collectionView: UICollectionView! 18 | 19 | var imgArray = NSMutableArray() 20 | override func updateViewConstraints() { 21 | super.updateViewConstraints() 22 | 23 | // Add custom view sizing constraints here 24 | 25 | } 26 | 27 | override func viewDidLoad() { 28 | super.viewDidLoad() 29 | //Loading Xib 30 | let nib = UINib(nibName: "KeyboardView", bundle: nil) 31 | let objects = nib.instantiateWithOwner(self, options: nil) 32 | view = objects[0] as! UIView; 33 | self.collectionView.registerNib(UINib(nibName: "ImageCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "ImageCollectionViewCell") 34 | for(var i=1; i <= 30; i++) 35 | { 36 | self.imgArray.addObject("a\(i).png") 37 | } 38 | self.collectionView.reloadData() 39 | self.view.bringSubviewToFront(self.collectionView) 40 | } 41 | 42 | override func didReceiveMemoryWarning() { 43 | super.didReceiveMemoryWarning() 44 | // Dispose of any resources that can be recreated 45 | } 46 | 47 | //================================================== 48 | // Function Name: returnPressed 49 | // Function Parameter: button: UIButton 50 | // Function ReturnType: nil 51 | // Function Purpose: To return textfield 52 | //================================================== 53 | @IBAction func returnPressed(button: UIButton) { 54 | (textDocumentProxy as UIKeyInput).insertText("\n") 55 | } 56 | 57 | //================================================== 58 | // Function Name: nextKeyboardPressed 59 | // Function Parameter: button: UIButton 60 | // Function ReturnType: nil 61 | // Function Purpose: To change keyboard type 62 | //================================================== 63 | @IBAction func nextKeyboardPressed(button: UIButton) { 64 | advanceToNextInputMode() 65 | } 66 | 67 | 68 | //Collectionview delegate methods 69 | func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 70 | 71 | let iCell = collectionView.dequeueReusableCellWithReuseIdentifier("ImageCollectionViewCell", forIndexPath: indexPath) as! ImageCollectionViewCell 72 | iCell.imgView.image = UIImage(named: self.imgArray.objectAtIndex(indexPath.row) as! String) 73 | return iCell 74 | } 75 | 76 | func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 77 | return self.imgArray.count 78 | } 79 | 80 | func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 81 | 82 | let pb = UIPasteboard.generalPasteboard() 83 | let data = UIImagePNGRepresentation( UIImage(named: self.imgArray.objectAtIndex(indexPath.row) as! String)!) 84 | pb.setData(data!, forPasteboardType: kUTTypePNG as String) 85 | 86 | let iCell = self.collectionView.cellForItemAtIndexPath(indexPath) as! ImageCollectionViewCell 87 | UIView.animateWithDuration(0.2, animations: { 88 | iCell.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0) 89 | }, completion: {(_) -> Void in 90 | iCell.transform = 91 | CGAffineTransformScale(CGAffineTransformIdentity, 1, 1) 92 | }) 93 | (textDocumentProxy as UIKeyInput).insertText(" ") 94 | 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a1.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a10.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a11.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a12.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a13.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a14.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a15.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a16.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a17.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a18.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a19.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a2.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a20.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a21.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a22.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a23.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a24.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a25.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a26.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a27.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a28.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a29.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a3.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a30.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a4.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a5.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a6.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a7.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a8.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/a9.png -------------------------------------------------------------------------------- /JimoniKeyboard/pngs/earth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/JimoniKeyboard/pngs/earth.png -------------------------------------------------------------------------------- /JimoniTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.withalsolution.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /JimoniTests/JimoniTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JimoniTests.swift 3 | // JimoniTests 4 | // 5 | // Created by Admin on 3/1/16. 6 | // Copyright (c) 2016 withalsolution. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class JimoniTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The Artistic License 2.0 2 | 3 | Copyright (c) 2016 withalsolution 4 | 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | This license establishes the terms under which a given free software 11 | Package may be copied, modified, distributed, and/or redistributed. 12 | The intent is that the Copyright Holder maintains some artistic 13 | control over the development of that Package while still keeping the 14 | Package available as open source and free software. 15 | 16 | You are always permitted to make arrangements wholly outside of this 17 | license directly with the Copyright Holder of a given Package. If the 18 | terms of this license do not permit the full use that you propose to 19 | make of the Package, you should contact the Copyright Holder and seek 20 | a different licensing arrangement. 21 | 22 | Definitions 23 | 24 | "Copyright Holder" means the individual(s) or organization(s) 25 | named in the copyright notice for the entire Package. 26 | 27 | "Contributor" means any party that has contributed code or other 28 | material to the Package, in accordance with the Copyright Holder's 29 | procedures. 30 | 31 | "You" and "your" means any person who would like to copy, 32 | distribute, or modify the Package. 33 | 34 | "Package" means the collection of files distributed by the 35 | Copyright Holder, and derivatives of that collection and/or of 36 | those files. A given Package may consist of either the Standard 37 | Version, or a Modified Version. 38 | 39 | "Distribute" means providing a copy of the Package or making it 40 | accessible to anyone else, or in the case of a company or 41 | organization, to others outside of your company or organization. 42 | 43 | "Distributor Fee" means any fee that you charge for Distributing 44 | this Package or providing support for this Package to another 45 | party. It does not mean licensing fees. 46 | 47 | "Standard Version" refers to the Package if it has not been 48 | modified, or has been modified only in ways explicitly requested 49 | by the Copyright Holder. 50 | 51 | "Modified Version" means the Package, if it has been changed, and 52 | such changes were not explicitly requested by the Copyright 53 | Holder. 54 | 55 | "Original License" means this Artistic License as Distributed with 56 | the Standard Version of the Package, in its current version or as 57 | it may be modified by The Perl Foundation in the future. 58 | 59 | "Source" form means the source code, documentation source, and 60 | configuration files for the Package. 61 | 62 | "Compiled" form means the compiled bytecode, object code, binary, 63 | or any other form resulting from mechanical transformation or 64 | translation of the Source form. 65 | 66 | 67 | Permission for Use and Modification Without Distribution 68 | 69 | (1) You are permitted to use the Standard Version and create and use 70 | Modified Versions for any purpose without restriction, provided that 71 | you do not Distribute the Modified Version. 72 | 73 | 74 | Permissions for Redistribution of the Standard Version 75 | 76 | (2) You may Distribute verbatim copies of the Source form of the 77 | Standard Version of this Package in any medium without restriction, 78 | either gratis or for a Distributor Fee, provided that you duplicate 79 | all of the original copyright notices and associated disclaimers. At 80 | your discretion, such verbatim copies may or may not include a 81 | Compiled form of the Package. 82 | 83 | (3) You may apply any bug fixes, portability changes, and other 84 | modifications made available from the Copyright Holder. The resulting 85 | Package will still be considered the Standard Version, and as such 86 | will be subject to the Original License. 87 | 88 | 89 | Distribution of Modified Versions of the Package as Source 90 | 91 | (4) You may Distribute your Modified Version as Source (either gratis 92 | or for a Distributor Fee, and with or without a Compiled form of the 93 | Modified Version) provided that you clearly document how it differs 94 | from the Standard Version, including, but not limited to, documenting 95 | any non-standard features, executables, or modules, and provided that 96 | you do at least ONE of the following: 97 | 98 | (a) make the Modified Version available to the Copyright Holder 99 | of the Standard Version, under the Original License, so that the 100 | Copyright Holder may include your modifications in the Standard 101 | Version. 102 | 103 | (b) ensure that installation of your Modified Version does not 104 | prevent the user installing or running the Standard Version. In 105 | addition, the Modified Version must bear a name that is different 106 | from the name of the Standard Version. 107 | 108 | (c) allow anyone who receives a copy of the Modified Version to 109 | make the Source form of the Modified Version available to others 110 | under 111 | 112 | (i) the Original License or 113 | 114 | (ii) a license that permits the licensee to freely copy, 115 | modify and redistribute the Modified Version using the same 116 | licensing terms that apply to the copy that the licensee 117 | received, and requires that the Source form of the Modified 118 | Version, and of any works derived from it, be made freely 119 | available in that license fees are prohibited but Distributor 120 | Fees are allowed. 121 | 122 | 123 | Distribution of Compiled Forms of the Standard Version 124 | or Modified Versions without the Source 125 | 126 | (5) You may Distribute Compiled forms of the Standard Version without 127 | the Source, provided that you include complete instructions on how to 128 | get the Source of the Standard Version. Such instructions must be 129 | valid at the time of your distribution. If these instructions, at any 130 | time while you are carrying out such distribution, become invalid, you 131 | must provide new instructions on demand or cease further distribution. 132 | If you provide valid instructions or cease distribution within thirty 133 | days after you become aware that the instructions are invalid, then 134 | you do not forfeit any of your rights under this license. 135 | 136 | (6) You may Distribute a Modified Version in Compiled form without 137 | the Source, provided that you comply with Section 4 with respect to 138 | the Source of the Modified Version. 139 | 140 | 141 | Aggregating or Linking the Package 142 | 143 | (7) You may aggregate the Package (either the Standard Version or 144 | Modified Version) with other packages and Distribute the resulting 145 | aggregation provided that you do not charge a licensing fee for the 146 | Package. Distributor Fees are permitted, and licensing fees for other 147 | components in the aggregation are permitted. The terms of this license 148 | apply to the use and Distribution of the Standard or Modified Versions 149 | as included in the aggregation. 150 | 151 | (8) You are permitted to link Modified and Standard Versions with 152 | other works, to embed the Package in a larger work of your own, or to 153 | build stand-alone binary or bytecode versions of applications that 154 | include the Package, and Distribute the result without restriction, 155 | provided the result does not expose a direct interface to the Package. 156 | 157 | 158 | Items That are Not Considered Part of a Modified Version 159 | 160 | (9) Works (including, but not limited to, modules and scripts) that 161 | merely extend or make use of the Package, do not, by themselves, cause 162 | the Package to be a Modified Version. In addition, such works are not 163 | considered parts of the Package itself, and are not subject to the 164 | terms of this license. 165 | 166 | 167 | General Provisions 168 | 169 | (10) Any use, modification, and distribution of the Standard or 170 | Modified Versions is governed by this Artistic License. By using, 171 | modifying or distributing the Package, you accept this license. Do not 172 | use, modify, or distribute the Package, if you do not accept this 173 | license. 174 | 175 | (11) If your Modified Version has been derived from a Modified 176 | Version made by someone other than you, you are nevertheless required 177 | to ensure that your Modified Version complies with the requirements of 178 | this license. 179 | 180 | (12) This license does not grant you the right to use any trademark, 181 | service mark, tradename, or logo of the Copyright Holder. 182 | 183 | (13) This license includes the non-exclusive, worldwide, 184 | free-of-charge patent license to make, have made, use, offer to sell, 185 | sell, import and otherwise transfer the Package with respect to any 186 | patent claims licensable by the Copyright Holder that are necessarily 187 | infringed by the Package. If you institute patent litigation 188 | (including a cross-claim or counterclaim) against any party alleging 189 | that the Package constitutes direct or contributory patent 190 | infringement, then this Artistic License to you shall terminate on the 191 | date that such litigation is filed. 192 | 193 | (14) Disclaimer of Warranty: 194 | THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS 195 | IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED 196 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR 197 | NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL 198 | LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL 199 | BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 200 | DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF 201 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JimoniKeyboard 2 | It is very handy custom keyboard for ios using extension 3 | 4 | ## Requirements 5 | 6 | - iOS 8.0+ 7 | 8 | ## Screenshot 9 | 10 | ![JiMoni] (https://github.com/withalsolution/JimoniKeyboard/blob/master/keyboard.png) 11 | 12 | Its a custom emoji keyboard that directly allow to access emoji images from keyboard to app. 13 | 14 | 15 | After tapping of any of emoji you can paste it on apps like email, messanges by directly paste from menu controller 16 | 17 | 18 | ## Usage 19 | 20 | The following code copy data into pasteBoard 21 | ```swift 22 | let pb = UIPasteboard.generalPasteboard() 23 | let data = UIImagePNGRepresentation( UIImage(named: self.imgArray.objectAtIndex(indexPath.row) as String)) 24 | pb.setData(data, forPasteboardType: kUTTypePNG as NSString) 25 | 26 | ``` 27 | 28 | 29 | 30 | 31 | and now you can paste this emoji image any app that support paste image functionality like whatsapp, facebook messager. 32 | 33 | After running this you must need to add this emoji keyboard from simulator or device. 34 | You can add this keyboard from 35 | Settings -> 36 | General -> 37 | Keyboard -> 38 | Keyboards -> 39 | Add New Keyboard -> 40 | Jimoni - Emoji keyboard. 41 | 42 | ## Note 43 | 44 | Before you use in real device you must need to full access to paste image from this keyboard you can give this permission from app settings or simply changing permission to `true` for Request `Open Access` from info.plist 45 | 46 | 47 | IsASCIICapable 48 | 49 | PrefersRightToLeft 50 | 51 | PrimaryLanguage 52 | en-US 53 | RequestsOpenAccess 54 | 55 | 56 | -------------------------------------------------------------------------------- /keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/withalsolution/JimoniKeyboard/4f488c09b4c8c7b552316841043be2fe60230609/keyboard.png --------------------------------------------------------------------------------