如何禁用iOS 8表情符号键盘?

时间:2014-09-16 05:48:14

标签: ios ios8

有没有选择停止在iOS 8中显示表情符号键盘?它不适用于小键盘和安全文本,但对于电子邮件,它就在那里。 如果无法禁用它如何从表情符号中获取字符串值?

12 个答案:

答案 0 :(得分:105)

试试这个:

- (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;

编辑:

使用“界面”构建器隐藏键盘中的表情符号选择。

enter image description here

答案 1 :(得分:17)

适用于iOS 7和8:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Disable emoji input
    return [textField textInputMode] != nil;
}

答案 2 :(得分:10)

只是为面对与我相同问题的任何人更新上面的好答案:

  1. 设置为keyboardType = .EmailAddress的电子邮件字段仍允许使用emojis
  2. 您可能有多个要过滤的条件
  3. 夫特
  4. 预防C& P
  5. 我们就是这样做的:

    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))
        }
    }
    

    修改

    如果你想允许某些字符用于其他语言,那么使用NSASCIIStringEncoding的解决方案就不好了。

    使用NSASCIIStringEncoding阻止了一些字母:

    • a的所有其他版本:àáâäæãåā
    • 所有其他版本的e:èéêëēėę
    • 所有其他版本的o:ôöòóœøōõ

    如果您想支持来自其他国家/地区的用户,使用NSASCIIStringEncoding不是一个好主意!

    我也试过NSISOLatin1StringEncoding:

    • a:ā
    • 的屏蔽版本
    • 封锁版本的e:ēėę
    • o:œø
    • 的屏蔽版本

    这要清楚得多。

    我也尝试过NSISOLatin2StringEncoding:

    • a:àæãåā
    • 的屏蔽版本
    • 电子邮件的封锁版本:èêēė
    • o:òœøōõ
    • 的屏蔽版本

    更糟。

    <强> EDIT2:

    以下似乎有效:

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if string.containsEmoji() {
            return false
        }
        //other conditons
    }
    

    现在我们打电话:

    $mysqli = new mysqli("localhost", "user", "password", "database");
    

答案 3 :(得分:8)

对我有用的解决方案:

self.texField.keyboardType = UIKeyboardTypeASCIICapable;

表情符号键盘无法使用该KeyboardType。

但是必须检查textField中添加的每个字符的种类,因为用户可以从其他地方复制表情符号,然后将其粘贴。

以下是您可以这样做的方法:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
     return [text canBeConvertedToEncoding:NSASCIIStringEncoding];
}

请注意,正如我在另一篇文章中所读到的那样,这也可能会阻止用户使用带有特殊字符的键盘,例如中文字符。

答案 4 :(得分:6)

在swift 3.0中

textField.keyboardType = .asciiCapable

答案 5 :(得分:5)

虽然问题超级老, 我遇到了同样的问题,并且能够通过这个小技巧加载此页面时解决它:

  

只需选择&#34; ASCII Capable&#34;或&#34;数字和标点&#34;在Interface Builder Xcode 8.2.1

enter image description here enter image description here

输出为无表情符号键盘= D

enter image description here

我确定它会帮助某人=)

答案 6 :(得分:2)

这是快速版本。

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;
}

答案 7 :(得分:2)

我想要一个适用于@GsonTypeAdapterFactory的Swift 3.0的答案,并提出以下非常简单的方法,可以处理你强加的任何语言(我包含一张照片)用中文来证明)。

guard语句解包可选文本,return语句检查它是否提取了满足shouldChangeTextInRange检查的值。如果有一个值(意味着它不是当前设备的输入语言的一部分),那么它将不为空,因此该方法返回false并且不允许输入该字符。

trimmingCharacters

这取决于Apple 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 } ,因此无需维护和更新已批准字符列表,除非您要添加或删除项目。

enter image description here

Yay for language agnostic!

另一个常见用途是电子邮件,因为默认的电子邮件键盘提供了表情符号。我找到了一个小修改,我能够将字符限制为我想要的电子邮件地址。

CharacterSet.alphanumerics

答案 8 :(得分:2)

  

Swift 3.1解决方案

// MARK: - Text Field Delegate

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return textField.textInputMode != nil
    }

答案 9 :(得分:1)

对于那些需要国际键盘的人来说,这在iOS 9及更高版本上效果很好:

  1. 添加以下扩展功能以检查字符串是否包含表情符号:

    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
       }
    }
    
  2. 另一个扩展功能,用于从字符串中删除表情符号:

    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) })
       }
    }
    
  3. 将目标添加到您的文本字段中,如下所示:

    textField.addTarget(self, action: #selector(didChangeText), for: .editingChanged)
    
  4. 最后从目标选择器中删除所有出现的表情符号:

    @objc func didChangeText(field: UITextField) {
         if (field.text?.containsEmoji == true) {
            field.text = field.text?.minusEmojis
        }
    }
    

希望这对某人有帮助!干杯。

答案 10 :(得分:1)

您可以尝试使用此方法(快速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 :(得分:0)

在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

}