KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and ipadOS.

Overview

KeyboardKit

Version Platform Swift 5.3 MIT License Twitter: @danielsaidi

About KeyboardKit

KeyboardKit is a Swift library that helps you create custom keyboard extensions for iOS and iPadOS. It has tools for creating keyboards that mimic native keyboards, as well as entirely custom ones. You can use any views and use the tools in any way you like.

The end result can look something like this...or entirely different:

The movie above demonstrates an extensions that mimics a native system keyboard. KeyboardKit lets you create rich system keyboards like that with support for multiple locales, multi-gestures, secondary action callouts etc.

If you're new to iOS keyboard extensions, this great guide will help you get started. You can also have a look at the demo app for inspiration.

Installation

Swift Package Manager

https://github.com/KeyboardKit/KeyboardKit.git

CocoaPods

target 'MyApp' do
  pod 'KeyboardKit'
end

target 'MyKeyboard' do
  pod 'KeyboardKit'
end

post_install do |installer|
   installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
          config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'No'
      end
   end
end

Getting Started

To build a keyboard extension with KeyboardKit, add KeyboardKit to your project as shown above.

If you use Swift Package Manager, make sure to add KeyboardKit to your keyboard extension. You can add it to the hosting app as well, but the keyboard extension must have it.

Then, you should then inherit KeyboardInputViewController instead of UIInputViewController. It provides you with a lot of additional functionality, e.g. extra observables like keyboardContext as well as services like keyboardActionHandler, keyboardAppearance etc.

Inheriting KeyboardInputViewController also gives extensions access to new view lifecycle functions, autocomplete logic, extensions and more.

KeyboardInputViewController will call viewWillSetupKeyboard whenever the keyboard must be created or re-created due to things like screen size changes. You can then use setup(with:) to setup your extension with any SwiftUI view.

Setting up the view controller with a SwiftUI view will make the view the main view of the extension, inject necessary environment objects and resize the keyboard extension to fit the view.

Have a look at the demo application and read more below to see how it all fits together.

SwiftUI vs. UIKit

KeyboardKit supports both SwiftUI and UIKit, but SwiftUI is the main focus going forward.

The rest of this readme assumes that you're using SwiftUI. You can read more about UIKit support here.

Important about SwiftUI previews

KeyboardKit contains color and text resources that are embedded within the Swift Package. However, external SwiftUI previews can't access these resources, since the .module bundle isn't defined outside of this package. This makes the previews crash.

Until this is solved in SwiftUI and SPM, call KeyboardPreviews.enable() in each preview to use fake colors and texts that don't break the preview.

๐Ÿ‡ธ๐Ÿ‡ช Localization

KeyboardKit is localized in the following languages:

  • ๐Ÿ‡บ๐Ÿ‡ธ English (US - Default)

  • ๐Ÿ‡ฉ๐Ÿ‡ฐ Danish

  • ๐Ÿ‡ณ๐Ÿ‡ฑ Dutch

  • ๐Ÿ‡ฌ๐Ÿ‡ง English (UK)

  • ๐Ÿ‡ซ๐Ÿ‡ฎ Finnish

  • ๐Ÿ‡ซ๐Ÿ‡ท French

  • ๐Ÿ‡ฉ๐Ÿ‡ช German

  • ๐Ÿ‡ฎ๐Ÿ‡น Italian

  • ๐Ÿ‡ณ๐Ÿ‡ด Norwegian

  • ๐Ÿ‡ช๐Ÿ‡ธ Spanish

  • ๐Ÿ‡ธ๐Ÿ‡ช Swedish

KeyboardKit also supports localized keyboards, where the keyboard layout, secondary actions etc. behave just like they should for a certain locale.

Read more here

Features

๐Ÿ“ฆ Extensions & Views

Even though KeyboardKit contains a lot of features, you can use its' extensions and views alone to simplify working with keyboard extensions. For instance, there are a bunch of UITextDocumentProxy extensions that make your life easier, and views that don't require you to use the rest of the library.

Check out the demo apps and source code for examples and more information.

๐Ÿ’ฅ Keyboard Actions

KeyboardKit comes with many keyboard-specific actions, like character inputs, emojis, backspace, space, newline, image etc. You can even create your own actions.

Read more here

๐Ÿ˜Š Keyboard Types

KeyboardKit comes with many different keyboard types, like alphabetic, numeric, symbolic, emoji etc. You can even create your own types.

Read more here

๐Ÿ”ค Input Sets

KeyboardKit comes with an input set engine that make it easy to create alphabetic, numeric and symbolic keyboards in different languages.

Read more here

โŒจ๏ธ Keyboard Layouts

KeyboardKit comes with a layout engine that makes it easy to create specific keyboard layouts for various devices, orientations and locales.

Read more here

๐ŸŽจ Appearances

KeyboardKit lets you style your custom keyboards with custom appearances.

Read more here

๐Ÿ—ฏ Callouts

KeyboardKit lets you show callout bubbles as users type, as well as secondary action callouts with optional actions.

Read more here

๐Ÿ’ก Autocomplete

KeyboardKit can present autocomplete suggestions as users type. The core library doesn't come with an implemented engine, but you can inject your own.

KeyboardKit Pro adds a localized autocomplete engine that provides localized suggestions.

Read more here

โœ‹ Haptic Feedback

KeyboardKit keyboards can give haptic feedback as users type.

Read more here.

๐Ÿ”ˆ Audio Feedback

KeyboardKit keyboards can give audio feedback as users type.

Read more here.

Demo Application

This repository contains a demo app that demonstrates different keyboards, like alphabetical (lowercased, uppercased and capslocked), numerical, symbols, emojis and images. It's not intended to be production ready, but rather to give you inspiration to how you can build your own keyboards.

To run the demo app, open and run the Demo/Demo.xcodeproj project, then enable the keyboards under system settings. Enable full access to support all features, like audio and haptic feedback.

KeyboardKit Pro

KeyboardKit Pro is a license-based extensions that unlocks pro features, such as additional locales and an autocomplete engine. Going pro is also a way to support this project.

Go Pro here!

Contact

Feel free to reach out if you have questions or if you want to contribute in any way:

Sponsors and Clients

This project is proudly sponsored by the following individuals and companies:

Oribi Logo Anomaly Software Logo Milo Creative Logo

You can support KeyboardKit by sponsoring the project on GitHub Sponsors, signing up for a KeyboardKit Pro license or hiring me for consultation.

License

KeyboardKit is available under the MIT license. See LICENSE file for more info.

Comments
  • "-[UIInputViewController needsInputModeSwitchKey] was called before a connection was established to the host application"

    Whenever my keyboard (a fork of the demo keyboard) reads KeyboardViewController#needsInputModeSwitchKey, the following error is logged to the console:

    -[UIInputViewController needsInputModeSwitchKey] was called before a connection was established to the host application. This will produce an inaccurate result. Please make sure to call this after your primary view controller has been initialized.

    Do you see this too? Any ideas about how to suppress? The weird thing is that this occurs even when called after the view controller has been clearly initialized for quite some time e.g. when repeatedly switching between the emoji and alphabetic keyboards. It also occurs on both the simulator and device, fwiw.


    At least in my own keyboard, I'm strongly considering suppressing this by just assuming that the keyboard always needs a switch button, that is editing https://github.com/danielsaidi/KeyboardKit/blob/63a3cc608ea6ba3884a3dffd31506f37413481c0/KeyboardKitDemoKeyboard/Keyboards/DemoKeyboard.swift#L32 to look like:

        static func switchAction(for vc: KeyboardViewController) -> KeyboardAction {
            return .nextKeyboard
        }
        
        static func imageAction(for vc: KeyboardViewController) -> KeyboardAction {
            return .keyboardType(.emojis)
        }
    

    (which eliminates all calls to needsInputModeSwitchKey from the demo application).

    I feel comfortable doing this because my custom keyboard is not a replacement for the system alphabetic keyboard. I bet that's true of many custom keyboards, that they'll accompany other keyboards?

    Another nice side effect of removing the calls to needsInputModeSwitchKey is that then I can set up the keyboard in KeyboardViewController#viewDidLoad, since this comment no longer applies.

    bug 
    opened by wearhere 44
  • (Urgent) Keyboard height constrained after upgrading to iOS 15.0

    (Urgent) Keyboard height constrained after upgrading to iOS 15.0

    I just upgraded my device to iOS 15.0 and our keyboard extension is no longer working. The issue is hard to describe so I have attached videos of the intended behavior (from iOS 14.x) and the buggy behavior (from iOS 15.0). Any idea what is causing this?

    Intended behavior (iOS 14.x): https://user-images.githubusercontent.com/42124305/134072284-60874c3a-0dd7-408b-abc2-909bf6772484.mp4

    Buggy behavior (iOS 15.0): https://user-images.githubusercontent.com/42124305/134071650-c2b8edf2-a8a0-409a-82b8-58033f573d45.MP4

    bug 
    opened by amirshane 40
  • Dark appearance keyboards look bad

    Dark appearance keyboards look bad

    The default keyboard in the demo looks significantly different (in a bad way) than the base IOS keyboard when on a light background. I have pasted the images of IOS and KK keyboards with different background below for comparison.

    IOS keyboard in dark background:

    KK in dark background (OK):

    IOS keyboard in light background (OK):

    KK in light background (not OK):

    The KK keyboard keys blend in with the main keyboard body whereas they should preserve their gray color as in the IOS keyboard. Also, the shift, space, globe, etc. keys are darker than they should be.

    bug 
    opened by ibayramli 35
  • Adding a textfield inside a keyboard

    Adding a textfield inside a keyboard

    Hi again,

    Please, how can i create a Top Actions like this image below? I try to change this function:

     static func bottomActions(leftmost: KeyboardAction, for viewController: KeyboardViewController) -> KeyboardActionRow {
            let actions: [KeyboardAction] = [unathenticatedAction(for: viewController), leftmost, switchAction(for: viewController), .space, imageAction(for: viewController),  .newLine]
            let isEmoji: Bool = viewController.keyboardType == .emojis
            let isImage: Bool = viewController.keyboardType == .images
            let isUnathenticated: Bool = viewController.keyboardType == .custom("unathenticated")
            let includeImageActions: Bool = !isEmoji && !isImage && !isUnathenticated
            return includeImageActions ? actions : actions.withoutImageActions
        }
    
    

    But no success :(

    Also how can i add textfield inside a custom keyboard and label to it?

    Sorry for my beginners doubts.

    Some examples:

    WhatsApp Image 2019-10-18 at 00 29 06

    WhatsApp Image 2019-10-18 at 00 32 01

    Thank you so much for the help

    feature 
    opened by thiagobutignon 29
  • iOS keyboard extensions can't differ between dark mode and dark appearance

    iOS keyboard extensions can't differ between dark mode and dark appearance

    The KeyboardContext colorScheme becomes wrong when keyboardAppearance is .dark and the device runs in .light mode. The keyboard extension will be told that the colorScheme is .dark instead of .light.

    This is WRONG, since "dark appearance" keyboards should NOT look the same in light mode and dark mode. However, this is how iOS sets up the extension and not a bug in KeyboardKit.

    Until this is fixed, set the Color.darkAppearanceStrategy to a custom strategy if you want to customize KeyboardKit's standard strategy of always applying dark appearance colors when dark mode is enabled.

    bug 
    opened by danielsaidi 26
  • Strange autocomplete behavior

    Strange autocomplete behavior

    This is an odd one that I haven't been able to narrow down, but I'm creating an issue in case you have any ideas before I can find the root cause.

    On a real device, I'm seeing autocomplete suggestions that are improperly capitalized. For example, if I type "This is a..." the suggestion will be "A" and the suggestion is highlighted so tapping space results in "This is A ". This behavior is consistent for me, but other users report different words being randomly capitalized (it -> IT) which I'm not able to reproduce.

    So far I've been unable to replicate the issue on the simulator, only on my personal device. I do not experience the same issue when using SwiftKey or the default iOS keyboard.

    None of the following have an impact

    • Toggling settings in General > Keyboards

      • Auto-Capitalisation
      • Auto-Correction
      • Check Spelling
    • Resetting the keyboard dictionary in General > Transfer or Reset iPhone > Reset

    adjustment 
    opened by doubleo2 24
  • Use generic ItemView type for buttons instead of AnyView

    Use generic ItemView type for buttons instead of AnyView

    Memory fails me as I can't recall where I've heard it (probably WWDC2021 talk Demystifying SwiftUI), but SwiftUI uses the type system to determine the structured identity of nodes in the view tree. AnyView erases this type information, and so should be avoided as much as possible.

    I'm a bit uncomfortable about wrapping views in AnyView for the keyboard button factory. I propose to make the relevant view generic, and to leverage the compiler feature of some View to calculate the exact type. I'm not deep enough in SwiftUI to have an intuition about whether it actually makes a dent in performance, but I think it is more legible like this anyway (just an opinion).

    I've made a little proof of concept in this branch. All code still works exactly as before, thanks to the fallback convenience initializer providing a default view factory.

    What do you think about it? If you like it, we could proceed to remove all or most AnyView casting.

    opened by digitalheir 23
  • Variable used within its own initial value

    Variable used within its own initial value

    When we try to run the demo or even with cocoa pods installation, Error comes with "Variable used within its own initial value" inside the library.

    I am using Xcode 12.4. Here is a screenshot of it.

    Screenshot 2021-06-05 at 1 09 49 PM tech 
    opened by nikhilbatra789 22
  • KeyboardKit freezes in some apps

    KeyboardKit freezes in some apps

    In certain iphone apps, the keyboard shows up but is unresponsive to tap or any action. Running in debug shows the usual message below nonstop which seems to suggest it is in some kind of infinite loop.

    Keyboard[3253:9009206] [External] -[UIInputViewController needsInputModeSwitchKey] was called before a connection was established to the host application. This will produce an inaccurate result. Please make sure to call this after your primary view controller has been initialized.

    I can reproduce using the Demo keyboard in master installing on a physical iphone 12. Apps that show this behavior:

    • search field in BLB app
    • chat field in wechat app

    Any suggestion to troubleshoot is appreciated.

    bug 
    opened by ctawong 19
  • UIKit Demo Issues

    UIKit Demo Issues

    I am trying to get the UIKit demo working because I am building a keyboard that uses an SDK that needs to be configured in AppDelegate. The demo runs but it is broken in unexpected ways

    1. The "Enter" key is blank
    2. Tapping the 123 key to switch to the numeric layout doesn't do anything
    3. Replacing the third auto-complete suggestion with StandardAutocompleteSuggestion(text: "abc", title: "WILD") causes the word "WILD" to be inserted when tapped. I would expect it to insert "abc"
    4. How do I access the custom layouts - i.e. the emoji and image keyboards - in the demo?

    The first issue I was able to resolve by replacing .newLine in DemoButton.swift with .return

    The second seems to be caused by the guard at StandardKeyboardActionHandler.swift#L95 which prevents a tap on the keyboardType action from reaching the tryChangeKeyboardType() call.

    The third, I don't know. As far as I can tell, the replacement action takes the text from the suggestion, not the title, but it's clearly not working.

    I suspect the fourth issue may be related to the fact that I'm unable to access the numeric layout.

    Screenshot
    wontfix discussion 
    opened by doubleo2 19
  • Display an input callout when tapping buttons

    Display an input callout when tapping buttons

    Where I mean that, when the user taps a key, they see a "key cap" view appear above their finger:

    I found a project that mimics the look and behavior of Apple's keyboard quite well https://github.com/illyabusigin/CYRKeyboardButton, the above gif is from there. It's not built for use in keyboard extensions per se but rather input accessory views (hence the buttons' ability to draw above the keyboard), but still might be adapted for use in this project, I think. The key cap view (CYRKeyboardButtonView) is even separate from the button so that might be perfect since this project already has button views.

    feature 
    opened by wearhere 19
  • Make the Emoji category keyboard look closer to the system one on iPad

    Make the Emoji category keyboard look closer to the system one on iPad

    Here is the KeyboardKit version vs the system on a 9th gen iPad in portrait:

    Skaฬˆrmavbild 2023-01-05 kl  21 26 40 Skaฬˆrmavbild 2023-01-05 kl  21 26 46

    ...and here it is in landscape:

    Skaฬˆrmavbild 2023-01-05 kl  21 29 12 Skaฬˆrmavbild 2023-01-05 kl  21 29 18

    Also ensure that it looks great on larger iPad devices as well.

    adjustment 
    opened by danielsaidi 0
  • Localize `join`

    Localize `join`

    KeyboardKit 6.8 adds a join case for KKL10n, but leaves it untranslated for most locales.

    We should localize this key for all locales. You can find the text when being asked to join a wifi network.

    Check this box for each locale that this is localized for:

    • [ ] arabic
    • [ ] armenian
    • [ ] belarusian
    • [ ] bulgarian
    • [ ] catalan
    • [ ] cherokee
    • [ ] croatian
    • [ ] czech
    • [ ] danish
    • [ ] dutch
    • [ ] dutch_belgium
    • [x] english
    • [x] english_gb
    • [x] english_us
    • [ ] estonian
    • [ ] faroese
    • [ ] filipino
    • [ ] finnish
    • [ ] french
    • [ ] french_belgium
    • [ ] french_switzerland
    • [ ] georgian
    • [ ] german
    • [ ] german_austria
    • [ ] german_switzerland
    • [ ] greek
    • [ ] hawaiian
    • [ ] hebrew
    • [ ] hungarian
    • [ ] icelandic
    • [ ] indonesian
    • [ ] irish
    • [ ] italian
    • [ ] kurdish_sorani
    • [ ] kurdish_sorani_arabic
    • [ ] kurdish_sorani_pc
    • [ ] latvian
    • [ ] lithuanian
    • [ ] macedonian
    • [ ] malay
    • [ ] maltese
    • [ ] mongolian
    • [ ] norwegian
    • [ ] persian
    • [ ] polish
    • [ ] portuguese
    • [ ] portuguese_brazil
    • [ ] romanian
    • [ ] russian
    • [ ] serbian
    • [ ] serbian_latin
    • [ ] slovenian
    • [ ] slovak
    • [ ] spanish
    • [x] swedish
    • [ ] swahili
    • [ ] turkish
    • [ ] ukrainian
    • [ ] uzbek

    This ticket will be closed once all boxes are checked.

    localization 
    opened by danielsaidi 0
  • Create a custom keyboard layout provider for each(ish) locale

    Create a custom keyboard layout provider for each(ish) locale

    Today, the iPhone and iPad layout provider is pretty complicated, where various locales can cause additional actions to be added, button sizes adjusted etc.

    We should keep the standard provider, but add a localized provider collection with a fallback to qwerty which can then be used by all locales that use the QWERTY/QWERTZ/AXERTY layout.

    We should then add a base provider that can be inherited by all other provider and return the standard sizes etc. I think this will make creating new locales and layouts a LOT easier.

    This should be done for all these locales, before 7.0 is released:

    • [ ] albanian
    • [ ] arabic
    • [ ] belarusian
    • [ ] bulgarian
    • [ ] catalan
    • [ ] croatian
    • [ ] czech
    • [ ] danish
    • [ ] dutch
    • [ ] dutch_belgium
    • [ ] english_gb
    • [ ] english_us
    • [ ] estonian
    • [ ] faroese
    • [ ] filipino
    • [ ] finnish
    • [ ] french
    • [ ] french_belgium
    • [ ] french_switzerland
    • [ ] georgian
    • [ ] german
    • [ ] german_austria
    • [ ] german_switzerland
    • [ ] greek
    • [ ] hawaiian
    • [ ] hebrew
    • [ ] hungarian
    • [ ] icelandic
    • [ ] irish
    • [ ] italian
    • [ ] kurdish_sorani
    • [ ] kurdish_sorani_arabic
    • [ ] kurdish_sorani_pc
    • [ ] latvian
    • [ ] lithuanian
    • [ ] macedonian
    • [ ] maltese
    • [ ] mongolian
    • [ ] norwegian
    • [ ] persian
    • [ ] polish
    • [ ] portuguese
    • [ ] portuguese_brazil
    • [ ] romanian
    • [ ] russian
    • [ ] serbian
    • [ ] serbian_latin
    • [ ] slovak
    • [ ] slovenian
    • [ ] spanish
    • [ ] swedish
    • [ ] swahili
    • [ ] turkish
    • [ ] ukrainian
    adjustment 
    opened by danielsaidi 0
  • Add search to emoji category keyboard

    Add search to emoji category keyboard

    After adding search to Emoji, we can now implement search in EmojiCategoryKeyboard.

    However, we need to solve how the emoji keyboard should switch between the emoji keyboard and the search keyboard, and how it should route key presses to the embedded test field, which can be done with the KeyboardTextField.

    feature 
    opened by danielsaidi 0
  • Standard autocomplete engine doesn't use learned words when autocompleting

    Standard autocomplete engine doesn't use learned words when autocompleting

    Learned words are not shown as suggestions by the KeyboardKit Pro autocomplete engine? For instance, learn word "mutierte", then write "mutuwrt" - the engine doesn't suggest mutierte.

    Since this is not a confirmed bug, I've marked this as a discussion issue for now, until I've investigated.

    discussion 
    opened by danielsaidi 0
  • KeyboardKit should add context-specific keys

    KeyboardKit should add context-specific keys

    KeyboardKit should look at the text document proxy and add/remove keys based on the input type. For instance, add a @ to the alphabetic keyboard if the user should enter an e-mail address.

    feature 
    opened by danielsaidi 0
Releases(6.8.1)
  • 6.8.1(Jan 4, 2023)

  • 6.8.0(Jan 4, 2023)

    This release adds 5 new locales, which brings the number of supported locales to 60!

    To get locales like Armenian to work, this version starts to break up the layout engine in smaller parts, to make it easier to manage as the number of locales grow. The iPhone and iPad layout providers will be converted to base classes and inherited by locale-specific providers.

    Note that a bunch of StandardKeyboardLayoutProvider things are deprecated in comments only, since the library still has to use them. These will be removed in the next major update.

    ๐ŸŒ New locales

    • ๐Ÿ‡ฆ๐Ÿ‡ฒ Armenian
    • ๐Ÿณ๏ธ Cherokee
    • ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesian
    • ๐Ÿ‡ฒ๐Ÿ‡พ Malay
    • ๐Ÿ‡บ๐Ÿ‡ฟ Uzbek

    ๐Ÿ‘‘ KeyboardKit Pro

    • FullDocumentContextConfiguration now uses a longer, default delay.
    • FullDocumentContextResult now contains more information.
    • ProKeyboardLayoutProvider is a new base class for pro layout providers.
    • ProKeyboardLayoutProvider.Armenian is the first, new layout provider that uses this new architecture.
    • ProKeyboardLayoutProvider.German and all German variants now correctly replaces .return with .newLine.
    • UITextDocumentProxy fullDocumentContext has been adjusted to behave better.
    • UITextDocumentProxy fullDocumentContext will now throw an error if it's called while a read operation is in progress.

    โœจ New features

    • EnglishKeyboardLayoutProvider is a new, open class that provides English keyboard layouts.
    • InputSetProviderBased is a new protocol that is used to keep track of types that rely on an input set provider.
    • KeyboardActions has new character margin actions properties.
    • KeyboardContext has a new keyboardDictationReplacement property.
    • KKL10n has a new join case, although localiations are missing for most locales.
    • StandardInputSetProvider keyboardContext is now public.
    • StandardKeyboardLayoutProvider can now take a collection of localized layout providers.

    ๐Ÿ’ก Behavior changes

    • SystemKeyboard now applies locale as identifier to force update its rows.
    • StandardKeyboardActionHandler now ignores autocomplete suggestions when the cursor is at the beginning of a word.
    • SystemKeyboardLayoutProvider now uses the KeyboardContext keyboardDictationReplacement instead of the injected value.
    • SystemKeyboardLayoutProvider will for now set the KeyboardContext keyboardDictationReplacement, if one is provided, to not cause any old code to break.

    ๐Ÿ—‘ Deprecations

    • KeyboardLayoutProvider dictation replacement initializers and properties are deprecated.
    • StandardCalloutActionProvider providerDictionary has been renamed to localizedProviders.
    • StandardInputSetProvider providerDictionary has been renamed to localizedProviders.
    • KeyboardInputTextComponent has been renamed to KeyboardInputComponent.
    • StandardKeyboardLayoutProvider inputSetProvider is in-comment deprecated.
    • StandardKeyboardLayoutProvider iPhoneProvider is in-comment deprecated.
    • StandardKeyboardLayoutProvider iPadProvider is in-comment deprecated.
    • StandardKeyboardLayoutProvider leading and trailing margin action functions are deprecated.
    • SystemKeyboardActionButtonContent now applies a padding and minimum scale factor to text views.

    ๐Ÿ’ฅ Breaking changes

    • StandardKeyboardLayoutProvider now requires a keyboard context.
    • KeyboardAction no longer implements KeyboardRowItem.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(6.70 MB)
  • 6.7.3(Dec 23, 2022)

  • 6.7.2(Dec 22, 2022)

    โœจ New features

    • KeyboardAction has a new isSpacer property.
    • KeyboardButtonStyle has a new, static spacer style.

    ๐Ÿ’ก Behavior changes

    • SystemKeyboardButtonRowItem now always apply the new spacer button style to spacer actions.

    ๐Ÿ› Bug fixes

    • Some system keyboard character margin actions have been corrected.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(6.41 MB)
  • 6.7.1(Dec 20, 2022)

  • 6.7.0(Dec 12, 2022)

    This version adds more emoji features, such as improved unicode names and localized names.

    Localizing emojis is a major undertaking and therefore a community effort. Please see the documentation for information on how to help with localizing emojis.

    โœจ New features

    • AutocompleteToolbarStyle has a new optional height parameter.
    • CharacterProvider is a new protocol that will let us design better character-based extensions over time.
    • Emoji has new localizationKey properties that are used to translate emoji names.
    • Emoji has new localizedName(for:) functions that are used to translate emoji names.
    • Emoji has new unicodeNameOverride properties, to provide good names and localization keys for the various flags.
    • Emoji has new matches functions, that lets you match on emoji unicode and localized names.
    • Emoji collections have new matching functions, that lets you search for emojis that match a certain search query.
    • EmojiCharacterAnalyzer is a new protocol that is implemented by Character.
    • EmojiStringAnalyzer is a new protocol that is implemented by String.
    • KeyboardInputViewController now only syncs proxy if it changes, which leads to fewer redraws.
    • KeyboardRootView no longer defines an explicit id.
    • KKL10n has a new searchEmoji key that must be localized in all Localizable.strings files.
    • KKL10n can now be used to translate custom keys as well, using the same bundle resolve.
    • LocaleContextMenu is a new view modifier for applying a locale context menu to any view.
    • PrefersAutocompleteResolver is a new protocol that is implemented by KeyboardType and UIKeyboardType.
    • StringProvider is a new protocol that will let us design better string-based extensions over time.

    ๐Ÿ’ก Behavior changes

    • AutocompleteToolbar now applies the height from its style.
    • Emoji has better unicode names for all flag emojis.
    • EmojiCategoryTitle doesn't have a default padding anymore.
    • KeyboardRootView no longer applies an explicit id.
    • The demo keyboards use the autocomplete prefered info to adjust the toolbar's opacity.

    ๐Ÿ› Bug fixes

    • By no longer applying an explicit id to KeyboardRootView, the keyboard view no longer has to observe the KeyboardContext.
    • By no longer applying an explicit id to KeyboardRootView, the full document context correctly updates the view after the async operation completes.

    ๐Ÿ—‘ Deprecations

    • KKL10n hasText is deprecated, since it produces incorrect results.
    • InputSetProvider row functions are deprecated.
    • InputSetRow initializers with implic names are deprecated.
    • View+localeContextMenu with locales parameter is deprecated.

    ๐Ÿ’ฅ Breaking changes

    • EmojiCategoryKeyboard no longer allows customizing the keyboard view.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(6.39 MB)
  • 6.6.0(Nov 26, 2022)

    This version adds a brand new gesture engine, which aims to make typing feel a lot more like in the native keyboards.

    This version also adds new emoji capabilities, such as a unicode id and name, as well as support for skin tone variants (Pro feature). These new capabilities are used by the emoji keyboards, which can now show input callouts and skin tone variants when you type on an emoji keyboard.

    How to disable the new gesture engine

    Since typing is such an important part of this library, the new gesture engine can be toggled off if you find problems with it:

    FeatureToggle.shared.toggleFeature(.newButtonGestureEngine, .off)
    

    Note that the new gesture engine is only available in iOS 14+. Devices running iOS 13 will still get the current gesture engine, even if you toggle on this feature.

    ๐Ÿ‘‘ KeyboardKit Pro

    • Emoji implements the new ProEmojiInfo protocol.
    • ProCalloutActionProvider now returns skin tone variant actions for emojis.
    • ProEmojiInfo is a new protocol for Pro emoji information.
    • ProEmojiInfo has hasSkinToneVariants, neutralSkinToneVariant, skinToneVariants and skinToneVariantsActions properties.

    โœจ New features

    • ActionCalloutContext.shared is now public.
    • Emoji has new unicodeIdentifier and unicodeName properties.
    • EmojiKeyboard and EmojiCategoryKeyboard now supports keyboard gestures and skin tone callouts.
    • EmojiKeyboard has a new applyGestures parameter, that you can set to true to apply standard keyboard gestures.
    • EmojiKeyboard has a new standardKeyboardActionHandler property.
    • EmojiKeyboardItem is a new view for rendering a keyboard item view.
    • GestureButton is a new view that lets you handle many different gestures with a single button.
    • InputCalloutContext.shared is now public.
    • InputCalloutContext has a new, configurable minimumVisibleDuration property that controls the minimum visibility of the input callout.
    • KeyboardAction has a new image property.
    • KeyboardAction has a new isEmojiAction property.
    • SpaceCursorDragGestureHandler is now open to inheritance.

    ๐Ÿ’ก Behavior changes

    • EmojiKeyboard uses smaller emojis for standard iPad in portrait.
    • InputCallout no longer allows hit testing.
    • KeyboardAction.backspace now triggers on press instead of tap.
    • KeyboardGestures now has private state to avoid press gesture problems when providing a constant binding.
    • SystemKeyboardButtonRowItem now avoids applying a negative width.
    • View+KeyboardGestures now render a plain button that triggers the press, release and tap action on tvOS.

    ๐Ÿ› Bug fixes

    • KeyboardGestures now use internal state to avoid problems when passing in a constant binding.
    • LocaleProvider now wraps Swift 5.7 code in a compile version version check.
    • SystemKeyboardButtonRowItem now protects itself against getting a negative width.
    • Words with an autocompleting autocomplete suggestion will no longer autocomplete when ending a space cursor drag on them.

    ๐Ÿ—‘ Deprecations

    • KeyboardAction .isShift has been renamed to isShiftAction.
    • KeyboardAction .isUppercaseShift has been renamed to isUppercasedShiftAction.
    • KeyboardImageButton has been deprecated and will be removed in KeyboardKit 7.
    • SystemAudio types have been renamed to AudioFeedback to make the concept match haptic feedback types.
    • SystemAudio play has been renamed to trigger to make it match the haptic feedback trigger.
    • SystemAudioPlayer types have been renamed to SystemAudioEngine to make the concept match other feedback engines.
    • View+KeyboardGestures no longer need a keyboard context.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(4.74 MB)
  • 6.5.2(Nov 23, 2022)

  • 6.5.1(Nov 16, 2022)

  • 6.5.0(Nov 2, 2022)

    This version adjusts the KeyboardKit Pro license model.

    There are some minor breaking changes in KeyboardKit Pro that should be straightforward to fix.

    ๐Ÿ‘‘ KeyboardKit Pro

    • License contains new information and capabilities, to enable future license features.
    • ProInputSetProvider now nests all pro input set providers for a cleaer api.
    • ProCalloutActionProvider now nests all pro callout action providers for a cleaer api.

    โœจ New features

    • KeyboardLocale implements the new LocaleProvider and LocaleFlagProvider protocols.
    • Locale implements the new LocaleProvider and LocaleFlagProvider protocols.
    • LocaleProvider is a new protocol that defines how to resolve locales.
    • LocaleFlagProvider is a new protocol that defines how to resolve flags for a locale.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(4.42 MB)
  • 6.4.4(Oct 8, 2022)

    ๐Ÿ‘‘ KeyboardKit Pro

    • The UITextDocumentProxy full text content extensions have been tweaked to perform better.
    • There is an alternate build for Xcode 13 and Bitcode that can be fetched from the 6.4.4_bitcode tag.

    ๐Ÿ’ก Behavior changes

    • KeyboardLocale.kurdish_sorani_arabic uses ckb_IQ instead of ckb_AR to get a valid locale identifier.
    • View+LocaleContextMenu now iterates over the locales without enumerating.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(4.31 MB)
    KeyboardKitPro_xcode13.zip(9.71 MB)
  • 6.4.3(Oct 5, 2022)

  • 6.4.2(Oct 4, 2022)

    This release rolls back the localized name adjustment in the last version, since the only locale that used this approach - Kurdish Sorani Arabic - had a language folder named ckb_AR which wasn't recognized by Apple.

    This caused uploads to App Store generate warnings. Rolling back this change will make uploads work again, without warnings.

    If you want to customize the display name for a keyboard locale, you have to do so manually in your app.

    ๐Ÿ’ก Behavior changes

    • KeyboardLocale now only resolves localizedName from its ID, as it did before 6.4.1.
    • The new KKL10n localizedName property has been rolled back.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(4.31 MB)
  • 6.4.1(Oct 4, 2022)

    This release adds a new localized strings and new document proxy extensions.

    ๐Ÿ‘‘ KeyboardKit Pro

    UITextDocumentProxy has a new fullDocumentContext() extension that gets all the text from the proxy, not just the closest one. UITextDocumentProxy has a new fullDocumentContextBeforeInput() extension that gets all the text before the input cursor. UITextDocumentProxy has a new fullDocumentContextAfterInput() extension that gets all the text after the input cursor.

    โœจ New features

    KeyboardLocale now supports defining a localized string to override its localized name.

    ๐Ÿ’ก Behavior changes

    KeyboardLocale now uses localizedName from its localized strings, if any. KeyboardLocale.kurdish_sorani_arabic has a new localized name and adjusted keyboard layouts.

    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro_updated.zip(4.32 MB)
  • 6.4.0(Oct 1, 2022)

    This release bumps the package Swift version to 5.6.

    The release makes more types, extensions, mocks and unit tests available for macOS, tvOS and watchOS. It also binds a bunch of extensions to protocols, which make them show up in DocC and makes it possible to use them on more types.

    There are also new layout utilities that make adjusting keyboard locales a lot easier, and a bunch of struct properties have been converted from let to var to make them mutable.

    The demos have been adjusted as well, and there is a brand new demo keyboard that shows how to customize the layout.

    ๐Ÿ‘‘ KeyboardKit Pro changes

    • KurdishSoraniPcInputSetProvider is a new input set provider for Kurdish Sorani PC.
    • KurdishSoraniPcCalloutActionProvider is a new callout action provider for Kurdish Sorani PC.
    • AlphabeticInputSet has new kurdishSoraniPc input set builder.

    ๐ŸŒ New locales

    • ๐Ÿ‡น๐Ÿ‡ฏ Kurdish Sorani PC

    โœจ New features

    • CaseAdjustable is a new protocol that can be implemented by types that should be able to adjust themselves to a casing.
    • EmojiKeyboardStyle now lets you provide a device type in the standard style builder.
    • HapticFeedback now uses HapticFeedbackPlayer for its player.
    • InputCallout now lets you provide a device type in the initializer.
    • InputSet properties are now mutable.
    • InputSetItem properties are now mutable.
    • KeyboardColorReader is a new protocol that is implemented by Color and lets its implementations access keyboard colors.
    • KeyboardContext has a new keyboardType property.
    • KeyboardContext no longer requires a controller in the initializer, although it's good to provide one.
    • KeyboardFeedbackHandler is now available on all platforms.
    • KeyboardImageReader is a new protocol that is implemented by Image and lets its implementations access keyboard images.
    • KeyboardLayout has new ideal height and inset properties, which can be used to create new item types easier.
    • KeyboardLayoutConfiguration properties are now mutable.
    • KeyboardLayoutConfiguration has a new standard layout for device type.
    • KeyboardLayoutItem properties are now mutable.
    • KeyboardLayoutItemSize properties are now mutable.
    • KeyboardRowItem has a bunch of new collection extensions.
    • StandardAutocompleteSuggestion properties are now mutable.
    • StandardKeyboardFeedbackHandler is now available on all platforms.
    • SystemAudio now uses SystemAudioPlayer for its player.

    ๐Ÿ’ก Behavior changes

    • Color extensions have been moved to KeyboardColorReader.
    • KeyboardContext activeAppBundleId has been converted to a calculated property.
    • StandardKeyboardLayoutProvider now fallbacks to iPhone layout instead of an empty layout.
    • StandardKeyboardLayoutProviderTests now runs on all platforms.
    • String casing extensions have been moved to CaseAdjustable.

    ๐Ÿ› Bug fixes

    • A memory leak has been fixed.

    ๐Ÿ—‘ Deprecations

    • The Color.DarkAppearanceStrategy is no longer used and has been deprecated.
    • The KeyboardContext device initializer and property has been deprecated.
    • The KeyboardContext activeAppBundleId no longer works in iOS 16 and has been deprecated.
    • The KeyboardLayoutConfiguration standard configuration for idiom has been deprecated.
    • The KeyboardInputViewController activeAppBundleId no longer works in iOS 16 and has been deprecated.
    • The MockCollectionViewLayout is no longer used and has been deprecated.
    • Two Sequence extensions for mapping casing are no longer used and have been deprecated.
    • The StandardKeyboardLayoutProvider fallbackProvider has been deprecated.
    • The StandardKeyboardLayoutProvider layoutProvider(for:) has been renamed to keyboardLayoutProvider(for:).
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(4.29 MB)
  • 6.3.0(Sep 1, 2022)

    This release adds two new locales and a bunch of input set changes.

    ๐Ÿ‘‘ KeyboardKit Pro changes

    • AlphabeticInputSet has new qwertz and azerty input set builders.
    • AlphabeticInputSet, NumericInputSet and SymbolicInputSet has input set builders for all keyboard locales.
    • InputSetProviders that support QWERTY, QWERTZ and AZERTY now lets you inject a custom alphabetic input set.
    • KurdishSoraniArabicInputSetProvider has been tweaked to render a more correct layout.
    • StandardInputSetProvider now handles lexicon-based completions differently and ignores single-char suggestions.

    โœจ New features

    • KeyboardContext has new hasKeyboardLocale and hasKeyboardLocale functions.
    • AlphabeticInputSet has a new qwerty input set builder.
    • NumericInputSet has a new standard input set builder.
    • SymbolicInputSet has a new standard input set builder.

    ๐ŸŒ New locales

    • ๐Ÿ‡บ๐Ÿ‡ธ Hawaiian
    • ๐Ÿ‡ฐ๐Ÿ‡ช Swahili

    ๐Ÿ—‘ Deprecations

    • A bunch of SystemKeyboardLayoutProvider layout util functions have been deprecated.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(9.48 MB)
  • 6.2.0(Aug 26, 2022)

    This release adds a bunch of new emojis that have been added since emojis were last updated.

    It also adds input set variants, such as .englishQwerty, .englishAzerty, .englishQwertz etc. and introduces AlphabeticInputSet, NumericInputSet and SymbolicInputSet builders for all locales.

    โœจ New Features

    • EmojiCategory has a bunch of new emojis.

    • EnglishInputSetProvider now supports specifying an alphabetic input set.

    • InputSetRow has new convenience initializers.

    • KeyboardContext has a new KeyboardLocale-based setLocale().

    • AlphabeticInputSet, NumericInputSet and SymbolicInputSet has new set builders for .english.

    • AlphabeticInputSet also has new .englishQwerty, .englishAzerty, .englishQwertz input sets.

    ๐Ÿ—‘ Deprecations

    • DeviceSpecificInputSetProvider has been deprecated.
    • The EnglishInputSetProvider currency properties have been deprecated.
    • The InputSetProvider row extensions have been deprecated.
    • The InputSetRow initializer extensions have been deprecated.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(9.45 MB)
  • 6.1.0(Aug 21, 2022)

    โœจ New Features

    • AutocompleteContext has a new lastError property.
    • AutocompleteProvider has a new caseAdjust(suggestion:for:) extension to help handle casing.
    • Bundle+KeyboardKit adds a new .keyboardKit bundle.
    • StandardAutocompleteProvider has a new caseAdjustExactMatch init argument to let you choose whether or not to apply the case adjustment to exact matches.
    • String+Casing adds an isCapitalized property to String.

    ๐ŸŒ New locales

    • ๐Ÿ‡น๐Ÿ‡ฏ Kurdish Sorani (Arabic)

    ๐Ÿ’ก Behavior changes

    • KeyboardColor no longer needs or is affected by enabling preview mode.
    • KKL10n no longer needs or is affected by enabling preview mode.
    • StandardAutocompleteProvider in KeyboardKit Pro uses the new case adjustments to provide better completions.
    • KeyboardInputViewController will now update the autocomplete context on the main queue.
    • KeyboardInputViewController will now write any autocomplete errors to the context's lastError property.

    ๐Ÿ—‘ Deprecations

    • KeyboardPreviewMode is not longer needed and enabling it has no effect from now on.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(9.09 MB)
  • 6.0.3(Jun 27, 2022)

    This version adds more primary button types.

    โœจ New Features

    • KeyboardAction.PrimaryType has new join and custom cases.
    • KeyboardAction.PrimaryType now maps unrepresented UIReturnKeyType types to the new custom type.
    • UIReturnKeyType has new extensions for getting the keyboardAction and primaryButtonType.

    ๐Ÿ’ก Behavior changes

    • KeyboardGestures shortens the time it takes for the secondary action callout to be presented.
    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(9.02 MB)
  • 6.0.2(Jun 21, 2022)

  • 6.0.1(Jun 21, 2022)

  • 6.0.0(Feb 22, 2022)

    This version makes the library build on more platforms and removes old, deprecated code.

    ๐Ÿ“บ Platform support

    • KeyboardKit now supports iOS, iPadOS, macOS, tvOS and watchOS.

    โœจ New Features

    • ActionCalloutContext has a new, static shared property.
    • ActionCalloutContext has a new verticalOffset that can be used to move the callout up and down.
    • AudioFeedbackConfiguration is now mutable.
    • HapticFeedbackConfiguration is now mutable.
    • InputCalloutContext has a new, static shared property.
    • KeyboardInputViewController has a new didMoveToParent property, which is used to avoid calling needsInputModeSwitchKey when it generates a warning.

    ๐Ÿ’ก Behavior changes

    • Autocomplete now only applies autocorrections for pure space actions and not character actions with a single space.
    • ActionCallout uses the new ActionCalloutContext verticalOffset to offset the callout bubble.
    • ActionCalloutContext applies a vertical offset to iPad devices, and adjust the demo toolbar to be 50 on iPad as well.
    • StandardKeyboardBehavior now has a 0.5 double tap threshold instead of 0.2, and also handles caps lock better.
    • StandardKeyboardFeedbackHandler now triggers the haptic feedback for long press on space, not the SpaceCursorDragGestureHandler.
    • SystemKeyboard initializers now use nil as default value for the controller and width, to avoid Swift errors in binary framework builds.

    ๐Ÿ› Bug fixes

    • UITextDocumentProxy isCursorAtNewSentenceWithSpace has been adjusted to handle non-empty space content.

    ๐Ÿ’ฅ Breaking changes

    • All previously deprecated code has been removed.

    • ActionCalloutContext verticalOffset has been moved to ActionCalloutStyle.

    • Bundle isExtension has been made internal.

    • Color.standardButtonBackgroundColor(for:) has been renamed to standardButtonBackground(for:).

    • Color.standardButtonForegroundColor(for:) has been renamed to standardButtonForeground(for:).

    • Color.standardButtonShadowColor(for:) has been renamed to standardButtonShadow(for:).

    • Color.standardDarkButtonBackgroundColor(for:) has been renamed to standardDarkButtonBackground(for:).

    • Color.standardDarkButtonForegroundColor(for:) has been renamed to standardDarkButtonForeground(for:).

    • KeyboardAction isKeyboardType has been removed.

    • KeyboardAction isSpace has been removed.

    • KeyboardAction standardTextDocumentProxyInputAction has been merged with standardTextDocumentProxyAction.

    • KeyboardAppearance systemKeyboardButtonStyle(for:) has been renamed to buttonStyle(for:).

    • KeyboardFeedbackHandler no longer has any action provider-based logic and no typealiases.

    • KeyboardInputViewController needsInputModeSwitchKeyOverride has been removed.

    • StandardKeyboardActionHandler GestureAction has been removed.

    • StandardKeyboardFeedbackHandler triggerFeedbackForLongPressOnSpaceDragGesture has been removed.

    • StandardKeyboardFeedbackHandler shouldTriggerFeedback has been moved to StandardKeyboardActionHandler.

    • SystemKeyboardButtonStyle has been renamed to KeyboardButtonStyle.

    • SystemKeyboardButtonBorderStyle has been renamed to KeyboardButtonBorderStyle.

    • SystemKeyboardButtonShadowStyle has been renamed to KeyboardButtonShadowStyle.

    Source code(tar.gz)
    Source code(zip)
    KeyboardKitPro.zip(9.37 MB)
  • 5.9.4(Feb 16, 2022)

    This version adjust orientation change handling further.

    ๐Ÿ’ก Behavior changes

    • KeyboardInputViewController now wraps the context sync in a DispatchQueue.main.async block. This seems to improve the behavior quite a bit.
    Source code(tar.gz)
    Source code(zip)
  • 5.9.3(Feb 16, 2022)

    This version adjust orientation change handling further.

    ๐Ÿ’ก Behavior changes

    • KeyboardInputViewController re-adds sync for layout change, but only once after viewDidLayoutSubviews if orientation changes.
    Source code(tar.gz)
    Source code(zip)
  • 5.9.2(Feb 13, 2022)

    This version polishes the action callout on iPad further and fixes a layout bug.

    โœจ New Features

    • ActionCalloutContext has a new verticalOffset property.

    ๐Ÿ’ก Behavior changes

    • ActionCallout is now pushed down a bit on iPad devices.
    • KeyboardInputViewController no longer syncs context on viewWillLayoutSubviews.

    ๐Ÿ› Bug fixes

    • KeyboardInputViewController could get stuck in a loop due to syncing context in viewWillLayoutSubviews.
    Source code(tar.gz)
    Source code(zip)
  • 5.9.1(Jan 29, 2022)

    This version polishes the action callout on iPad and makes the core library build on macOS.

    ๐Ÿ“บ Platform support

    • This version makes the core library build on macOS. KeyboardKit Pro will add macOS support in 6.0.

    โœจ New Features

    • ActionCalloutStyle has a new maxButtonSize property.

    ๐Ÿ’ก Behavior changes

    • ActionCallout now renders differently on iPad devices.
    • ActionCalloutContext now requires a little less swiping to change action.
    Source code(tar.gz)
    Source code(zip)
  • 5.9.0(Jan 23, 2022)

    This version adds new locales and makes the library build on more platforms.

    ๐Ÿ“บ Platform support

    • This version makes the library build on tvOS and watchOS.

    ๐ŸŒ New locales

    • ๐Ÿ‡ง๐Ÿ‡ฌ Bulgarian
    • ๐Ÿ‡ฆ๐Ÿ‡ฉ Catalan
    • ๐Ÿ‡ซ๐Ÿ‡ด Faroese
    • ๐Ÿ‡ต๐Ÿ‡ญ Filipino
    • ๐Ÿ‡ฌ๐Ÿ‡ช Georgian
    • ๐Ÿ‡ฒ๐Ÿ‡ฐ Macedonian
    • ๐Ÿ‡ฒ๐Ÿ‡น Maltese
    • ๐Ÿ‡ฒ๐Ÿ‡ณ Mongolian
    • ๐Ÿ‡ท๐Ÿ‡ธ Serbian
    • ๐Ÿ‡ท๐Ÿ‡ธ Serbian (Latin)
    • ๐Ÿ‡ธ๐Ÿ‡ฐ Slovak

    โœจ New features

    • DeviceSpecificInputSetProvider has new row functions.
    • DeviceType is a new enum that can be used to determine device type without having to use the real platform-specific device type.
    • DisabledHapticFeedbackPlayer is a new feedback player that is used on tvOS and watchOS.
    • InputSetProvider has new row functions.
    • StandardHapticFeedbackPlayer is now open to subclassing.
    • StandardKeyboardLayoutProvider has a new fallbackProvider that is used when device is not iPhone or iPad.
    • StandardSystemAudioPlayer is now open to subclassing.
    • StaticKeyboardBehavior is a new behavior type that is used on watchOS.

    ๐Ÿ’ก Behavior changes

    • DeviceSpecificInputSetProvider no longer requires a UIDevice.
    • EnglishInputSetProvider no longer requires UIKit.
    • The iPhone and iPad keyboard layout provides have been adjusted to provide better layouts.

    ๐Ÿ› Bug fixes

    • Some iPad incorrect layouts have been adjusted.

    ๐Ÿ—‘ Deprecations

    • SystemAudioPlayer playSystemAudio has been renamed to play.
    • All input set providers have the UIDevice-based initializer replaced by a device-agnostic one.
    Source code(tar.gz)
    Source code(zip)
  • 5.8.1(Jan 17, 2022)

    This version adds tap behavior to the margin next to character inputs.

    โœจ New features

    • KeyboardAction has a new characterMargin action.

    ๐Ÿ’ก Behavior changes

    • iPadKeyboardLayoutProvider and iPhoneKeyboardLayoutProvider now only adjust input sets with three rows.
    • iPhoneKeyboardLayoutProvider will now add characterMargin to the empty surrounding space around a character key.

    ๐Ÿ—‘ Deprecations

    Despite the aim described in the release notes, this patch contains deprecations that will only affect devs who create their own system keyboard layouts.

    • SystemKeyboardLayoutProvider has new margin action functions.
    • SystemKeyboardLayoutProvider has been redesigned to let all functions that take multiple parameters with an initial context, place the context parameter last. This gives a cleaner and more harmonized public api.
    • SystemKeyboardLayoutProvider inputs(for:) has been renamed to inputRows(for:).
    Source code(tar.gz)
    Source code(zip)
  • 5.8.0(Jan 14, 2022)

    This version adds new locales and renames a bunch of types, properties and parameters to make things nicer in preparation for 6.0.

    This version also harmonizes KeyboardLocale naming to put the language first and the optional country second. This means that the new Belgian locales are called french_belgium and dutch_belgium and brazilian has been renamed to portuguese_brazil.

    ๐ŸŒ New locales

    • ๐Ÿ‡ญ๐Ÿ‡ท Croatian
    • ๐Ÿ‡ง๐Ÿ‡ช Dutch (Belgium)
    • ๐Ÿ‡ง๐Ÿ‡ช French (Belgium)
    • ๐Ÿ‡จ๐Ÿ‡ญ French (Switzerland)
    • ๐Ÿ‡ฆ๐Ÿ‡น German (Austria)
    • ๐Ÿ‡จ๐Ÿ‡ญ German (Switzerland)
    • ๐Ÿ‡ฌ๐Ÿ‡ท Greek
    • ๐Ÿ‡ญ๐Ÿ‡บ Hungarian
    • ๐Ÿ‡ธ๐Ÿ‡ฎ Slovenian

    โœจ New features

    • SystemKeyboard has a new, static standardButtonContent function.
    • SystemKeyboard has a new, static standardButtonView function.

    ๐Ÿ’ก Behavior changes

    • SystemKeyboard now explicitly applies a leftToRight layout direction.

    ๐Ÿ—‘ Deprecations

    • AlphabeticKeyboardInputSet has been renamed to AlphabeticInputSet
    • BaseSecondaryCalloutActionProvider has been renamed to BaseCalloutActionProvider.
    • CalloutActionProvider secondaryCalloutActions has been renamed to calloutActions.
    • DisabledSecondaryCalloutActionProvider has been renamed to DisabledCalloutActionProvider.
    • EnglishKeyboardInputSetProvider has been renamed to EnglishInputSetProvider.
    • EnglishSecondaryCalloutActionProvider has been renamed to EnglishCalloutActionProvider.
    • KeyboardInput has been renamed to InputSetItem.
    • KeyboardInputRow has been renamed to InputSetRow.
    • KeyboardInputRows has been renamed to InputSetRows.
    • KeyboardInputSet has been renamed to InputSet.
    • KeyboardInputSetProvider has been renamed to InputSetProvider.
    • KeyboardInputViewController keyboardInputCalloutContext has been renamed to inputCalloutContext.
    • KeyboardInputViewController keyboardSecondaryInputCalloutContext has been renamed to actionCalloutContext.
    • KeyboardInputViewController keyboardSecondaryCalloutActionProvider has been renamed to calloutActionContext.
    • KeyboardLocale .brazilian has been renamed to .portuguese_brazil.
    • LocalizedSecondaryCalloutActionProvider has been renamed to LocalizedCalloutActionProvider.
    • NumericKeyboardInputSet has been renamed to NumericInputSet
    • PreviewKeyboardInputSetProvider has been renamed to PreviewInputSetProvider.
    • PreviewSecondaryCalloutActionProvider has been renamed to PreviewCalloutActionProvider.
    • RowItem has been renamed to KeyboardRowItem.
    • SecondaryCalloutActionProvider has been renamed to CalloutActionProvider.
    • SecondaryInputCalloutContext has been renamed to ActionCalloutContext.
    • SecondaryInputCalloutStyle has been renamed to ActionCalloutStyle
    • StandardKeyboardInputSetProvider has been renamed to StandardInputSetProvider.
    • StandardSecondaryCalloutActionProvider has been renamed to StandardCalloutActionProvider.
    • String isVowel is deprecated and will be removed in 6.0.
    • SymbolicKeyboardInputSet has been renamed to SymbolicInputSet
    • SystemKeyboard has renamed buttonViewBuilder to buttonView and buttonContentBuilder to buttonContent.
    • View+secondaryInputCallout has been renamed to actionCallout

    ๐Ÿ’ฅ Breaking changes

    Even though most renamed functions have deprecated variants, open functions that can be overridden will have to be renamed if you have overridden them.

    Source code(tar.gz)
    Source code(zip)
  • 5.7.0(Jan 8, 2022)

    This version adds new locales and improves emoji support.

    There are some breaking changes, but they shouldn't affect you if you haven't been customizing emoji keyboards.

    ๐ŸŒ New locales

    • ๐Ÿ‡ง๐Ÿ‡พ Belarusian
    • ๐Ÿ‡จ๐Ÿ‡ฟ Czech
    • ๐Ÿ‡ท๐Ÿ‡ด Romanian

    โœจ New features

    • Character has new emoji properties: isEmoji, isCombinedEmoji, isSimpleEmoji.
    • EmojiKeyboardStyle has renamed and reorganized its parameters.
    • EmojiKeyboardStyle has a new verticalKeyboardPadding property.
    • EmojiKeyboardStyle.standardLargePadLandscape is now mutable.
    • EmojiKeyboardStyle.standardLargePadPortrait is now mutable.
    • EmojiKeyboardStyle.standardPadLandscape is now mutable.
    • EmojiKeyboardStyle.standardPadPortrait is now mutable.
    • EmojiKeyboardStyle.standardPhoneLandscape is now mutable.
    • EmojiKeyboardStyle.standardPhonePortrait is now mutable.
    • String has new emoji properties: containsEmoji, containsOnlyEmojis, emojis, emojiScalars, emojiString, isSingleEmoji.

    ๐Ÿ’ก Behavior changes

    • EmojiCategoryStyle is adjusted to be more correct on iPad devices.
    • EmojiCategoryKeyboard.CategoryTitleViewProvider now takes a style.
    • EmojiCategoryKeyboardTitle now takes a style, but will default to .standardPhonePortrait.
    • KeyboardAction.shift now uses a lighter color scheme for uppercase.
    • String.wordDelimiters has been extended with various brackets.
    • SystemKeyboard now only uppercases for sentence autocapitalization after tapping a space after the sentence delimiter.

    ๐Ÿ› Bug fixes

    • EmojiCategory now adds accidentally excluded ๐Ÿ˜ตโ€๐Ÿ’ซ emoji.

    ๐Ÿ—‘ Deprecations

    • A bunch of SystemKeyboardLayoutProvider hasXXXAlphabeticInput properties have been deprecated.

    ๐Ÿ’ฅ Breaking changes

    • EmojiKeyboardButton has renamed configuration to style.
    • EmojiKeyboardStyle has renamed and reorganized its parameters. There is no deprecations, since the initializer has standard values for each parameter, which cause conflicts.
    Source code(tar.gz)
    Source code(zip)
Owner
KeyboardKit
KeyboardKit can be used to create custom keyboards for iOS and iPadOS
KeyboardKit
KeyboardMan helps you to make keyboard animation.

KeyboardMan We may need keyboard infomation from keyboard notifications to do animation. However, the approach is complicated and easy to make mistake

null 353 Apr 19, 2022
A Chinese keyboard for iOS that helps Chinese language learners remember tones.

ToneBoard ToneBoard is a Chinese keyboard for iOS that requires you to enter the correct tones while typing simplified Chinese with Pinyin. It is avai

Kevin Bell 7 Sep 27, 2022
Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more.

IQKeyboardManager While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the UITextField/UITextView. IQKey

Mohd Iftekhar Qurashi 15.9k Jan 8, 2023
Objective-C library for tracking keyboard in iOS apps.

NgKeyboardTracker Objective-c library for tracking keyboard in iOS apps. Adding to your project If you are using CocoaPods, add to your Podfile: pod '

Meiwin Fu 808 Nov 17, 2022
Scribe-iOS is a pack of iOS and iPadOS keyboards for language learners

Scribe-iOS is a pack of iOS and iPadOS keyboards for language learners. Features include translation (beta), verb conjugation and word annotation that give users the tools needed to communicate with confidence.

Scribe 47 Jan 4, 2023
Awesome autolayout Toolbar. Toolbar is a library for iOS. You can easily create chat InputBar.

Toolbar This toolbar is made with Autolayout. It works more interactively than UIToolbar. Please Donate Slow Animations Debug mode If you want a Toolb

1amageek 459 Sep 16, 2022
Prevent keyboard from covering UITextField/UITextView, includes Swift and Objective-C APIs

Prevent keyboard from covering UITextField/UITextView with only one line of code, includes Swift and Objective-C APIs.

LiuChang 8 Oct 24, 2022
Codeless manager to hide keyboard by tapping on views for iOS written in Swift

KeyboardHideManager KeyboardHideManager - codeless manager to hide keyboard by tapping on views for iOS written in Swift. Structure Features Requireme

Bondar Yaroslav 55 Oct 19, 2022
Swift UIKit keyboard manager for iOS apps.

Typist Typist is a small, drop-in Swift UIKit keyboard manager for iOS apps. It helps you manage keyboard's screen presence and behavior without notif

Toto Tvalavadze 1.1k Dec 10, 2022
Best way to dismiss Keyboard in a View Controller iOS (Swift)

Best way to dismiss Keyboard in a View Controller iOS (Swift) First way: Implement UITextFieldDelegateโ€™s textFieldShouldReturn method and dismiss curr

null 0 Dec 18, 2021
Slidden is an open source, customizable, iOS 8 keyboard, written in Swift

Slidden is an open source, customizable, iOS 8 keyboard, written in Swift. iOS 8 brought us the ability to create fully customizable keyboards, but do

Daniel Brim 595 Jan 5, 2023
A simple keyboard to use with numbers and, optionally, a decimal point.

MMNumberKeyboard A simple keyboard to use with numbers and, optionally, a decimal point. Installation From CocoaPods CocoaPods is a dependency manager

Matรญas Martรญnez 957 Nov 17, 2022
โŒจ๏ธA Combine-based way to observe and adjust for Keyboard notifications in SwiftUI

โŒจ๏ธ Keyboard Observing A Combine-based solution for observing and avoiding the keyboard in SwiftUI. Table of Contents About Requirements Installation C

Nick Fox 440 Jan 5, 2023
A drop-in universal solution for moving text fields out of the way of the keyboard in iOS

TPKeyboardAvoiding A drop-in universal solution for moving text fields out of the way of the keyboard in iOS. Introduction There are a hundred and one

Michael Tyson 5.8k Dec 26, 2022
Emoji Keyboard SDK (iOS)

Makemoji SDK Makemoji is a free emoji keyboard for mobile apps. By installing our keyboard SDK every user of your app will instantly have access to ne

Makemoji 100 Nov 3, 2022
SwiftyKeyboard: a full customized numeric keyboard for iOS

SwiftyKeyboard Overview SwiftyKeyboard is an iOS customized enhanced keyboard. T

SwiftyKit 2 Jun 30, 2022
Emoji Keyboard for iOS

English | ไธญๆ–‡ An easy to use Emoji keyboard for iOS. Has been rewritten with swift, the old Objective-C version on branch oc. Features Written in Swift

isaced 450 Dec 24, 2022
Interactive Keyboard Controller for Swift

Keynode Why Using UIScrollViewKeyboardDismissMode added in iOS7, interactive keyboard operation became possible. But, it only works on UIScrollView. K

Kyohei Ito 76 Sep 1, 2020
IHKeyboardAvoiding is an elegant solution for keeping any UIView visible when the keyboard is being shown - no UIScrollView required!

IHKeyboardAvoiding An elegant solution for keeping any UIView visible when the keyboard is being shown Requirements IHKeyboardAvoiding Version Objecti

Idle Hands Apps 1.4k Dec 14, 2022