diff --git a/modules/expo-emoji-picker/ios/EmojiPickerView.swift b/modules/expo-emoji-picker/ios/EmojiPickerView.swift index 65089a2af6..a1b6569325 100644 --- a/modules/expo-emoji-picker/ios/EmojiPickerView.swift +++ b/modules/expo-emoji-picker/ios/EmojiPickerView.swift @@ -1,11 +1,12 @@ import ExpoModulesCore -import WebKit import MCEmojiPicker class EmojiPickerView: ExpoView, MCEmojiPickerDelegate { let onEmojiSelected = EventDispatcher() - override func layoutSubviews() { + required init(appContext: AppContext? = nil) { + super.init(appContext: appContext) + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) self.addGestureRecognizer(tapGesture) } @@ -19,9 +20,19 @@ class EmojiPickerView: ExpoView, MCEmojiPickerDelegate { let reactRootVC = reactViewController() emojiPicker.sourceView = self emojiPicker.delegate = self + emojiPicker.arrowDirection = preferredArrowDirection() reactRootVC?.present(emojiPicker, animated: true) } + /// If the trigger sits in the bottom third of the screen there isn't enough + /// room below it for a usable popover, so anchor the picker above instead. + private func preferredArrowDirection() -> MCPickerArrowDirection { + guard let window = self.window else { return .up } + let frameInWindow = self.convert(self.bounds, to: window) + let threshold = window.bounds.height * (2.0 / 3.0) + return frameInWindow.midY >= threshold ? .down : .up + } + func didGetEmoji(emoji: String) { onEmojiSelected([ "emoji": emoji