English | 中文
An easy to use Emoji keyboard for iOS.
Has been rewritten with swift, the old Objective-C version on branch oc.
Features
- [x] Written in Swift
- [x] Custom emojis
- [x] Multiple skin tone support ( 🏻 🏼 🏽 🏾 🏿 )
- [x] Categories bottom bar (like iOS system emoji Keyboard)
- [x] Recently used emoji
- [x] Dark Mode (#58)
- [x] SwiftUI support.
- [x] Latest emoji data (Unicode 17)
- [x] Grid density adapts to the device, like the system keyboard
- [x] Slide across the category bar to switch categories
Example
To run the example projects, clone the repo and open Example/ISEmojiViewExample.xcodeproj (UIKit) or SwiftUIExample/SwiftUIExample.xcodeproj (SwiftUI). Both resolve the library through a local Swift Package reference, no extra install step is needed.
Requirements
- Swift 5
- iOS 8+ (CocoaPods / Carthage), iOS 12+ (Swift Package Manager)
- iOS 13+ for the SwiftUI components
Usage
Installation
Swift Package Manager
via Swift Package Manager Install to your project,Add in Package.swift:
.package(name: "ISEmojiView", url: "https://github.com/isaced/ISEmojiView.git", .upToNextMinor(from: "0.3.0")),
In Xcode:
- File > Swift Packages > Add Package Dependency
- Add https://github.com/isaced/ISEmojiView.git
- Select "Up to Next Major" with "0.3.0"
Cocoapods
# Swift
pod 'ISEmojiView'
Objective-C (Deprecated)
pod 'ISEmojiView', '0.0.1'
Carthage
github "isaced/ISEmojiView"
Import
import ISEmojiView
Initialization
let keyboardSettings = KeyboardSettings(bottomType: .categories)
let emojiView = EmojiView(keyboardSettings: keyboardSettings)
emojiView.translatesAutoresizingMaskIntoConstraints = false
emojiView.delegate = self
textView.inputView = emojiView
Delegate
Conform to EmojiViewDelegate
// callback when tap a emoji on keyboard
func emojiViewDidSelectEmoji(_ emoji: String, emojiView: EmojiView) {
textView.insertText(emoji)
}
// callback when tap change keyboard button on keyboard
func emojiViewDidPressChangeKeyboardButton(_ emojiView: EmojiView) {
textView.inputView = nil
textView.keyboardType = .default
textView.reloadInputViews()
}
// callback when tap delete button on keyboard
func emojiViewDidPressDeleteBackwardButton(_ emojiView: EmojiView) {
textView.deleteBackward()
}
// callback when tap dismiss button on keyboard
func emojiViewDidPressDismissKeyboardButton(_ emojiView: EmojiView) {
textView.resignFirstResponder()
}
Customize
KeyboardSettings
This is a class to describe keyboard settings. Available properties:
bottomType- type of bottom view. Available variants:.pageControl,.categories. SeeBottomTypeenum. Default.pageControl.customEmojis- array of custom emojis. To describe emojis you have to useEmojiCategoryclass.isShowPopPreview- long press to pop preview effect like iOS10 system emoji keyboard. Default is true.countOfRecentsEmojis- the max number of recent emojis, if set 0, nothing will be shown. Default is 50.needToShowAbcButton- need to show change keyboard button. This button is located inCategoriesbottom view.needToShowDeleteButton- need to show delete button in the bottom view. Default is true.updateRecentEmojiImmediately- update the recent emoji list immediately when an emoji is selected. Default is true.
SwiftUI
SwiftUI components are distributed via Swift Package Manager only (the CocoaPods pod ships the UIKit sources). Requires iOS 13+.
Doesn't work on macOS SwiftUI natively.
EmojiTextField (recommended)
Replaces the system keyboard of a text field with the emoji keyboard. The Binding stays the single source of truth: emoji taps, the delete key and grapheme-cluster deletion (skin tones, ZWJ sequences) all keep it in sync.
import ISEmojiView
@State private var text = ""
EmojiTextField(
text: $text,
placeholder: "Tap to type",
bottomType: .categories,
needToShowAbcButton: true
)
.frame(height: 44)
EmojiView_SwiftUI (inline panel)
Embeds the keyboard directly in a view. EmojiView has no intrinsic content size, so give it an explicit frame.
import ISEmojiView
EmojiView_SwiftUI(
bottomType: .categories,
didSelect: { emoji in
print(emoji)
}
)
.frame(width: 300, height: 300)
All keyboard settings are applied when the underlying view is created. To change them later, recreate the view, for example with .id(...).
See SwiftUIExample/ for a runnable demo project.
License
MIT