KeyboardKit tries to honor semantic versioning:
- Only deprecate code in
minor
versions. - Only remove deprecated code in
major
versions. - Avoid introducing breaking changes in
minor
versions.
Breaking changes can still occur in minor versions and patches, though, if the alternative is to not be able to release new critical features or fixes.
-
CGSize
device dimension properties are now public: -
KeyboardFeedbackSettings
has new properties and functions:isAudio/HapticFeedbackEnabled
disableAudio/HapticFeedback()
enableAudio/HapticFeedback()
toggleAudio/HapticFeedback()
-
String
has newvowels
andisVowel
extenstion properties.
This version adds support for russian
and ukrainian
.
This version also bumps the package's Swift version to 5.5 to enable extended DocC support.
- 🇷🇺 Russian
- 🇺🇦 Ukrainian
- This version corrects the system button highlight color in dark mode.
This version adds support for estonian
, latvian
and lithuanian
.
This version also adds new inspection capabilities and fixes some bugs.
- 🇪🇪 Estonian
- 🇱🇻 Latvian
- 🇱🇹 Lithuanian
UITextDocumentProxy
has a newhasCurrentWord
property.InputCallout
has a newcalloutPadding
property.KeyboardEnabledState
has a newisKeyboardCurrentlyActive
property.KeyboardEnabledStateInspector
has a newisFullAccessEnabled
property.KeyboardEnabledStateInspector
has a newisKeyboardCurrentlyActive
function.
InputCallout
now calculates a minimum callout width based on button size, curve size etc.InputCallout
now applies a minimum callout size instead of a fixed one, which means that the callout content can be larger.
InputCallout
was rendered too wide by default, when used inSystemKeyboard
. This has been fixed.SecondaryInputCallout
applied an incorrect leading corner radius. This has been fixed.
KeyboardKit 5.0 streamlines the library, improves styling and previewing and makes the library easier to use.
This version also removes all UIKit-specific functionality as well as all previously deprecated functionality.
This version also adjust keyboard button sizes to be more correct on more device types, e.g. iPhone Pro Max, iPad Pro etc.
KeyboardKit 5.0 requires Xcode 13 and Swift 5.5.
-
Library types now implement protocols like
Codable
andIdentifiable
to greater extent. -
Library views have a lot more previews than before, which make them much easier to adjust.
-
Library views no longer depend on environment objects, which make them easier to create and use.
-
AudioFeedbackConfiguration
has a new action-specific feedback list. -
AudioFeedbackConfiguration
has a new, staticenabled
configuration. -
AutocompleteContext
has a newisLoading
property. -
AutocompleteToolbarItemSubtitle
is a new view that renders autocomplete subtitles. -
Collection+RowItem
has new extensions to affect all rows. -
EdgeInsets
has a newinit(all:)
initializer. -
EdgeInsets
has a newinit(horizontal:,vertical:)
initializer. -
EmojiCategory
has a newemojisString
property. -
EmojiKeyboardStyle
has newsystemFont
andselectedCategoryColor
properties. -
HapticFeedbackConfiguration
has a new action-specific feedback list. -
HapticFeedbackConfiguration
has a new, staticenabled
configuration. -
InputCalloutContext
has a new, static.disabled
context. -
KeyboardAction
has a newinputCalloutText
property. -
KeyboardAction
has a newisCharacterAction
property. -
KeyboardAppearance
has a newinputCalloutStyle()
function. -
KeyboardAppearance
has a newsecondaryInputCalloutStyle()
function. -
KeyboardContext
has a newscreen
property. -
KeyboardInputTextComponent
is now public. -
KeyboardLayoutConfiguration
is a new type that replaces theCGFloat
andUIEdgeInsets
extensions. -
KeyboardLayoutConfiguration
has a bunch of standard layout configs for different devices. -
NextKeyboardButton
is now SwiftUI-based and don't require any special setup. -
Preview
services have new, static.preview
protocol properties. -
SecondaryInputCalloutContext
has a new, static.disabled
context. -
StandardHapticFeedbackPlayer
has a newshared
player. -
StandardKeyboardFeedbackHandler
now prefers action-specific feedback, if defined. -
StandardSystemAudioPlayer
has a newshared
player. -
SystemKeyboardActionButton
is a new view that makes it easy to create action-based keyboard buttons. -
SystemKeyboardButton
is a new view that makes it easy to create standalone keyboard buttons. -
SystemKeyboardButtonText
is a new view that just sets up text correctly. -
SystemKeyboardSpaceButton
can now wrap any content. -
View+Callout
has a newcalloutShadow
extension.
AutocompleteToolbarStyle
is a new style that can style autocomplete toolbars.AutocompleteToolbarItemStyle
is a new style that can style autocomplete toolbar items.AutocompleteToolbarItemBackgroundStyle
is a new style that can style the autocomplete highlight.AutocompleteToolbarSeparatorStyle
is a new style that can style autocomplete toolbar separators.CalloutStyle
has a new, static.standard
style.InputCalloutStyle
has a new, static.standard
style.SecondaryInputCalloutStyle
has a new, static.standard
style.SystemKeyboardButtonBorderStyle
has a new, static.standard
style.SystemKeyboardButtonShadowStyle
has a new, static.standard
style.SystemKeyboardButtonShadowStyle
has new, default init parameter values.
AutocompleteToolbar
now applies the autocomplete background instead of the item view.AutocompleteToolbarItem
's standard item builder now renders a subtitle if the suggestion has one.InputCallout
andSecondaryInputCallout
look more like the native callouts.KeyboardAction+Button
now returnsKKL10n.space
for.space
action.KeyboardGestures
now resolves input contexts from the shared controller, instead of using environment objects.StandardKeyboardAppearance
uses a small transparency to make standard buttons bleed through the underlying vibrancy.SystemKeyboard
uses the new callout styles in the appearance.SystemKeyboardActionButtonContent
now returns aSystemKeyboardSpaceButtonContent
for.space
.SystemKeyboardButtonContent
now uses appearance for both text and image logic.SystemKeyboardButtonContent
no longer applies RTL transforms on the image, since SF symbols do this automatically.SystemKeyboardButtonStyle
now applies a standard shadow style by default.SystemKeyboardSpaceButtonContent
no longer auto-resolves texts, but instead show just what you provide it with.SystemKeyboardSpaceButton
now takes up as much horizontal space as it can.
InputCallout
andSecondaryInputCallout
no longer get tear lines in some apps.SystemKeyboardActionButton
now handles the.nextKeyboard
action correctly.
-
All deprecated functionality has been removed.
-
All UIKit-specific functionality has been removed.
-
Library views that no longer depend on environment objects, may require more init parameters.
-
Initializer argument changes are omitted in the list below.
-
AutocompleteProvider
ignoredWords
is now read-only. -
AutocompleteResponse
has been renamed toAutocompleteCompletion
. -
AutocompleteToolbarItemText
has been renamed toAutocompleteToolbarItemTitle
. -
AudioFeedback
has been renamed toSystemAudio
. -
BaseSecondaryCalloutActionProvider
's init is now throwing. -
CalloutStyle
buttonOverlayInset
has been renamed tobuttonInset
. -
CGFloat+Keyboard
has been replaced withKeyboardLayoutConfiguration
. -
Color
clearInteractable
has been made as internal and will be removed over time. -
EdgeInsets+Keyboard
has been replaced withKeyboardLayoutConfiguration
. -
EmojiKeyboard
button builder no longer takes a context. -
EmojiKeyboardConfiguration
has been renamed toEmojiKeyboardStyle
-
HapticFeedback
prepare
andtrigger
now only has a non-static version. -
HapticFeedback.player
has been removed. -
InputCalloutContext
buttonFrame(for:)
has been removed. -
InputCalloutContext
updateInput(for:geo:)
has been renamed toupdateInput(for:,in:)
. -
KeyboardAction+Button
styles have been moved intoStandardKeyboardAppearance
. -
KeyboardBehavior
has a newshouldSwitchToCapsLock
function. -
KeyboardCasing.neutral
has been removed. -
KeyboardEnabledStateInspector
isKeyboardEnabled
for
parameters has been renamed towithBundleId
. -
KeyboardInputSetProvider
functions have been converted to properties. -
KeyboardType.custom
has been renamed toKeyboardType.custom(named:)
. -
SecondaryInputCalloutContext
alignment
is now aHorizontalAlignment
. -
SecondaryInputCalloutContext
buttonFrame(for:)
has been removed. -
SecondaryInputCalloutContext
updateInputs(for:geo:alignment)
has been renamed toupdateInputs(for:in:alignment:)
. -
SecondaryInputCalloutStyle
selectedTextColor
has been renamed toselectedForegroundColor
. -
SecondaryInputCalloutStyle
verticalPadding
has been renamed toverticalTextPadding
. -
Sequence
batched(withBatchSize:)
has been renamed tobatched(into:)
. -
SpaceDragSensitivity.custom
has been renamed tocustom(points:)
. -
SystemAudio
systemId
has been renamed toid
. -
SystemAudio
trigger
has been renamed toplay
. -
SystemAudio
play
now only has a non-static version. -
SystemAudio.player
is nowSystemAudioPlayer.shared
. -
SystemAudioPlayer
now takesSystemAudio
as argument. -
SystemKeyboardButton
has been renamed toSystemKeyboardActionButton
. -
SystemKeyboardButtonContent
has been renamed toSystemKeyboardActionButtonContent
. -
SystemKeyboardButtonRowItem
now requires an injectedcontext
. -
SystemKeyboardLayoutProvider
hasElevenElevenSevenAlphabeticInput
is now computed instead of lazy. -
Toast
has been removed. -
UITextDocumentProxy
deleteBackward
with range has been renamed todeleteBackward(range:)
-
View+DynamicType
has been removed. -
View+Autocomplete
has been removed. -
View+Callout
is now internal. -
View+DynamicType
has been removed.
PreviewKeyboardAppearance
has been made public.
This version renames images to avoid preview problems in apps that define the same image names.
- A bunch of images have been renamed with a
keyboard
name prefix.
This version fixes the iOS 15 autorotate bug and adds a property that can suppress the needsInputModeSwitchKey
warning.
KeyboardInputViewController
has a newviewWillSetupKeyboard
function that can be overridden to setup the keyboard at the proper time. It's just a convenience function. You can still setup the keyboard whenever you want.KeyboardInputViewController
has a new, staticneedsInputModeSwitchKeyOverride
that can be set to make all input controllers ignore the real value. This can be useful when you want to create a keyboard preview and don't want all the warnings.KeyboardInputViewController
has a newneedsInputModeSwitchKeyOverride
that can be set to make an input controllers ignore the real value. It will default to the static property value.
KeyboardInputViewController
setup(with:)
stack view variant is deprecated and will be removed in 5.0.
This version adds styles, which makes it a lot easier to style system keyboards.
It also exposes more system keyboard views and styles publicly.
Starting with this version, the library will start deprecating stuff that willbe changed in KK 5. The aim is to release several patches to prepare the library for the changes to come through deprecations instead of breaking changes.
KeyboardAppearance
has a newsystemKeyboardButtonStyle
function.NextKeyboardButton
has an iOS 14 exclusiveColor
-based initializer that is now used bySystemKeyboardButtonContent
SystemKeyboardButtonBody
is a new view that represents the body of a system keyboard button.SystemKeyboardButtonShadow
is a new view that represents the shadow of a system keyboard button.SystemKeyboardButtonStyle
is a new style that can be used to define a system keyboard button style.SystemKeyboardButtonBorderStyle
is a new style that can be used to define a system keyboard button border.SystemKeyboardButtonShadowStyle
is a new style that can be used to define a system keyboard button shadow.TextInputProxy
now implementsUITextInputTraits
as well.View+systemKeyboardButtonStyle
view extension now taes a style instead of an apperance, action and isPressed bool.
- Thanks to @ardavank, the
EmojisCategoryKeyboardMenu
now uses fixed fonts. SystemKeyboardButtonContent
now applies the appearance text color to the "next keyboard" button (on iOS 14+).
AutocompleteSuggestionProvider
has been renamed toAutocompleteProvider
.KeyboardAppearance
has deprecated all functions that now can be fetched from the newsystemKeyboardButtonStyle
style.KeyboardInputViewController
autocompleteSuggestionProvider
has been renamed toautocompleteProvider
.View+keyboardButtonStyle
has been replaced withView+systemKeyboardButtonStyle
.
- More system keyboard views require an explicit appearance to be injected.
- The
AutocompleteSuggestionProvider
autocompleteSuggestions
is now escaping.
This versions adds new colors, such as the new standard keyboard background colors, which you can use to mimic keyboard backgrounds.
There are other new colors as well, that are used to work around the iOS color scheme bug, described here and in the docs.
This makes it possible for us to finally workaround the dark mode color bug, and let the system keyboard look as the system keyboard in both dark mode and dark appearance keyboards.
Finally, the dark appearance colors have been renamed and their old names deprecated.
KeyboardLocale
is nowCodable
.KeyboardColor
has new colors.Color+Keyboard
has new colors..standardButtonBackgroundForColorSchemeBug
is a new color scheme bug color..standardDarkButtonBackgroundForColorSchemeBug
is a new color scheme bug color.
- The standard keyboard apperance now uses the new color scheme bug colors, which should make the keyboards look more like the standard ones in dark mode and for dark appearance keyboards.
CalloutStyle.standard
now uses the look ofsystemStyle
, since that IS the standard. The system styles have been deprecated.SystemKeyboard
uses the new standard callout styles.
InputCallout
now applies the provided style's callout text color.SecondaryInputCallout
now uses the provided style's callout text color.View+Button
now applies shadows in a way that doesn't affect the button content.SystemKeyboard
now looks closer to the iOS system keyboards, in both dark mode and dark appearance.
- Color extensions for the button background colors are now suffixed with
Background
. - Color extensions for the button tints colors are now suffixed with
Foreground
instead ofTint
. - Color extensions with the name
standardDarkAppearance*
have been renamed tostandard*ForDarkAppearance
. CalloutStyle.systemStyle
,InputCalloutStyle.systemStyle
andSecondaryInputCalloutStyle.systemStyle
are deprecated.
KeyboardColor
's dark appearance cases have been renamed to keep things tight.SecondaryInputCalloutStyle
's text color property has been removed. Use the callout style's text color instead.
- Thanks to @AntoineBache,
KeyboardTextField
andKeyboardTextView
no longer resize if their text content gets to wide.
Color.darkAppearanceStrategy
is a new, temporary property that lets you inject a custom strategy that controls whether or not to apply a dark appearance color scheme to your keyboard. This lets you work around the current color scheme bug that is described inColor+Button.swift
and override the standard strategy of always applying dark apperance colors when the keyboard context'scolorScheme
is.dark
.
If you find a way to determine this correctly and to work around the system behavior, please share your findings.
This version makes KeyboardKit compile for Xcode 13.0 beta 3.
From now, all new versions of KeyboardKit will support the latest Xcode version.
CGFloat+Keyboard
andEdgeInsets+Keyboard
now uses the shared vc instead of the shared application.
SystemKeyboardButton
has a newcontentConfig
init param that allows you to modify the button content before wrapping it in a style and applying gestures.
KeyboardAction.primary
no longer applies autocomplete by default, which solves e.g. autocomplete suggestions being applied in the Safari address bar.
KeyboardTextField
andKeyboardTextView
now accepts a text binding, so that you can access the typed text.
KeyboardTextField
andKeyboardTextView
now share functionality through a new protocol.
- Thanks to @junyng, deleting backwards now works even when
documentContextBeforeInput
is nil.
KeyboardTextField
andKeyboardTextView
now requires a text binding.
This version adjusts the colors that are used for dark keyboard appearance and dark mode keyboards, to make keyboards look better in dark appearance when in light mode.
The problem is discussed here.
This fix makes the button a little brighter in dark mode, but that's a lot better than having them be a little darker in dark appearance light mode.
This version fixes a bug that caused the keyboard type to not change when typing into a TextInputProxy
text field.
This version adds features that makes it possible to add text fields and text views to the keyboard extension and automatically redirect keyboard events there instead of using the hosting app.
You can either set KeyboardInputViewController.shared.textInputProxy
directly, or use the new KeyboardTextField
and KeyboardTextView
views that does this automatically.
- There is a new
Proxy
namespace to which theUITextDocumentProxy
extensions have been moved. KeyboardInputViewController
has a newtextInputProxy
that can be set to redirect the keyboard to that proxy instead of the originaltextDocumentProxy
.KeyboardTextField
andKeyboardTextView
are two new views that can be used in keyboard extensions and that will automatically redirect keyboard events to them when they become first responder.TextInputProxy
is a new class that can be used to redirect the keyboard events to any text input.
- This version fixes a gesture bug that caused the space tap action to be triggered even after long pressing and dragging the cursor around.
KeyboardInputViewController
viewWillSyncWithTextDocumentProxy
was not used internally and has been removed. If you override this in your own keyboards, just overrideviewWillAppear
instead.
ibayramli2001
andamirshane
have fixed a crash when deleting backwards without any content in the proxy.
KeyboardCasing
has a newauto
case.
SystemKeyboardLayoutProvider
uses the newauto
case for numeric and symbolic keyboard type switches.
- This version fixes a bug that caused numeric and symbolid keyboards to always switch back to lowercased alphabetic keyboards.
BaseKeyboardLayoutProvider
has been renamed toSystemKeyboardLayoutProvider
.KeyboardCasing.neutral
is deprecated and will be removed.
StandardKeyboardActionHandler
canHandle
is nowopen
instead ofpublic
.
KeyboardGestures
now use the drag gesture to trigger tap actions instead of a tap gesture. This increases responsiveness and ensures that taps aren't cancelled when you press for too long.KeyboardGestures
now only applies a double tap gesture if a double tap action is provided.- The changes above helps reducing the number of active gestures and reduces the overall gesture complexity.
- This version fixes compile errors in Xcode 12.4.
Image.settings
has been renamed tokeyboardSettings
.Image.moveCursorLeft/Right
have been renamed tokeyboardLeft/Right
.
This version fixes a bug that caused the keyboard layout to not update.
This version fixes a bug that caused the secondary actions to not update.
This version adds new locales, external keyboard detection, dynamic type disabling and RTL locale support.
- 🇫🇷 French
- 🇪🇸 Spanish
ExternalKeyboardContext
is a new iOS 14 exclusive class that lets you observe whether or not an external keyboard is connected to the device.KeyboardAction
has a newstandardButtonFontSize
function.KeyboardType
has a new, context-basedstandardButtonImage
function that replaces the old property.KeyboardLocale
has newisLeftToRight
andisRightToLeft
properties.KeyboardType
has a newstandardButtonFontSize
function.KeyboardType
has a new, context-basedstandardButtonText
function that replaces the old property.Locale
has newcharacterDirection
andlineDirection
properties.Locale
has newisLeftToRight
,isRightToLeft
,isBottomToTop
,isTopToBottom
properties.- Thanks to @habaieba, KeyboardKit now has French localization.
- There are new localizations for the keyboard type key texts.
KeyboardAction
now flips the standard keyboard button image for RTL locales.SystemKeyboard
will now ignore dynamic type, just like the native keyboards.
- The German localized newline symbol for Return is now correctly rendered as an image.
KeyboardAction
standardButtonFont
has been renamed tostandardButtonUIFont
.KeyboardAction
standardButtonFontWeight
has been renamed tostandardButtonUIFontWeight
.KeyboardAction
standardButtonImage
has been converted to a context-based function.KeyboardType
standardButtonText
has been converted to a context-based function.UIApplication
standardButtonTextStyle
has been renamed tostandardButtonUITextStyle
.
KeyboardAction+standardButtonFont
now returns aFont
instead of aUIFont
.KeyboardAction+standardButtonFontWeight
now returns aFont.Weight
instead of aUIFont.Weight
.KeyboardAction
standardButtonImage
- the property is deprecated in favor for the context-based function.- The old properties are now called
standardButtonUIFont
andstandardButtonUIFontWeight
.
This version adds new locales as well as features that make it easier to work with layouts and collections.
In this version, you can also identify the active app ID, which makes it possible to adjust the keyboard accordingly.
There are also several tweaks and behavior changes that make system keyboards behave even more native-like.
- 🇬🇧 English U.K. (GB)
- 🇺🇸 English U.S. (same keyboard as base English but different region)
-
CGFloat
has a newstandardKeyboardButtonCornerRadius
property. -
DeleteBackwardRange
is a new enum can be used when deleting backwards. -
EnglishKeyboardInputSetProvider
has new currency init params. -
KeyboardAction.PrimaryType
has newnewLine
case, that can be used to force an arrow for primary buttons. -
KeyboardBehavior
has a newbackspaceRange
property. -
KeyboardColor
is a new enum that exposes the raw color resources. -
KeyboardContext
has a newactiveAppBundleId
property that identifies the currently active app. -
KeyboardContext
has a newscreenOrientation
property that replacesdeviceOrientation
. -
KeyboardPreviewMode
is a new (hopefully temporary) class that has a staticenable()
function that makes SwiftUI previews work. -
KeyboardInputViewController
has a newactiveAppBundleId
property that identifies the currently active app. -
RepeatGestureTimer
has been made public and can be used to inspect how long a repeat gesture has been active. -
RowItem
is a new protocol that makes it possible to gather row collection functions in one place -Collection+RowItem
. -
Collection+RowItem
has new extensions that make it easier to add and remove row items to all collections that contain the newRowItem
protocol. -
EdgeInsets+Keyboard
has new context-based extensions. -
UIInputViewController+Orientation
renamesdeviceOrientation
toscreenOrientation
. -
UITextDocumentProxy+Delete
has a new extension for deleting backwards a certain range.
-
KeyboardAction
now implementsRowItem
. -
iPadKeyboardLayoutProvider
has been adjusted layout buttons closer to native layouts. -
iPhoneKeyboardLayoutProvider
has been adjusted layout buttons closer to native layouts. -
KeyboardInput
now implementsRowItem
. -
KeyboardLayoutItem
now implementsRowItem
. -
StandardKeyboardBehavior
now only auto-switches keyboard type on.tap
. -
UITextDocumentProxy
handles new lines when checking if the cursor is at new sentence. -
Standard font sizes are adjusted to fit the native keyboards better.
-
The standard backspace range is now progressive and will increase after backspace has been pressed for a while.
KeyboardContext
deviceOrientation
has been renamed toscreenOrientation
.UIApplication
preferredKeyboardInterfaceOrientation
didn't work and will be removed.UIDeviceOrientation
interfaceOrientation
is no longer used and will be removed.UIInputViewController
deviceOrientation
has been renamed toscreenOrientation
.UIInterfaceOrientation
- the device orientation-based init is no longer used and will be removed.
KeyboardBehavior
has a newbackspaceRange
property that must be implemented.
Besides the points above, KeyboardActionHandler
had a convenience handle
function that didn't require a sender
. This caused a conflict with the StandardKeyboardActionHandler
function with the same signature. Subclassing StandardKeyboardActionHandler
and calling super.handle
thus caused a never-ending loop, since the convenience function called the sender function etc.
The sender-based functions have thus been removed. If you have a custom action handler that overrides handle
or canHandle
, you must remove the sender
parameter.
This version tweaks KeyboardGestures
to avoid delays.
This version introduces a bunch of changes to how feedback is being handled.
AudioFeedbackConfiguration
has default init param values.DragGestureHandler
is a new protocol for handling drag gestures.HapticFeedbackPlayer
is a new protocol for preparing and playing haptic feedback.KeyboardAction
has a newstandardAction(for:gesture)
function.KeyboardFeedbackHandler
is a new protocol for handling keyboard feedback.KeyboardFeedbackSettings
is a new, observable settings object.KeyboardGesture
is nowCaseIterable
.KeyboardInputViewController
has a newsetup(with:)
that takes aUIStackView
.KeyboardInputViewController
has a newkeyboardFeedbackHandler
property.KeyboardInputViewController
has a newkeyboardFeedbackSettings
property.StandardHapticFeedbackPlayer
is a standard implementation that is used by default.StandardKeyboardActionHandler
has new, cleaner initializers.StandardKeyboardActionHandler
has a newtriggerFeedback
function.StandardKeyboardActionHandler
has a newspaceDragGestureHandler
that is used to handle space drag gestures.StandardKeyboardFeedbackHandler
is a new, standard feedback handler.- There are new mocks for the new classes.
- More feedback types are now
Equatable
. - Action feedback (e.g. tap sound) is now given on
press
instead oftap
. StandardKeyboardActionHandler
uses the new feedback handler to trigger feedback.
- Audio feedback types have been moved to
Feedback
. - Haptic feedback types have been moved to
Feedback
.
AudioFeedback
systemPlayer
has been renamed toplayer
.KeyboardInputViewController
keyboardStackView
has been replaced with a newsetup(with:)
.StandardKeyboardActionHandler
has deprecated the two audio/haptic configuration-based initializers.StandardKeyboardActionHandler
audioConfiguration
is deprecated and converted to a computed property.StandardKeyboardActionHandler
hapticConfiguration
is deprecated and converted to a computed property.StandardKeyboardActionHandler
spaceDragSensitivity
is deprecated.StandardKeyboardActionHandler
handleSpaceCursorDragGesture
is deprecated.StandardKeyboardActionHandler
triggerAudioFeedback
is deprecated.StandardKeyboardActionHandler
triggerHapticFeedback
is deprecated.StandardKeyboardActionHandler
triggerHapticFeedbackForLongPressOnSpaceDragGesture
is deprecated.
This version adds support for primary actions, such as .done
, .go
, .search
etc.
BaseKeyboardLayoutProvider
has a new, openkeyboardReturnAction(for:)
function.KeyboardAction
has a newstandardTextDocumentProxyAction
.KeyboardAction
has a newstandardTextDocumentProxyInputAction
.KeyboardAction.primary
is a new action type that gathers all primary action types.KKL10n
has newtext(for:)
functions that let you translate keys for specific contexts and locales.String+sentenceDelimiters
andwordDelimiters
can now be modified, if you have specific needs.- The iPhone and iPad layout providers now replaces
return
withdone
,go
andsearch
when applicable.
- English (US) secondary actions now include actions for
$
.
- New line is now considered to be a
word
delimiter instead of asentence
delimiter. - Due to the new ways to localize content, some signatures must be changed to optional strings.
KeyboardAction
.done
,.go
,.ok
and.search
have been deprecated and replaced with the newprimary
umbrella type.
This version is all about locales and autocomplete, overall:
This version adds support for danish
, finnish
, norwegian
and dutch
.
This version also adds many new features aimed at an improved autocomplete experience.
KeyboardKit Pro 4.1 also adds more locale-specific providers as well as a real autocomplete engine.
- 🇩🇰 Danish
- 🇳🇱 Dutch
- 🇫🇮 Finnish
- 🇳🇴 Norwegian
AutocompleteSpaceState
is a new enum that is used to keep track of how aAutocompleteSuggestion
has newisAutocomplete
andisUnknown
properties.AutocompleteSuggestionProvider
has new functions for ignoring and learning words.AutocompleteToolbar
has a newitemBuilder
initializer.AutocompleteToolbarItem
is a new view that replicates a native autocomplete item.AutocompleteToolbarItemText
is a new view that replicates the text of a native autocomplete item.KeyboardAction
has a newisSpace
property.KeyboardAction
has a newshouldApplyAutocompleteSuggestion
property.KeyboardAction
has a newshouldReinsertAutocompleteInsertedSpace
property.KeyboardAction
has a newshouldRemoveAutocompleteInsertedSpace
property.KeyboardLocale
now implementesIdentifiable
.KeyboardLocale
has newflag
,id
andlocaleIdentifier
properties.KeyboardLocale
has newsorted
collection extensions.KeyboardInputViewController
has a newautocompleteSuggestionProvider
property.KeyboardInputViewController
has now implementedperformAutocomplete
andresetAutocomplete
.StandardKeyboardActionHandler
has a newtryApplyAutocompleteSuggestion
function.StandardKeyboardActionHandler
has a newtryHandleReplacementAction
function.StandardKeyboardActionHandler
has a newtryReinsertAutocompleteRemovedSpace
function.StandardKeyboardActionHandler
has a newtryRemoveAutocompleteInsertedSpace
function.SystemKeyboardSpaceButtonContent
has a new initializer that lets you inject a custom space view.UITextDocumentProxy
has a newhasAutocompleteInsertedSpace
property.UITextDocumentProxy
has a newhasAutocompleteRemovedSpace
property.UITextDocumentProxy
has a newinsertAutocompleteSuggestion
function.UITextDocumentProxy
has a newisOpenAlternateQuotationBeforeInput(for:)
function.UITextDocumentProxy
has a newisOpenQuotationBeforeInput(for:)
function.UITextDocumentProxy
has a newpreferredReplacement(for:locale:)
function.UITextDocumentProxy
has a newtryInsertSpaceAfterAutocomplete)
function.UITextDocumentProxy
has a newtryReinsertAutocompleteRemovedSpace
function.UITextDocumentProxy
has a newtryRemoveAutocompleteInsertedSpace
function.
KeyboardInputViewController
now uses combine observations to keep locale in sync.
AutocompleteSuggestion+replacement
has been renamed totext
.AutocompleteToolbar+ButtonBuilder
has been renamed toItemBuilder
.KeyboardLocale+key
has been renamed toid
.LocaleKey
has been renamed toKeyboardLocale
.
AutocompleteSuggestion+replacement
has been deprecated due to the name change above.AutocompleteToolbar+buttonBuilder
init has been deprecated and replaced with theitemBuilder
one.AutocompleteToolbar+standardReplacement
has been deprecated.LocaleKey
has been deprecated due to the name change above.KeyboardLocale+key
has been deprecated.KeyboardInputViewController+changeKeyboardLocale
has been deprecated.KeyboardInputViewController+changeKeyboardType
has been deprecated.
AutocompleteSuggestionProvider
has new properties and functions that must be implemented. If you have an instance that breaks, just create dummy implementations that does nothing.
This patch fixes a bug with the numeric/symbolic auto-switch back to alphabetic, that could cause a keyboard to get stuck in alpha.
This patch fixes a few minor things.
- 🇮🇹 Italian
- 🇩🇪 German
.done
was accidentally missing a localized text.- English, German and Italian keyboards used an invalid double quote key text.
- Title1 font is now used for input keys with two characters, e.g. Swedish "kr" currency.
- Numeric and symbolic keyboards didn't auto-switch to alphabetic when tapping space.
This patch fixes a few minor things:
LocaleKey
now implementsCaseIterable
.
StandardKeyboardActionHandler
had a memory leak that has been fixed.
SwiftUI: Rising. In the shadows no more!
It's time for SwiftUI
to rise and become the unrelenting force we always knew it would become.
KeyboardKitSwiftUI
has been merged into this repository and the deployment target is raised to iOS 13
.
SwiftUI support is a first-class citizen from now on. UIKit
support is still around, but will no longer be actively developed. The future is a bright, declarative one!
Although these release notes aim at covering everything that has changes in this major version, some things will most probably be missed.
Besides the new things listed below, there are a bunch of new extensions, images etc.
Callouts
has new types and providers for working with callouts.Image.emoji
no longer requires iOS 14, but usesperson.crop.circle
as fallback on iOS 13.Input
has new types and providers for working with keyboard layouts.KeyboardAction
has new actions -go
,nextLocale
,ok
andreturn
.KeyboardAction
has new, localized standard button texts for some actions.KeyboardAction
has newisPrimaryAction
property.KeyboardAction
has newstandardButtonFontWeight
property.KeyboardAppearance
has a newimage(for:)
.KeyboardCasing
has a newneutral
case that can be used to show the original state of the inputs.KeyboardContext
has a newlocales
list and a newselectNextLocale
function.KeyboardGesture
has newpress
andrelease
gestures.KeyboardInput
is a new input type that simplifies building unicode-based keyboards.KeyboardInputSet
is now based onKeyboardInput
s instead of strings.KeyboardInputViewController
has a new staticshared
instance.KeyboardInputViewController
has a newkeyboardActionHandler
.KeyboardInputViewController
has a newkeyboardAppearance
.KeyboardInputViewController
has a newkeyboardBehavior
.KeyboardInputViewController
has a newkeyboardContext
.KeyboardInputViewController
has a newkeyboardInputCalloutContext
.KeyboardInputViewController
has a newkeyboardInputSetProvider
.KeyboardInputViewController
has a newkeyboardLayoutProvider
.KeyboardInputViewController
has a newkeyboardSecondaryInputActionProvider
.KeyboardInputViewController
has a newkeyboardSecondaryInputCalloutContext
.KeyboardInputViewController
setup(with:)
is now open and overridable.KeyboardEnabledState
is a new observable class that keeps in sync with the keyboard enabled state.KeyboardLayoutProvider
has a newregister(inputSetProvider:)
to simplify changing global input set provider.Layout
has new types and providers for working with keyboard layouts.Locale
is a new namespace with a few new locale-specific utils.LocaleDictionary
is a simple dictionary wrapper to work with localized resources.LocaleKey
is a simple enum to gather top-level locale identifiers.KKL10n
is a new enum that provides localized strings from KeyboardKit.SystemKeyboard
now highlights buttons when typing on iPad.View
has newkeyboardInputViewController
convenience extensions.View+keyboardToast
has new context-based function.View+localeContextMenu
can be applied to any view to let the user change locale.- There are new preview-specific implementations that can help you preview keyboard-based views.
AutocompleteContext
is now an observable object and not a protocol.AutocompleteToolbar
is now generic, which makes your .AutocompleteToolbar
now uses identifiable bar items, which leads to better separator handling.AutocompleteToolbar
now takes suggestions at init and doesn't require an environment injectedAutocompleteContext
.AutocompleteToolbar
no longer requires an environment injectedObservableKeyboardContext
, nor does its builder functions.EmojiCategory
now uses theEmoji
type instead of a char.FrequentEmojiProvider
now uses theEmoji
type instead of a char.KeyboardAction
standardButtonFont
has been coverted to a function.KeyboardAction
standardButtonText
has been coverted to a function.KeyboardAction
standardButtonTextStyle
has been coverted to a function.KeyboardAction.emoji
now uses theEmoji
type instead of a char.KeyboardAction.emojiCategory
no longer has a standard tap action.KeyboardActionRow
standardButtonImage
no longer takes a context.KeyboardBehavior
no longer takes a context as function input.KeyboardContext
is now an observable object and not a protocol.KeyboardContext
no longer has any services, just inspectable properties.KeyboardGestures
now handles the new press and release gestures.KeyboardInputSetProvider
implementations now provides punctuation as well.KeyboardInputSetProvider
no longer takes a context as function input.KeyboardInputViewController
context
is now anObservableKeyboardContext
.KeyboardInputViewController
context
is now calledkeyboardContext
.SecondaryCalloutActionProvider
no longer takes a context as function input.SecondaryInputCalloutContext
no longer requires a context init parameter.StandardKeyboardActionHandler
no longer depends on an input view controller.StandardKeyboardActionHandler
now requires an injected keyboard context and behavior.StandardKeyboardActionHandler
now requires an injected autocomplete and keyboard change action.StandardKeyboardActionHandler
now handles the new press and release gestures.StandardKeyboardActionHandler
triggerAutocomplete
is replaced by an injectable function.StandardKeyboardAppearance
will useisPrimaryAction
to apply a blue color to those actions.StandardKeyboardAppearance
will fallback to the action's standard font weight instead ofnil
.StandardKeyboardBehavior
now requires an injected keyboard context.StandardKeyboardInputSetProvider
now requires an injected keyboard context.View+KeyboardGestures
now handles the new press and release gestures.
- All unused extensions have been removed.
- All previous deprecations have been removed.
- All internal-only used extensions have been made internal.
InputCalloutContext.shared
has been removed. Use the environment object instead.KeyboardAction+SecondaryCalloutActions
has been replaced with newCallouts/Providers
providers.KeyboardActionRow
has been removed, since it's confusing to have two aliases for the same thing.KeyboardAppearance
button properties are prefixed withbutton
.KeyboardAppearance
font
andfontWeight
have been merged into a singlefont
property.KeyboardAppearanceProvider
has been renamed toKeyboardAppearance
.KeyboardButtonWidth
has been renamed toKeyboardLayoutWidth
.KeyboardContext
actionHandler
has been moved to the input vc.KeyboardContext
keyboardAppearanceProvider
has been moved to the input vc.KeyboardContext
keyboardBehavior
has been moved to the input vc.KeyboardContext
keyboardInputSetProvider
has been moved to the input vc.KeyboardContext
keyboardLayoutProvider
has been moved to the input vc.KeyboardDimensions
is no longer used and has been removed.KeyboardInputSet
locale extensions have been removed.KeyboardInputSet
standard input set extensions have been removed.KeyboardInputViewController
addKeyboardGestures
has been converted toKeyboardButton+Gestures
.KeyboardInputViewController
context
has been renamed tokeyboardContext
.KeyboardInputViewController
keyboardType
has been removed - use the context directly!KeyboardInputViewController
setupKeyboard
has been removed and moved to the UIKit demo.KeyboardInputViewController+Gestures
has been converted toKeyboardButton+Gestures
.KeyboardLayout
actionRows
has been renamed toitems
and are of a newKeyboardLayoutItemRows
type.KeyboardCasing
has been renamed toKeyboardCasing
KeyboardStateInspector
has been renamed toKeyboardEnabledStateInspector
.ObservableAutocompleteContext
has been renamed toAutocompleteContext
.ObservableKeyboardContext
has been renamed toKeyboardContext
.PhotosImageService
andStandardPhotosImageService
have been removed.Settings
has been entirely removed.SecondaryInputCalloutContext.shared
has been removed. Use the environment object instead.StandardKeyboardContext
has been replaced byObservableKeyboardContext
.StandardKeyboardActionHandler
has a new vc-based initializer.StandardKeyboardActionHandler
no longer takes an optional sender for keyboard actions.StandardKeyboardActionHandler
gesture actions has been gathered in a singleaction(for:on)
.StandardKeyboardAppearanceProvider
has been renamed toStandardKeyboardAppearance
.StandardKeyboardLayoutProvider
no longer has left and right space actions. Implement this in a custom provider instead.SystemKeyboardDimensions
is no longer used and has been removed.UIImage+pasteboard
has been moved to the demo.UIImage+photos
has been moved to the demo.UIImage+resized
has been removed.UIImage+tinted
has been removed.UIInputViewController+NextKeyboard
has been made an internal extension inUIView+Keyboard
.View+Button
"standard button" functions have been replaced by a singlekeyboardButtonStyle
function.View+ClearInteractable
has been removed.View
keyboardAction(...)
has been renamed tokeyboardGestures(for: ...)
.UIEdgeInsets+Keyboard
standardKeyboardButtonInsets
has been renamed tostandardKeyboardButtonInsets
.
In this version, UIKit
is replaced by SwiftUI
as the primary layout engine.
As such, to avoid UIKit
parts blocking SwiftUI, types in the UIKit
folder will be renamed to start with UI
:
AutocompleteToolbarLabel
->UIAutocompleteToolbarLabel
AutocompleteToolbarSeparator
->UIAutocompleteToolbarSeparator
AutocompleteToolbarView
->UIAutocompleteToolbar
(OBS! Name change as well.)HorizontalKeyboardComponent
->UIHorizontalKeyboardComponent
KeyboardAlert
->UIKeyboardAlert
KeyboardButton
->UIKeyboardButton
KeyboardButtonCollectionView
->UIKeyboardButtonCollectionView
KeyboardButtonRowCollectionView
->UIKeyboardButtonRowCollectionView
KeyboardButtonView
->UIKeyboardButtonView
KeyboardButtonRowComponent
->UIKeyboardButtonRowComponent
KeyboardCollectionView
->UIKeyboardCollectionView
KeyboardToolbarComponent
->UIKeyboardToolbarComponent
KeyboardToolbarView
->UIKeyboardToolbarView
KeyboardSpacerView
->UIKeyboardSpacerView
KeyboardStackViewComponent
->UIKeyboardStackViewComponent
PagedKeyboardComponent
->UIPagedKeyboardComponent
RepeatingGestureRecognizer
->UIRepeatingGestureRecognizer
Shadow
->UIShadow
ToastAlert
->UIKeyboardToastAlert
(OBS! Name change as well.)VerticalKeyboardComponent
->UIVerticalKeyboardComponent
Their functionality remains intact, however.
There are a new extension as well, as UIKit support moves away from the core layer:
UIView+Keyboard
is now used to apply button gestures to a view, instead of having this functionality in the view controller.
This release adds fake protocol implementations, to simplify creating SwiftUI previews.
The release also adds some things for the future:
KeyboardButtonWidth
is a new way to express the width of a keyboard button.View+KeyboardButtonWidth
is a new way to apply a width to a keyboard button.
Although not used by the standard keyboards yet, I still wanted to add them before starting working on 4.0.
This release rolls back some changes to try improve dark appearance keyboards in SwiftUI.
Seems like dark appearance can't be detected, since this also enables dark mode. Hopefully this is easier to fix in KK 4.0.
This release adds a time threshold to the end sentence action.
This release also fixes so that CalloutCurve
and CustomRoundedRect
handles invalid rects.
This release fixes so that the secondary input gesture triggers a tap if there were no secondary actions in the callout.
-
Emoji
is a new struct that in the future will let us work more with emojis in a more structured and type-safe way. -
EmojiCategory
now lets you register afrequentEmojiProvider
, and uses that to populate the frequent category. -
There is a new
EmojiProvider
protocol -
There is a new
FrequentEmojiProvider
protocol -
There is a new
MostRecentEmojiProvider
class -
There is a new
String+Delimiters
extension with word and sentence delimiters. -
There are new
UITextDocumentProxu+Content
extensions to get previous sentences and words. -
AutocompleteToolbar
has a new, staticstandardReplacement
function. -
AutocompleteToolbar
has a new, staticstandardReplacementAction
function. -
AutocompleteToolbar
now lets you provide an optional, customreplacementAction
in init. -
Color+Resources
is a new extension that provides asset-based colors that adapt to dark mode. -
EmojiCategoryKeyboard
is a new view that lists the emojis of a selected category and a menu. -
EmojiCategoryKeyboardMenu
is a new view that lets the user select one of multiple categories. -
EmojiKeyboard
is a new view that renders a set of emojis in a lazy grid. The item action is customizable.
-
EmojiCategory
now implementsEmojiProvider
-
EmojiCategory.frequent
now returns emojis from thefrequentEmojiProvider
. -
StandardKeyboardActionHandler
now tries to register emojis with theEmojiCategory
frequent emoji provider. -
Color+Button
uses the new asset-based colors. -
SystemKeyboardButtonBody
now only offsets small caps texts. -
The emoji action has a filled standard image instead of an outlined one.
-
Due to a secondary callout action bug, the secondary context is now created by the vc.
- The
´
accent was accidentally used in standard numeric keyboards. It has now been replaced with’
, which is the correct one.
-
KeyboardContext.emojiCategory
has been deprecated. This should be persisted by the view instead. -
PhotosImageService
and the standard implementation has been deprecated. Copy it to your own project if you want to keep on using it. -
UIImage+Photos
has been deprecated. Copy it to your own project if you want to keep on using it. -
Some button-specific
Color
extensions have been deprecated. -
View+keyboardAction(:context:)
has been deprecated.
secondaryCalloutInputProvider
has been removed fromKeyboardContext
. It's now only in the secondary context.
This release fixes so that the secondary input gesture triggers a tap if there were no secondary actions in the callout.
The release also makes the entire autocomplete button tappable, instead of just the text.
This release fixes so that upper-cased chars gets secondary callout actions and that the input callout isn't dismissed if there are no secondary actions.
This release makes it easier to inject custom views into the SwiftUI
-based SystemKeyboard
and AutocompleteToolbar
.
There is also a new SystemKeyboardSpaceButton
which lets you present the current locale before fading to "space".
The release also adds a spacebar drag gesture and deprecates some haptic
properties as well as some system
properties in favor of the standard
naming concept (since the system behavior is the standard behavior).
-
AutocompleteSuggestion
is a new protocol that makes the autocomplete provider concept more general. -
HapticFeedback
has a newlongPressOnSpace
case. -
KeyboardAppearanceProvider
is a protocol for providing button content and style. -
KeyboardContext
has a newkeyboardAppearanceProvider
property. -
StandardKeyboardActionHandler
has new functionality for handling the space drag gesture. -
StandardKeyboardAppearanceProvider
is a standard appearance provider that returns standard values. -
SystemKeyboardButtonContent
is new view that extracts content logic fromSystemKeyboardButton
. -
SystemKeyboardButtonRowItem
can now be created with generic views. -
SystemKeyboardSpaceButton
is new view that wrapsSystemKeyboardSpaceButtonContent
and applied a style and gestures to it. -
SystemKeyboardSpaceButtonContent
is new view that animates between a locale text and a space text.
HapticFeedback.standard
has almost no haptic feedback now, since that is the standard behavior.SystemKeyboard
now wraps thebuttonBuilder
generated views in aSystemKeyboardButtonRowItem
.SystemKeyboardButton
now applies a fallback text from the new appearance provider.- The standard
SystemKeyboard
button builder generatesSystemKeyboardButtonContent
instead ofSystemKeyboardButton
.
-
HapticFeedback
standard cases have been deprecated, since native keyboards have almost no haptic feedback. -
KeyboardAction
systemFont
is renamed tostandardButtonFont
. -
KeyboardAction
systemKeyboardButtonText
is renamed tostandardButtonText
. -
KeyboardAction
systemTextStyle
is renamed tostandardButtonTextStyle
. -
KeyboardType
systemKeyboardButtonText
is deprecated. -
String
implementsAutocompleteSuggestion
to avoid breaking changes in KK 3.5+. You should provide your own custom types, though. -
Color
systemKeyboardButtonBackgroundColorDark
has been renamed tostandardDarkButtonBackgroundColor
-
Color
systemKeyboardButtonBackgroundColorLight
has been renamed tostandardLightButtonBackgroundColor
-
Color
systemKeyboardButtonForegroundColor
has been renamed tostandardButtonForegroundColor
-
Color
systemKeyboardButtonShadowColor
has been renamed tostandardButtonShadowColor
-
KeyboardAction
systemKeyboardButtonBackgroundColor
has been renamed tostandardButtonBackgroundColor
-
KeyboardAction
systemKeyboardButtonImage
has been renamed tostandardButtonImage
-
KeyboardAction
systemKeyboardButtonShadowColor
has been renamed tostandardButtonShadowColor
-
KeyboardCasing
systemImage
has been renamed tostandardButtonImage
-
KeyboardCasing
systemKeyboardButtonImage
was unused and has been deprecated. -
KeyboardType
systemKeyboardButtonImage
has been renamed tostandardButtonImage
-
View
systemKeyboardButtonStyle
has been renamed tostandardButtonStyle
-
View
systemKeyboardButtonBackground
has been renamed tostandardButtonBackground
-
View
systemKeyboardButtonFont
has been renamed tostandardButtonFont
-
View
systemKeyboardButtonForeground
has been renamed tostandardButtonForeground
-
View
systemKeyboardButtonShadow
has been renamed tostandardButtonShadow
AutocompleteToolbarView
andAutocompleteToolbar
now useAutocompleteSuggestion
instead ofString
. It makes them MUCH more powerful, so I hope this breaking change is acceptable.SystemKeyboardButtonRowItem
has been made generic.SystemKeyboard.ButtonBuilder
now returns anAnyView
since you may want to use any custom view for any button.
This release adds curves and behavior changes to the callout bubbles.
- The disabled secondary % callout actions have been re-enabled.
CalloutStyle
now applies button frame insets when configured for a system keyboard.InputCallout
has curves between the button area and the callout.InputCalloutContext
has a newisEnabled
property that is only true for phones, since it should not be displayed on iPads.InputCalloutContext
no longer insets the button rect.SecondaryInputCallout
has curves between the button area and the callout and the design is improved.SystemInputCalloutContext
no longer insets the button rect.
CalloutCurve
is a new shape that can be used to smoothen the two parts of a callout bubble.
This release fixes some visual artefacts in the callout bubbles.
From now on, release notes will include changes in both KeyboardKit and KeyboardKitSwiftUI.
This release adds support for input callouts and secondary input callouts.
This release has new features for secondary callout actions.
-
KeyboardAction+SecondaryCalloutActions
specifies standard, locale-specific secondary callout actions for keyboard actions. -
KeyboardContext
has a newsecondaryCalloutActionProvider
property. -
SecondaryCalloutActionProvider
is a protocol for providing secondary callout actions for keyboard actions. -
StandardSecondaryCalloutActionProvider
is a standard action provider that returns the standard secondary callout actions. -
CalloutStyle
is a shared style for keyboard button callout. -
InputCallout
is a callout that can highlight the currently pressed keyboard button. -
InputCalloutContext
can be used to controlInputCallout
views. -
InputCalloutStyle
can be used to styleInputCallout
views. -
SecondaryInputCallout
is a callout that can present secondary actions for the currently pressed keyboard button. -
SecondaryInputCalloutContext
can be used to controlSecondaryInputCallout
views. -
SecondaryInputCalloutStyle
can be used to styleSecondaryInputCallout
views. -
View+InputCallout
can be used to wrap any view in aZStack
with a topmostInputCallout
-
View+SecondaryInputCallout
can be used to wrap any view in aZStack
with a topmostSecondaryInputCallout
Since the new secondary input callout, which triggers on long press, I have removed the standard long press action for all actions except backspace.
This also makes standard KeyboardKit keyboards behave more like native iOS keyboards.
View+KeyboardGestures
has been extended with gestures forInputCallout
andSecondaryInputCallout
.
This release also has breaking changes to experimental features.
KeyboardInputProvider
has been renamed toKeyboardInputSetProvider
KeyboardInputSetProvider
s properties are now context-based functionsKeyboardContext
keyboardInputProvider
has been renamed tokeyboardInputSetProvider
ObservableKeyboardContext
keyboardInputProvider
has been renamed tokeyboardInputSetProvider
This release contains a bunch of new features that makes the keyboard behave more like the native keyboards when typing, for instance auto-capitalization and auto-lowercasing.
This release separates action handling from behavior, which I hope makes the code cleaner and easier to test and simplifies reusing behavior outside of an action handling context.
KeyboardBehavior
specifies how a keyboard should behave.StandardKeyboardBehavior
specifies the standard behavior of a western keyboard.
You can create your own behaviors as well as subclass and override parts of the standard behavior.
Note that this is an experimental feature that may have to be revisited before 4.0.
KeyboardContext
has a newpreferredKeyboardType
property.KeyboardContext
has a newactionBehavior
property.StandardKeyboardBehavior
has caps-lock double tap logic.UITextDocumentProxy
has a newisCursorAtNewSentence
property.UITextDocumentProxy
has a newisCursorAtNewWord
property.UITextDocumentProxy
has a newendSentence
function that removes any space before the cursor, then closes the sentence.UITextDocumentProxy
has a newsentenceDelimiters
property.UITextDocumentProxy
has a newwordDelimiters
property.
- The caps-lock double tap logic is moved from double-tap on shift to the new keyboard behavior.
- The sentence ending logic is moved from double-tap on space to the new keyboard behavior.
- The sentence ending logic is no longer based on double-tap, which makes it easier to use.
KeyboardAction
standardDoubleTapAction
is not defined for any actions anymore.KeyboardInputViewController
changeKeyboardType
has no time interval anymore.StandardKeyboardContext
initializer now has a default value for the keyboard type.
- The standard keyboard layout has been fixed to use the correct caps-lock button image.
KeyboardAction
endSentenceAction
has been moved toUITextDocumentProxy+EndSentence
.KeyboardAction
standardDoubleTapAction
is not used internally anymore.KeyboardContext
changeKeyboardType
is not used internally anymore.KeyboardType
canBeReplaced
is not used internally anymore.StandardKeyboardActionHandler
handleKeyboardSwitch
is renamed tohandleKeyboardTypeChange
.StandardKeyboardActionHandler
preferredKeyboardType
has been moved to the keyboard behavior.
These deprecations will be removed in v 4.0.
This release contains improvements to the input set logic:
- There is a new
KeyboardInputProvider
protocol. StandardKeyboardInputProvider
tries to use the current locale (fallback to English) and can be inherited.StaticKeyboardInputProvider
uses three static input sets.InputSet+English
has been renamed toInputSet+Locale
and has more sets.InputSet+Locale
extension has support for basic English, German, Italian and Swedish.StandardKeyboardInputProvider
is used by default in the context, but you can change this at anytime.
The release also introduces a new "keyboard layout" concept, where a keyboard layout is an input set with surrounding actions:
- There is a new
KeyboardLayout
struct. - There is a new
KeyboardLayoutProvider
protocol.StandardKeyboardLayoutProvider
uses the current context and can be inherited.StaticKeyboardLayoutProvider
uses a static layout that is provided at init.
StandardKeyboardLayoutProvider
is used by default in the context, but you can change this at anytime.
There are new properties in the KeyboardContext
.
This release also makes it easier to resolve system keyboard dimensions:
CGFloat+Keyboard
has utils to resolve the standard keyboard row height.KeyboardStackViewComponent
s use this new standard height as default height.UIEdgeInsets+Keyboard
has utils to resolve the standard keyboard row item insets.KeyboardButtonRowComponent
s use these new standard insets as default insets.
The demos have been updated with these changes.
- The context controller propertis are marked as
@unowned
to fix a memory leak.
CGFloat+KeyboardDimensions
is deprecated and will be removed in 4.0.KeyboardContext
'scontroller
is now deprecated and will be removed in 4.0 .Usage is strongly discouraged. Use the context instead.
KeyboardContext
has new properties to make the new input and layout additions possible. If you have created your own context, you will have to add these.
This version contains new features:
EmojiCategory
is nowCodable
.EmojiCategory
has afallbackDisplayEmoji
that is used as system button text if no custom button image used.KeyboardAction
now has a standard tap action for.emojiCategory
.KeyboardContext
now has anemojiCategory
property.
This version contains new protocols and classes:
KeyboardInputViewController
has new, emptyperformAutocomplete
andresetAutocomplete
functions that are called by the system at proper times.- The new
AutocompleteSuggestions
typealias makes the autocomplete apis cleaner. - There is a new
AutocompleteContext
protocol that can be used to manage suggestions. - There is a new
StandardAutocompleteContext
implementation ofAutocompleteContext
. - There is a new
UITextDocumentProxy
property to check if the proxy cursor is at the end of the current word.
- The "end sentence" action that is used by space double taps, uses the new proxy property to only close when the cursor is at the end of a word.
In this version:
- A memory leak was fixed by making all
StandardBookActionHandler
actions use[weak self]
. - The UIKit button shadow logic was improved by @jackhumbert.
This version fixes a bug, where the globe button that is used by the demo keyboards didn't do anything.
This version also fixes the system image's font weight.
This version removes all previously deprecated parts of the library and adds improved support for SwiftUI and iOS 13.
If you upgrade from an older version to 3.0
and have many breaking changes, upgrading to 2.9
first provides deprecation help that may make the transition easier.
There is a new KeyboardContext
, which provides important contextual information.
StandardKeyboardContext
is the standard, non-observable implementation.ObservableKeyboardContext
is an iOS 13+ required, observable implementation.StandardKeyboardActionHandler
now automatically handles keyboard type switching and only delays if an action has a double-tap action.StandardKeyboardActionHandler
now automatically switches to certain keyboards after certain actions, as defined byhandleKeyboardSwitch(after:on:)
andpreferredKeyboardType(after:on:)
.
There are new KeyboardAction
types and properties:
.control
represents the system..systemImage
can be used with SF Symbols..systemFont
and.systemTextStyle
provide system look information.
There is a new System
namespace with utils to help you build native-imitating system keyboards.
There is a new KeyboardInputSet
concept that will simplify building language-specific keyboards. For now, it contains English characters, numerics and symbols.
The demo project contains a new KeyboardKitSwiftUIPreviews
in which you can preview KeyboardKitSwiftUI views.
- This repository has a new SwiftUI-based demo app, which is still in development.
KeyboardImageButton
supports the newsystemImage
action.
KeyboardInputViewController
deviceOrientation
has been converted to a generalUIInputViewController
extension.setupNextKeyboardButton
has been converted to a generalUIInputViewController
extension.
-
KeyboardInputViewController
has a newkeyboardContext
property. -
StandardKeyboardContext
is used by default, whenever a keyboard extension is created. -
ObservableKeyboardContext
is used by whenever a keyboard switches over to use SwiftUI. -
KeyboardInputViewController
keyboardActionHandler
has been moved toKeyboardContext
. -
KeyboardInputViewController
canChangeKeyboardType
has been moved toKeyboardType
. -
KeyboardInputViewController
changeKeyboardType
has been moved toKeyboardContext
. -
KeyboardInputViewController
changeKeyboardTypeDelay
is now an argument inchangeKeyboardType
. -
KeyboardInputViewController
keyboardType
has been moved to the context. -
AutocompleteToolbar
has been renamed toAutocompleteToolbarView
. -
EmojiCategory.frequents
has been renamed tofrequent
. -
KeyboardActionHandler
now requirescanHandle(_:on:)
to be implemented. -
KeyboardAction
has new action types. -
KeyboardAction
has fewerisXXX
properties. -
KeyboardAction
.capsLock
andshiftDown
are now part ofKeyboardAction.shift
. -
KeyboardActionRow.from
has been changed to an initializer. -
KeyboardActionRows.from
has been changed to an initializer. -
KeyboardImageActions
has been converted to aKeyboardActionRow+Images
extension initializer. -
KeyboardToolbar
has been renamed toKeyboardToolbarView
. -
The
shouldChangeToAlphabeticLowercase
has been replaced with the automatic switching mentioned above. -
The
isKeyboardEnabled
function now uses afor
as external argument name.
AutocompleteBugFixTimer
AutocompleteSuggestionProvider
provideAutocompleteSuggestions
KeyboardAction
switchKeyboard
KeyboardAction
switchToKeyboard
KeyboardAction
standardInputViewControllerAction
KeyboardAction
standardTextDocumentProxyAction
KeyboardActionHandler
handleTap/Repeat/LongPress
KeyboardActionHandler
handle
gesture onUIView
KeyboardInputViewController
addSwitchKeyboardGesture
PersistedKeyboardSetting
init with keyStandardKeyboardActionHandler
init
with feedback instancesStandardKeyboardActionHandler
action
for viewStandardKeyboardActionHandler
animationButtonTap
StandardKeyboardActionHandler
giveHapticFeedbackForLongPress/Repeat/Tap
StandardKeyboardActionHandler
longPress/repeat/tapAction
for viewStandardKeyboardActionHandler
handleLongPress/Repeat/Tap
StandardKeyboardActionHandler
triggerAudio/HapticFeedback
UIColor
clearTappable
UIInputViewController
createAutocompleteBugFixTimer
UIView
add/removeLongPress/Repeating/TapAction
isKeyboardEnabled
global function
This version updates external test dependencies to their latest versions.
This version removes the subview fiddling from KeyboardCollectionVew
to the built-in subclasses, since it can ruin the view hierarchy for collection views that don't add custom views to the cells.
This version adds an .emoji
keyboard action, which can be used if you need to separate characters from emojis.
This version also extracts the logic of KeyboardAction
standardTapAction
into:
standardTapActionForController
standardTapActionForProxy
This makes it possible to use the standard function in other ways, should you need it.
This version also makes actions
of KeyboardCollectionView
mutable, causing changes to this property to refresh the view.
This is the last minor version before 3.0
, which will remove a bunch of deprecated members.
This version adds more features, fixes some bugs and deprecates many parts of the library.
A big change, which is not fully covered in these notes, is that KeyboardInputViewController
and StandardKeyboardActionHandler
now handles changing keyboard types. Even if you have to fill a "type" with meaning in your app, you now have implemented logic to help you handle this.
Thanks to @eduardoxlau, the demo also has an improved emoji keyboard.
KeyboardAction
has newstandardTap/DoubleTap/LongPress/Repeat
action properties.KeyboardInputViewController
has a newdeviceOrientation
property.KeyboardInputViewController
has a newkeyboardType
property.KeyboardInputViewController
has newcan/changeKeyboardType
functions and properties.KeyboardInputViewController
has a newsetupKeyboard
function.StandardKeyboardActionHandler
has more logic for handling keyboard type changes.- The new
EmojiCategory
enum represents the native iOS emoji keyboard categories. - The new
KeyboardStateInspector
can be implemented to get info about the keyboard.
- The demo now switches to caps lock when shift is double-tapped.
- The standard tap animation does not scale up as much as before.
- The standard haptic feedback for tap is light impact instead of medium.
KeyboardAction.switchKeyboard
has been renamed tonextKeyboard
.KeyboardAction.switchToKeyboard
has been renamed tokeyboardType
.KeyboardAction.standardInputViewControllerAction
has been renamed tostandardTapAction
.KeyboardAction.standardTextDocumentProxyAction
is no longer used by the system`.addSwitchKeyboardGesture(to:)
has been renamed toaddNextKeyboardGesture(to:)
.- The global
isKeyboardEnabled
has been replaced with a newKeyboardStateInspector
protocol.
- Double tap handling for space no longer inserts an additional space.
KeyboardType.alphabetic
now uses aKeyboardCasing
property instead of a bool for if it's upper-cased or not.KeyboardAction.switchToKeyboard
is now an alias forkeyboardType
. You can still use it when defining actions, but if you switch overKeyboardAction
, you have to usekeyboardType
instead ofswitchToKeyboard
.
This version fixes some division by zero bugs.
This version fixes a gesture-related memory leak by no longer using the gesture extensions that caused the problem. Instead, KeyboardInputViewController
has a new set of internal gesture extensions that helps with adding gestures to a button.
This version also adds double-tap action handling to KeyboardKit. It's handled like taps, long presses and repeating actions, but it has no default logic. To handle it, create a custom action handler and override handle(_ gesture:,on action:, sender:)
.
KeyboardKit does not put any rules on the gesture handling. If you return an action for both a single tap and a double tap, both will be triggered.
- A new
.doubleTap
keyboard gesture.
- The
UIView
addLongPressAction
extension is deprecated. - The
UIView
removeLongPressAction
extension is deprecated. - The
UIView
addRepeatingAction
extension is deprecated. - The
UIView
removeRepeatingAction
extension is deprecated. - The
UIView
addTapAction
extension is deprecated. - The
UIView
removeTapAction
extension is deprecated.
This version upgrades the podspec's Swift version.
This version upgrades its Nimble and Mockery dependencies.
These versions adjust the keyboard settings url.
This version adds the very first (and so far limited) support for SwiftUI
. Many new features are iOS 13-specific.
This version also deprecates a bunch of action handling logic and adds new functions that doesn't rely on UIView
.
-
KeyboardInputViewController
has a newsetupNextKeyboardButton(...)
which turns anyUIButton
into a system-handled "next keyboard" button. -
NextKeyboardUIButton
makes use of this new functionality, and sets itself up with aglobe
icon as well. -
PhotoImageService
andStandardPhotoImageService
can be used to save images to photos with a completion instead of a target and a selector. -
KeyboardImageActions
makes it easy to create a bunch of.image
actions from a set of image names. -
KeyboardActionHandler
has a newopen handle(_ gesture:on:view:)
which is already implemented inStandardKeyboardActionHandler
. -
The global
isKeyboardEnabled
function can be used to check if a certain keyboard extension is enabled or not. -
The
keyboardSettings
URL
extension is a convenience extension for finding the url to application settings. -
The
evened(for gridSize: Int)
[KeyboardAction]
extension appends enough.none
actions to evenly fit the grid size. -
The
saveToPhotos(completion:)
UIImage
extension is a completion-based way of saving images to photos.
There are some new views that can be used in SwiftUI-based apps and keyboard extensions:
-
KeyboardGrid
distributes actions evenly within a grid. -
KeyboardGridRow
is used for each row in the grid. -
KeyboardHostingController
can be used to wrap anyView
in a keyboard extension. -
KeyboardImageButton
view lets you show an.image
action orImage
in aButton
. -
NextKeyboardButton
sets itself up with aglobe
icon and works as a standard "next keyboard" button. -
PersistedKeyboardSetting
is a new property wrapper for persisting settings inUserDefaults
. -
Color.clearInteractable
can be used instead of.clear
to allow gestures to be detected. -
Image.globe
returns the icon that is used for "next keyboard". -
KeyboardInputViewController
setup(with:View)
sets up aKeyboardHostingController
. -
View
withClearInteractableBackground()
can be used to make an entire view interactable.
Note that KeyboardKitSwiftUI
is a separate framework, which you have to import to get access to these features.
There are some new UIKit features and extensions:
NextKeyboardUIButton
sets itself up with aglobe
icon and works as a standard "next keyboard" button.UIImage.globe
returns the icon that is used for "next keyboard".
All UIKit-specific functionality is placed in the UIKit
folder. UIKit logic that can be used in SwiftUI is outside it.
isInputAction
now includes.space
.isSystemAction
no longer includes.space
.
UIColor.clearTappable
has been renamed toUIColor.clearInteractable
.KeyboardActionHandler
has deprecated the gesture-explicit handle functions.KeyboardActionHandler
has deprecated the view-explicit handle function in favor of an optionalAny
sender variant.StandardKeyboardActionHandler
has deprecated a bunch ofUIView
-explicit functions in favor of an optionalAny
sender variant.
This version fixes a bug, where moveCursorForward
moved the cursor incorrectly.
This version adds enableScrolling()
and disableScrolling()
to AutocompleteToolbar
. This makes it possible to make the entire toolbar scroll if its content doesn't fit the screen.
This version adds more autocomplete functionality:
AutocompleteToolbar
has a new convenience initializer that makes it even easier to setup autocomplete.AutocompleteToolbarLabel
is the default autocomplete item view and can be tapped to send text to the text document proxy.AutocompleteToolbarLabel
behaves like the native iOS autocomplete view and displays centered text until the text must scroll.- Autocomplete no longer requires the bugfix timer. Instead, just let the action handler request autocomplete suggestions when a tap action is triggered.
The StandardKeyboardActionHandler
has new functionality:
animationButtonTap()
- can be overridden to change the default animation of tapped buttons.
Deprecations:
- The
AutocompleteBugFixTimer
and all timer-related logic has been deprecated. - The
AutoCompleteSuggestionProvider
'sprovideAutocompleteSuggestions(for:completion:)
is deprecated and replaced withautocompleteSuggestions(for:completion:)
. - The
StandardKeyboardActionHandler
'shandleXXX(on:)
are now deprecated and replaced withhandle(:on:view:)
.
This version adds a bunch of features, tweaks some behaviors and deprecates some logic:
New stuff:
- There is a new
KeyboardActionGesture
that will be used to streamline the action handling api:s. - There is a new
AudioFeedback
enum that describes various types of audio feedback. - There is a new
AudioFeedbackConfiguration
that lets you gather all configurations in one place. - There is a new
HapticFeedback.standardFeedback(for:)
function that replaces the old specific properties. - There is a new
HapticFeedbackConfiguration
that lets you gather all configurations in one place. - There is a new
StandardKeyboardActionHandler
init that uses this new configuration. - There is a new
StandardKeyboardActionHandler.triggerAudioFeedback(for:)
that can be used to trigger audio feedback. - There is a new
StandardKeyboardActionHandler.triggerHapticFeedback(for:on:)
that replaces the old gesture-specific ones. - There is a new
StandardKeyboardActionHandler.gestureAction(for:)
function that is used by the implementation. The old ones are still around. - There is a new
KeyboardType.images
case that is used by the demo.
Changed behavior:
- There is a new
standardButtonShadow
Shadow
property that can be used to mimic the native button shadow.
Deprecated stuff:
- The old
StandardKeyboardActionHandler.init(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForLongPress(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForRepeat(...)
is deprecated, use the new one. - The old
StandardKeyboardActionHandler.giveHapticFeedbackForTap(...)
is deprecated, use the new one. - The old
HapticFeedback.standardTapFeedback
andstandardLongPressFeedback
have been replaced by the new function.
The old handle
functions are still declared in the KeyboardActionHandler
protocol, but will be removed in the next major version.
This version adds Xcode 11 and iOS 13 support, including support for dark mode and high contrast color variants.
This version adds autocomplete support, which includes an autocomplete suggestion provider protocol, a new toolbar and new extensions.
The new AutocompleteSuggestionProvider
protocol describes how to provide your keyboard with autocomplete suggestions. You can implement it in any way you like, e.g. to use a built-in suggestion database or by connecting to an external data source, using network requests. Note that the network option will be a lot slower and also require you to request full access from your users.
The new AutocompleteToolbar
is a toolbar that can display any results you receive from your suggestion provider (or any list of strings for that matter). Just trigger the provider anytíme the text changes and route the result to the toolbar. The toolbar can be populated with any kind of views. Have a look at the demo app for an example.
The new UITextDocumentProxy+CurrentWord
extension helps you get the word that is (most probably) being typed. You could use this when requesting autocomplete suggestions, if you only want to autocomplete the current word.
Besides these additions, there are a bunch of new extensions, like UITextDocumentProxy
deleteBackward(times:)
, which lets you delete a certain number of characters. Have a look at the Extensions
namespace for a complete list.
There is also a new KeyboardCasing
enum that you can use to keep track of which state your keyboard has, if any. This enum is extracted from demo app code that was provided by @arampak earlier this year.
IMPORTANT iOS has a bug that causes textWillChange
and textDidChange
to not be called when the user types, only when the cursor moves. This causes autocomplete problems, since the current word is not changing as the user types. Due to this, the input view controller must use an ugly hack to force the text document proxy to update. Have a look at the demo app to see how this is done.
This version solves some major bugs in the repeating gesture recognizer and makes some public
parts of the library open
.
The standard action handler now handles repeating actions for backspace. You can customize this in the same way as you customize tap and long press handling.
You can test the new repeating logic in the demo app.
This version adds more keyboard actions that don't exist in iOS, but that may serve a functional or semantical purpose in your apps:
command
custom(name:)
escape
function
option
tab
The new custom
action is a fallback that you can use if the existing action set is insufficient for your specific app.
I have added a RepeatingGestureRecognizer
and an extension that you can use to apply it as well. It has a custom initial delay as well as a custom repeat interval, that will let you tap and hold a button to repeat its action. In the next update, I will apply this to the backspace and arrow buttons.
Thanks to @arampak, the demo app now handles shift state and long press better, to make the overall experience much nicer and close to the native keyboard. The keyboard buttons also registers tap events over the entire button area, not just the button view.
This version makes a bunch of previously internal extensions public. It also adds a lot more unit tests so that almost all parts of the library are tested.
The default tap animation has been configured to allow user interaction, which reduces the frustrating tap lag that was present in 2.0.0.
I have added a KeyboardToolbar
class, which you can use to create toolbars. It's super simple so far, and only creates a stack view to which you can any views you like.
This version adds a public shadow extension to the main library and shuffles classes and extensions around. It also restructures the example project to make it less cluttered.
I noticed that the build number bump still (and randomly) bumps the build number incorrectly, which causes build errors. I have therefore abandoned this approach, and instead fixes the build number to 1 in all targets.
This version aim at streamlining the library and remove or refactor parts that make it hard to maintain. It contains several breaking changes, but I hope that the changes will make it easier for you as well, as the library moves forward.
Most notably, the view controller inheritance model has been completely removed. Instead, there is only one KeyboardInputViewController
. It has a stack view to which you can add any views you like, like the built-in KeyboardButtonRow
and KeyboardCollectionView
, which means that your custom keyboards is now based on components that you can combine.
Since KeyboardInputViewController
therefore can display multiple keyboards at once, it doesn't make any sense to have a single keyboard
property. You can still use structs to organize your actions (in fact, I recommend it - have a look at the demo app), but you don't have to.
All action handling has been moved from the view controller to KeyboardActionHandler
as well. KeyboardInputViewController
use a StandardActionHandler
by default, but you can replace this by setting keyboardActionHandler
to any KeyboardActionHandler
. This is required if you want to use certain actions types, like .image
.
New KeyboardAction
s are added and nextKeyboard
has been renamed to switchKeyboard
. Action equality logic has also been removed, so instead of isNone
, you should use == .none
from now on. All help properties like image
and imageName
are removed as well, since they belong in the app. These are the new action types
- capsLock
- dismissKeyboard
- moveCursorBackward
- moveCursorForward
- shift
- shiftDown
- switchToKeyboard(type)
KeyboardInputViewController
will now resize the extension to the size of the stack view, or any other size constraints you may set. The old setHeight(to:)
function has therefore been removed.
This version upgrades KeyboardKit
to Swift 5 and has many breaking changes:
KeyboardInputViewController
has been renamed toKeyboardViewController
CollectionKeyboardInputViewController
has been renamed toCollectionKeyboardViewController
GridKeyboardInputViewController
has been renamed toGridKeyboardViewController
KeyboardAlerter
has been renamed toKeyboardAlert
ToastAlerter
has been renamed toToastAlert
ToastAlert
now has two nested view classesView
andLabel
ToastAlert
's two style function has changed signatureToastAlerterAppearance
is now an internalToastAlert.Appearance
struct- Most extensions have been made internal, to avoid exposing them externally
Keyboard
has been given an optional ID, which can be used to uniquely identify a keyboard. This makes it easier to manage multiple keyboards in an app.
KeyboardInputViewController
implements the KeyboardPresenter
protocol, which means that you can set the new optional id
property to make a KeyboardSetting
exclusive to that presenter. This is nice if your app has multiple keyboards. If you do not specify an id, the settings behave just like before.
A PR by micazeve is merged. It limits the current page index that is persisted for a keyboard, to avoid bugs if the page count has changed since persisting the value.
This version updates KeyboardKit to Swift 4.2
and makes it ready for Xcode 10.
The grid keyboard view controller uses a new way to calculate the available item space and item size for a certain number of rows and buttons per row. This means that we can now use top and bottom content insets to create vertical margins for grid-based keyboards.
I previously used the async image functions to quickly setup a lot of images for "emoji" keyboards. Since I didn't use a collection view for emoji keyboards then, all image views were created at the same time, which caused rendering delays. By using the async image approach, image loading was moved from the main thread and allowed individual images to appear when they were loaded instead of waiting for all images to load before any image could be displayed.
However, KeyboardKit
now has collection view-based keyboards, which are better suited for the task above, since they only render the cells they need. This will solve the image loading issues, which means that the async image extensions will no longer be needed. I have therefore removed UIImage+Async
and the Threading
folder from the library, to keep it as small as possible.
No functional changes, just README updates and improvements. The version bump is required to give CocoaPod users the latest docs.
This is a complete rewrite of the entire library. KeyboardKit now targets iOS 11 and the code has been improved a lot. Check out the demo app to see how to setup keyboards from now on.