如何禁用 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 表情符号键盘?的主要内容,如果未能解决你的问题,请参考以下文章

Ionic / Cordova / Phonegap:有没有办法在iOS和Android上禁用表情符号键盘?

在iOS 9.0中以编程方式显示表情符号键盘

iOS 8 自定义键盘

iOS崩溃:在键盘上敲击地球仪以转到表情符号键盘会导致崩溃

如何在其他设备上显示我的键盘扩展的表情符号

如何使用 swiftui 创建表情符号键盘?