【问题标题】:Create custom keyboard and configure it on your iPhone创建自定义键盘并在 iPhone 上进行配置
【发布时间】:2011-11-03 14:16:12
【问题描述】:

我正在创建由 EMOJI 提供的自定义键盘,其中包含字符和图形图标,如笑脸和其他日常使用的符号。到目前为止,我知道这些符号具有 unicode 标准添加到 Unicode Consortium 并获得 Apple 批准。

http://itunes.apple.com/us/app/emoji-free!/id332509635?mt=8

我需要有关注册这些符号的过程的帮助。是否有可能使键盘兼容iphone上安装的所有应用程序中的文本输入如果是这样如何继续?

注意:这些键盘是否被苹果批准或应用程序被拒绝......任何想法

任何帮助将不胜感激。

谢谢 维卡斯·奥哈

【问题讨论】:

    标签: iphone xcode keyboard configure customization


    【解决方案1】:

    表情符号键盘是 iOS 内置的。

    AppStore 上现有的所有“表情符号”应用程序(例如“无表情符号!”)唯一要做的就是在系统偏好设置中激活此键盘,因为默认情况下它是隐藏的。 这些应用程序不会“创建和安装”键盘本身,也不会安装图标和字形(符号),笑脸也已经内置在 iOS 中。

    例如,如果 iPhone 用户收到包含一些笑脸的短信 (SMS),他们会看到笑脸,即使他们没有安装任何“Emoji-enabler”应用程序,例如“Emoji-free!”。


    更准确地说,Apple 嵌入在 iPhone 字体中的表情符号图标并未获得 Unicode 标准的认可。它们位于 Unicode 的“私人”平面中:它们的代码点位于一个专为私人用途而保留的范围内——就像 Apple 通过将其用于这些表情符号所做的那样——但根据定义,它是一个私人区域,这些代码点在应用程序中没有专用名称和标准化用法(与 U+0041 等专用于表示拉丁字母“A”的字形的代码点相反)

    【讨论】:

    • 一些补充:自从我的回答以来,Unicode 6.0 版已经发布,表情符号字形的代码点已在专用平面上标准化,Apple 已在 iOS5 中采用此标准。因此,即使在 iOS4 中,表情符号字符位于 Unicode 的“私有”平面中,iOS5 现在也使用官方代码点(不在私有平面中)用于表情符号字形。 (为了兼容性起见,来自私人飞机的先前代码点仍显示表情符号字形,但当您插入表情符号字符时会使用新代码点)
    • 为什么默认隐藏键盘?还有其他默认隐藏的键盘吗?
    • 因为它在 iOS4 中使用私有 Unicode 代码点,所以只与其他 iPhone 兼容(将包含带有这些私有代码点的表情符号的消息发送到另一种手机或台式计算机会导致而是显示未知字符)。但从那时起,Unicode 6.0 标准已经发布,其中包含一个表情平面,其中包含用于表情符号字形的专用代码点,iOS5 和 iOS6 现在使用这些,它们与其他尊重 Unicode 6.0 标准的设备兼容,因此键盘使用官方代码点并且不再隐藏。
    • 感谢您的回复。我想创建一个应用程序来激活普什图语键盘,它不在设置>国际键盘列表中,但我怀疑它可能像以前 iOS 版本中隐藏的表情符号键盘一样被隐藏。普什图语键盘在 OS X 中可用,因此它也可能在 iOS 中可用。我怎样才能知道它是否存在于 iOS 中?
    • 我其实一点头绪都没有。也许使用越狱的 iPhone 可以检查嵌入 iOS 本身的文件并对此进行一些调查(但这不是我的专业领域)
    【解决方案2】:

    这是我为了制作表情符号键盘所做的。首先,我创建了一个带有两个按钮的自定义视图并设置 self.textView.inputAccessoryView = self.accessoryView 然后让这两个按钮执行以下操作:

    - (IBAction)emoticons:(id)sender 
    {
        [self.textView resignFirstResponder];
        self.textView.inputView = self.emotiview.view;
        [self.textView becomeFirstResponder];
    }
    
    - (IBAction)text:(id)sender 
    {
        [self.textView resignFirstResponder];
        self.textView.inputView = nil; // sets it back to it's initial form
        [self.textView becomeFirstResponder];
    }
    

    下面是用于创建所有按钮并将它们放入视图中的代码的 sn-p,该视图位于滚动视图中。

    for( int i = 0; i < self.emoticonsCharacters.count; i++ )
        {
            UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            button.frame = CGRectMake((i % 5)*50, 10 + 50*(i / 5), 45, 45);
            [button setTitle: [self.emoticonsCharacters objectAtIndex:i] forState:UIControlStateNormal];
            [button addTarget:self action:@selector(enterEmoticon:) forControlEvents:UIControlEventTouchDown];
            [self.emoticonsView1 addSubview:button];
        }
    

    这是所有表情符号字符的数组。

    -(NSArray*) emoticonsCharacters
    {
        if(!emoticonsCharacters)
        { 
            // unicode taken from http://www.easyapns.com/iphone-emoji-alerts
            emoticonsCharacters = [[NSArray alloc] initWithObjects:@"\ue415",@"\ue056",@"\ue057", @"\ue414",@"\ue405",  @"\ue418", @"\ue417", @"\ue40d", @"\ue40a", @"\ue404", @"\ue105", @"\ue409", @"\ue40e", @"\ue402", @"\ue108", @"\ue403", @"\ue058", @"\ue407", @"\ue401", @"\ue40f", @"\ue40b", @"\ue406", @"\ue413", @"\ue411", @"\ue412", @"\ue410", @"\ue107", @"\ue059", @"\ue416", @"\ue408", @"\ue40c", @"\ue11a", @"\ue10c", @"\ue32c", @"\ue32a", @"\ue32d", @"\ue328", @"\ue32b", @"\ue022", @"\ue023", @"\ue327", @"\ue329", @"\ue32e", @"\ue32f", @"\ue335", @"\ue334", @"\ue021", @"\ue337", @"\ue020", @"\ue336", @"\ue13c", @"\ue330", @"\ue331", @"\ue326", @"\ue03e", @"\ue11d", @"\ue05a", @"\ue00e", @"\ue421", @"\ue420", @"\ue00d", @"\ue010", @"\ue011", @"\ue41e", @"\ue012", @"\ue422", @"\ue22e", @"\ue22f", @"\ue231", @"\ue230", @"\ue427", @"\ue41d", @"\ue00f", @"\ue41f", @"\ue14c", @"\ue201", @"\ue115", @"\ue428", @"\ue51f", @"\ue429", @"\ue424", @"\ue423", @"\ue253", @"\ue426", @"\ue111", @"\ue425", @"\ue31e", @"\ue31f", @"\ue31d", @"\ue001", @"\ue002", @"\ue005", @"\ue004", @"\ue51a", @"\ue519", @"\ue518", @"\ue515", @"\ue516", @"\ue517", @"\ue51b", @"\ue152", @"\ue04e", @"\ue51c", @"\ue51e", @"\ue11c", @"\ue536", @"\ue003", @"\ue41c", @"\ue41b", @"\ue419", @"\ue41a", @"\ue04a", @"\ue04b", @"\ue049", @"\ue048", @"\ue04c", @"\ue13d", @"\ue443", @"\ue43e", @"\ue04f", @"\ue052", @"\ue053", @"\ue524", @"\ue52c", @"\ue52a", @"\ue531", @"\ue050", @"\ue527", @"\ue051", @"\ue10b", @"\ue52b", @"\ue52f", @"\ue528", @"\ue01a", @"\ue134", @"\ue530", @"\ue529", @"\ue526", @"\ue52d", @"\ue521", @"\ue523", @"\ue52e", @"\ue055", @"\ue525", @"\ue10a", @"\ue109", @"\ue522", @"\ue019", @"\ue054", @"\ue520", @"\ue306", @"\ue030", @"\ue304", @"\ue110", @"\ue032", @"\ue305", @"\ue303", @"\ue118", @"\ue447", @"\ue119", @"\ue307", @"\ue308", @"\ue444", @"\ue441", @"\ue436", @"\ue437", @"\ue438", @"\ue43a", @"\ue439", @"\ue43b", @"\ue117", @"\ue440", @"\ue442", @"\ue446", @"\ue445", @"\ue11b", @"\ue448", @"\ue033", @"\ue112", @"\ue325", @"\ue312", @"\ue310", @"\ue126", @"\ue127", @"\ue008", @"\ue03d", @"\ue00c", @"\ue12a", @"\ue00a", @"\ue00b", @"\ue009", @"\ue316", @"\ue129", @"\ue141", @"\ue142", @"\ue317", @"\ue128", @"\ue14b", @"\ue211", @"\ue114", @"\ue145", @"\ue144", @"\ue03f", @"\ue313", @"\ue116", @"\ue10f", @"\ue104", @"\ue103", @"\ue101", @"\ue102", @"\ue13f", @"\ue140", @"\ue11f", @"\ue12f", @"\ue031", @"\ue30e", @"\ue311", @"\ue113", @"\ue30f", @"\ue13b", @"\ue42b", @"\ue42a", @"\ue018", @"\ue016", @"\ue015", @"\ue014", @"\ue42c", @"\ue42d", @"\ue017", @"\ue013", @"\ue20e", @"\ue20c", @"\ue20f", @"\ue20d", @"\ue131", @"\ue12b", @"\ue130", @"\ue12d", @"\ue324", @"\ue301", @"\ue148", @"\ue502", @"\ue03c", @"\ue30a", @"\ue042", @"\ue040", @"\ue041", @"\ue12c", @"\ue007", @"\ue31a", @"\ue13e", @"\ue31b", @"\ue006", @"\ue302", @"\ue319", @"\ue321", @"\ue322", @"\ue314", @"\ue503", @"\ue10e", @"\ue318", @"\ue43c", @"\ue11e", @"\ue323", @"\ue31c", @"\ue034", @"\ue035", @"\ue045", @"\ue338", @"\ue047", @"\ue30c", @"\ue044", @"\ue30b", @"\ue043", @"\ue120", @"\ue33b", @"\ue33f", @"\ue341", @"\ue34c", @"\ue344", @"\ue342", @"\ue33d", @"\ue33e", @"\ue340", @"\ue34d", @"\ue339", @"\ue147", @"\ue343", @"\ue33c", @"\ue33a", @"\ue43f", @"\ue34b", @"\ue046", @"\ue345", @"\ue346", @"\ue348", @"\ue347", @"\ue34a", @"\ue349", @"\ue036", @"\ue157", @"\ue038", @"\ue153", @"\ue155", @"\ue14d", @"\ue156", @"\ue501", @"\ue158", @"\ue43d", @"\ue037", @"\ue504", @"\ue44a", @"\ue146", @"\ue50a", @"\ue505", @"\ue506", @"\ue122", @"\ue508", @"\ue509", @"\ue03b", @"\ue04d", @"\ue449", @"\ue44b", @"\ue51d", @"\ue44c", @"\ue124", @"\ue121", @"\ue433", @"\ue202", @"\ue135", @"\ue01c", @"\ue01d", @"\ue10d", @"\ue136", @"\ue42e", @"\ue01b", @"\ue15a", @"\ue159", @"\ue432", @"\ue430", @"\ue431", @"\ue42f", @"\ue01e", @"\ue039", @"\ue435", @"\ue01f", @"\ue125", @"\ue03a", @"\ue14e", @"\ue252", @"\ue137", @"\ue209", @"\ue154", @"\ue133", @"\ue150", @"\ue320", @"\ue123", @"\ue132", @"\ue143", @"\ue50b", @"\ue514", @"\ue513", @"\ue50c", @"\ue50d", @"\ue511", @"\ue50f", @"\ue512", @"\ue510", @"\ue50e", @"\ue21c", @"\ue21d", @"\ue21e", @"\ue21f", @"\ue220", @"\ue221", @"\ue222", @"\ue223", @"\ue224", @"\ue225", @"\ue210", @"\ue232", @"\ue233", @"\ue235", @"\ue234", @"\ue236", @"\ue237", @"\ue238", @"\ue239", @"\ue23b", @"\ue23a", @"\ue23d", @"\ue23c", @"\ue24d", @"\ue212", @"\ue24c", @"\ue213", @"\ue214", @"\ue507", @"\ue203", @"\ue20b", @"\ue22a", @"\ue22b", @"\ue226", @"\ue227", @"\ue22c", @"\ue22d", @"\ue215", @"\ue216", @"\ue217", @"\ue218", @"\ue228", @"\ue151", @"\ue138", @"\ue139", @"\ue13a", @"\ue208", @"\ue14f", @"\ue20a", @"\ue434", @"\ue309", @"\ue315", @"\ue30d", @"\ue207", @"\ue229", @"\ue206", @"\ue205", @"\ue204", @"\ue12e", @"\ue250", @"\ue251", @"\ue14a", @"\ue149", @"\ue23f", @"\ue240", @"\ue241", @"\ue242", @"\ue243", @"\ue244", @"\ue245", @"\ue246", @"\ue247", @"\ue248", @"\ue249", @"\ue24a", @"\ue24b", @"\ue23e", @"\ue532", @"\ue533", @"\ue534", @"\ue535", @"\ue21a", @"\ue219", @"\ue21b", @"\ue02f", @"\ue024", @"\ue025", @"\ue026", @"\ue027", @"\ue028", @"\ue029", @"\ue02a", @"\ue02b", @"\ue02c", @"\ue02d", @"\ue02e",@"\ue332",@"\ue333",@"\ue24e", @"\ue24f",@"\ue537", nil];
    
        }
        return emoticonsCharacters;
    }
    

    【讨论】:

    • 我很困惑,这只是一个越狱的 iPhone 还是苹果真的允许你做这些类型的定制???如果是这样我还能做什么???
    【解决方案3】:

    作为我之前回答的补充,您可以在您自己的应用程序上使用自定义键盘:您可以将任何 UIView 定义为 UITextField 或 UITextView 的“inputView”(检查inputView@property 在文档中)。

    例如,您可以编写 self.myTextField.inputView = myPicker;,其中 myPicker 是您之前创建的 UIDatePickerView(通过代码或在您的 XIB 文件中),当用户点击文本字段以使其成为焦点时(= 使其成为 firstResponder),而不是使用标准键盘,iOS 将显示 UIDatePicker。

    但这当然仅限于您的应用程序,以及您为其配置的 textFields 和 textViews。也就是说,它不显示为“备用输入键盘”,您可以使用键盘上的“地球图标”切换到,例如表情符号键盘或当您从 QWERTY 切换到 AZERTY(或您激活的任何其他键盘时)您的 iPhone 设置)。因此,这与您描述的“表情符号”案例的用法并不完全相同。

    【讨论】:

    • 好的,如果这仅限于我的 textview/textfields 仅在我的应用程序中只有包含表情符号的文本。因此,此文本在其他 iPhone 上是否可见,与从我的设备发送时显示的方式相同...?
    • 是的,因为每个 iOS 设备(iPhone、iPad、iPod)都包含在其 Unicode 表中具有显示表情符号所需字符的字体。因此,任何 iPhone 都可以将这些 Unicode 代码点显示为表情符号,因为它们都包含相应的字形。对于任何其他设备,因为它们没有用于这些 Unicode 代码点的那些表情符号字形(但可能没有,可能是一些用于不同用途的私有字形),它们将无法显示它
    • 实际上,即使是 iOS 中嵌入的每种字体的 Unicode 表中的更特殊的字形,效果也与您拥有特定字体(想想 Webdings、Wingdings 或Dingbats):只要接收者有字体,它就能够显示相同的字形,并且这些字形将被渲染相同。但是如果它没有字体,这将呈现不同的或至少不像预期的那样。这与 Unicode 私有代码点范围的想法完全相同。
    【解决方案4】:

    【讨论】:

    • 嗨 Narayanan Ramamoorthy,您提供的示例是 gr8 帮助,但我如何将其配置为键盘类型或其他应用程序,在一部 iphone 上编写的文本(图像/符号)也可以在其他完全相同的形式
    • 我刚刚发送了关注的链接。请先尝试一下
    • 嗨 Narayanan,我没有在你的帖子中找到任何链接,你可以检查一下
    猜你喜欢
    • 2011-09-27
    • 2010-10-21
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多