English | 中文
An easy to use Emoji keyboard for iOS.
Has been rewritten with swift, the old Objective-C version on branch oc.
- Written in Swift
- Custom emojis
- Multiple skin tone support ( 🏻 🏼 🏽 🏾 🏿 )
- Categories bottom bar (like iOS system emoji Keyboard)
- Recently used emoji
- Dark Mode (#58)
- SwiftUI support.
- Latest emoji data (Unicode 17)
- Grid density adapts to the device, like the system keyboard
- Slide across the category bar to switch categories
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.
- Swift 5
- iOS 15+
via Swift Package Manager Install to your project,Add in Package.swift:
.package(name: "ISEmojiView", url: "https://github.com/isaced/ISEmojiView.git", .upToNextMinor(from: "1.0.0")),In Xcode:
- File > Swift Packages > Add Package Dependency
- Add https://github.com/isaced/ISEmojiView.git
- Select "Up to Next Major" with "1.0.0"
# Swift
pod 'ISEmojiView'
# Objective-C (Deprecated)
pod 'ISEmojiView', '0.0.1'github "isaced/ISEmojiView"import ISEmojiViewlet keyboardSettings = KeyboardSettings(bottomType: .categories)
let emojiView = EmojiView(keyboardSettings: keyboardSettings)
emojiView.translatesAutoresizingMaskIntoConstraints = false
emojiView.delegate = self
textView.inputView = emojiViewConform 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()
}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.
let keyboardSettings = KeyboardSettings(bottomType: .categories)
keyboardSettings.customEmojis = [
EmojiCategory(
category: .custom(title: "My Title", imageName: "ic_customCategory"),
emojis: [
Emoji(variants: ["😂"]),
// more than one variant: long-press to pick, like skin tones
Emoji(variants: ["🤝", "🤝🏽", "🤝🏿"])
]
)
]imageName is looked up in your app bundle for the category bar icon.
SwiftUI components are distributed via Swift Package Manager only (the CocoaPods pod ships the UIKit sources).
Doesn't work on macOS SwiftUI natively.
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)Embeds the keyboard directly in a view. EmojiView has no intrinsic content size, so give it an explicit frame.
import ISEmojiView
EmojiKeyboardView(
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.
MIT


