如何禁用 iOS 8 表情符号键盘?
Posted
技术标签:
【中文标题】如何禁用 iOS 8 表情符号键盘?【英文标题】:How to disable iOS 8 emoji keyboard? 【发布时间】:2014-09-16 05:48:13 【问题描述】:在 ios 8 中是否有停止显示表情符号键盘的选项?它在小键盘和安全文本中不可用,但对于电子邮件,它就在那里。 如果无法禁用它,如何从表情符号中获取字符串值?
【问题讨论】:
How to disable the emoji keyboard in iOS 7?的可能重复 【参考方案1】:试试这个:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
if ([textField isFirstResponder])
if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage])
return NO;
return YES;
更多信息请见here。
编辑:
您可以使用以下代码从键盘隐藏表情符号:
txtField.keyboardType=UIKeyboardTypeASCIICapable;
编辑:
使用界面生成器从键盘隐藏表情符号选择。
【讨论】:
另一个提示:您可以直接从 Xcode/Interface Builder 设置。 隐藏在 IB 中是不错的选择。我喜欢它。谢谢。 如果 emoji 是从另一个文本字段复制的,如果只接受 ASCII 字符 string.canBeConvertedToEncoding(NSASCIIStringEncoding),或者如果只是 emoji 应该被删除,这个库可以使用github.com/woxtu/NSString-RemoveEmoji 需要注意的是,将键盘类型更改为 ASCII Capable 也会删除其他国际键盘的访问权限。 回答得好! :)【参考方案2】:这适用于 iOS 7 和 8:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
// Disable emoji input
return [textField textInputMode] != nil;
【讨论】:
唯一没有过时方法的实际工作!【参考方案3】:只是为遇到与我相同问题的任何人更新上面的精彩答案:
-
设置为keyboardType = .EmailAddress 的电子邮件字段仍然允许使用表情符号
您可能要过滤多个条件
斯威夫特
防止C&P
这就是我们的做法:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
if !string.canBeConvertedToEncoding(NSASCIIStringEncoding)
return false
//other conditons
编辑
好的,如果您想允许某些字符用于其他语言,那么使用 NSASCIIStringEncoding 的解决方案并不好。
一些字母被 NSASCIIStringEncoding 屏蔽:
a 的所有其他版本:àáâaaæãåā 所有其他版本的 e:èéêëēėę o 的所有其他版本:ôöòóœøōõ如果您想支持其他国家/地区的用户,则使用 NSASCIIStringEncoding 不是一个好主意!
我也试过 NSISOLatin1StringEncoding:
被屏蔽的 a: ā 已屏蔽的 e:ēėę o 的屏蔽版本:œø这明显好多了。
我也试过 NSISOLatin2StringEncoding:
被屏蔽的 a: àæãåā 已屏蔽的 e:èêēė 版本 o 的屏蔽版本:òœøōõ更糟。
编辑2:
以下似乎有效:
extension String
func containsEmoji() -> Bool
for i in self.characters
if i.isEmoji()
return true
return false
extension Character
func isEmoji() -> Bool
return Character(UnicodeScalar(0x1d000)) <= self && self <= Character(UnicodeScalar(0x1f77f))
|| Character(UnicodeScalar(0x1f900)) <= self && self <= Character(UnicodeScalar(0x1f9ff))
|| Character(UnicodeScalar(0x2100)) <= self && self <= Character(UnicodeScalar(0x26ff))
现在我们调用:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
if string.containsEmoji()
return false
//other conditons
【讨论】:
【参考方案4】:对我有用的解决方案:
self.texField.keyboardType = UIKeyboardTypeASCIICapable;
表情符号键盘不适用于该键盘类型。
但必须检查文本字段中添加的每个字符的类型,因为用户可以从其他地方复制表情符号然后将其粘贴。
你可以这样做:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
return [text canBeConvertedToEncoding:NSASCIIStringEncoding];
请注意,正如我在另一篇文章中所读到的,这也可能会阻止用户使用带有特殊字符的键盘,例如中文键盘。
【讨论】:
这应该是被接受的答案,因为人们仍然可以使用上面接受的答案复制/粘贴表情符号【参考方案5】:虽然问题已经很老了, 我遇到了同样的问题,并且在这个小技巧加载此页面时能够解决它:
只需在 Interface Builder Xcode 8.2.1 中选择“ASCII Capable”或“数字和标点符号”
输出没有表情符号键盘=D
我相信它会帮助某人 =)
【讨论】:
请不要添加same answer to multiple questions。一旦您获得足够的声誉,就回答最好的一个并将其余的标记为重复项。如果不是重复的,请根据问题调整帖子并标记以取消删除。【参考方案6】:textField.keyboardType = .asciiCapable
【讨论】:
【参考方案7】:Swift 3.1 解决方案
// MARK: - Text Field Delegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
return textField.textInputMode != nil
【讨论】:
为我工作!【参考方案8】:这是快速版本。
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool
if textView.isFirstResponder()
if textView.textInputMode?.primaryLanguage == nil || textView.textInputMode?.primaryLanguage == "emoji"
return false;
return true;
【讨论】:
【参考方案9】:我想要一个适用于 shouldChangeTextInRange
的 Swift 3.0 的答案,并想出了以下非常简单的方法,并且可以处理 任何 语言(我附上了一张使用中文的照片演示)。
guard 语句解开可选文本,return 语句检查它是否提取了满足trimmingCharacters
检查的值。如果有一个值(表示它不是当前设备输入语言的一部分),那么它不会为空,因此该方法返回 false 并且不允许输入字符。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else
return true
return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty
这依赖于 Apple 的 CharacterSet.alphanumerics
,因此无需维护和更新已批准字符的列表,除非您想添加或删除项目。
支持语言不可知论者!
另一个常见用途是电子邮件,因为默认的电子邮件键盘提供表情符号。我发现,只要稍加修改,我就可以将字符限制为我想要的电子邮件地址。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else
return true
return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty ||
!text.characters.filter $0 == "@" || $0 == "." .isEmpty
【讨论】:
【参考方案10】:你可以试试这个(Swift 5)。
创建字符串扩展:
extension String
func containsEmoji() -> Bool
for scalar in unicodeScalars
if !scalar.properties.isEmoji continue
return true
return false
然后像这样在 UITextFieldDelegate 中使用它:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
if string.containsEmoji() return false
return true
【讨论】:
这也将任何星号 (*) 标记为表情符号 似乎是最干净的解决方案。谢谢!【参考方案11】:对于需要国际键盘的用户,这在 iOS 9 及更高版本上运行良好:
添加以下扩展函数以检查字符串是否包含表情符号:
extension String
var containsEmoji: Bool
for scalar in unicodeScalars
switch scalar.value
case 0x3030, 0x00AE, 0x00A9,// Special Characters
0x1D000...0x1F77F, // Emoticons
0x2100...0x27BF, // Misc symbols and Dingbats
0xFE00...0xFE0F, // Variation Selectors
0x1F900...0x1F9FF: // Supplemental Symbols and Pictographs
return true
default:
continue
return false
另一个从字符串中删除表情符号的扩展函数:
extension String
var minusEmojis: String
let emojiRanges = [0x1F601...0x1F64F, 0x2702...0x27B0, 0x1D000...0x1F77F, 0x2100...0x27BF, 0xFE00...0xFE0F, 0x1F900...0x1F9FF]
let emojiSet = Set(emojiRanges.joined())
return String(self.filter !emojiSet.contains($0.unicodeScalarCodePoint) )
将目标添加到您的文本字段,如下所示:
textField.addTarget(self, action: #selector(didChangeText), for: .editingChanged)
最后从目标选择器中删除所有表情符号:
@objc func didChangeText(field: UITextField)
if (field.text?.containsEmoji == true)
field.text = field.text?.minusEmojis
希望这对某人有所帮助!干杯。
【讨论】:
【参考方案12】:在 Swift 中: - 它会限制在 TextView 中超过表情符号,只需将键盘类型更改为支持 ascii
func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool
var result = Bool()
let disallowedCharacterSet1 = NSCharacterSet.symbolCharacterSet()
let replacementStringIsLegal = text.rangeOfCharacterFromSet(disallowedCharacterSet1) == nil
result = replacementStringIsLegal
let newLength = textView.text!.utf16.count + text.utf16.count - range.length
return newLength <= 300 && result // Bool
【讨论】:
以上是关于如何禁用 iOS 8 表情符号键盘?的主要内容,如果未能解决你的问题,请参考以下文章