为数据输入自定义视图 <- iOS文本编程指南

UIKit允许app用自定义的输入视图替换系统键盘。它还允许app有一个附加视图在系统键盘或自定义输入视图之上。另外,它允许app在用户点击输入视图或输入附件视图的控件的时候播放键盘敲击音。

输入视图和输入附加视图

UIKit框架包括对自定义输入视图和输入附加视图的支持。当用户在视图中编辑文本或其他数据格式的时候,app可以用自己的输入视图来替换系统键盘。例如,app可以使用自定以输入视图来输入符文字母。你还可以给系统键盘或自定义输入视图添加输入附加视图,这个附加视图在主输入视图之上,例如,以某种方式影响文本的控件,或显示相关文本的一些信息。

如果你的app使用UITextView和UITextField对象来编辑文本,想要获取该功能,可以简单的分配自定义视图到inputView和inputAccessoryView属性。这些自定义视图在文本对象变为第一响应者的时候显示。

你的输入视图和输入附加视图不限于框架提供的文本对象。任何直接或者间接继承UIResponder的类(通常是自定义视图)都可以指定它自己的输入视图和输入附加视图。UIResponder类为输入视图和输入附加视图声明了两个属性:

@property (readonly, retain) UIView *inputView;
@property (readonly, retain) UIView *inputAccessoryView;

当响应对象变为第一响应者并且inputView(或者inputAccessoryView)不是nil的时候,UIKit可以动画的把输入视图放置在父视图之下(或者把输入附加视图放置在输入视图之上)。第一响应者可以通过调用UIResponder的reloadInputViews方法来重新家在输入和附加视图。

UITextView类重写了inputView和inputAccessoryView属性。UITextView对象的客户端只需要获取输入和输入附加视图(可以通过加载nib文件或通过代码的方式创建),并把它们分配给对象的属性。自定义视图类(以及UIResponder的其他子类)应该声明这两个属性以及它们的后背实例变量(backing instance variables)的一个或两个,并重写属性的getter方法,不要合成属性的访问器方法。在它们的getter方法实现中,它们应该返回视图,如果它不存在,就应该加载或创建。

你在定义输入视图或输入附加视图时有很大的灵活性。尽管这些视图的高度可以随你喜欢,但是它们应该有和系统键盘一样的宽度。如果UIKit在它的autoresizing mask中遇到带有UIViewAutoresizingFlexibleHeight值的输入视图,它会把高度设置为和键盘匹配。输入视图和输入附加视图可能拥有的子视图(例如控件)是没有数量限制的。更多输入视图和输入附加视图的指导,参见iOS Human Interface Guidelines。

想要在运行的时候加载nib文件,首先在Interface Builder中创建输入视图或输入附加视图。然后在运行时得到app的主束,并且在其上调用loadNibNamed:owner:options: ,传递nib文件的名字、nib文件的File‘s Owner、以及任何可选项。该方法返回nib文件中的顶层对象的数组,其中包括了输入视图和输入附加视图。把该视图分配给它的相应属性。更多关于此主题的内容,参见Resource Programming Guide中的Nib Files 。

代码清单 6-1说明了一个自定义视图类在inputAccessoryView的getter方法中懒创建它的输入附加视图。

代码清单 6-1 用编程的方式创建输入附加视图

- (UIView *)inputAccessoryView {
    if (!inputAccessoryView) {
        CGRect accessFrame = CGRectMake(0.0, 0.0, 768.0, 77.0);
        inputAccessoryView = [[UIView alloc] initWithFrame:accessFrame];
        inputAccessoryView.backgroundColor = [UIColor blueColor];
        UIButton *compButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        compButton.frame = CGRectMake(313.0, 20.0, 158.0, 37.0);
        [compButton setTitle: @"Word Completions" forState:UIControlStateNormal];
        [compButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [compButton addTarget:self action:@selector(completeCurrentWord:)
            forControlEvents:UIControlEventTouchUpInside];
        [inputAccessoryView addSubview:compButton];
    }
    return inputAccessoryView;
}

输入视图和输入附加视图的自视图可以是你希望的任何东西。如果它们是按钮或者其他控件,你需要为每个控件指定目标和方法,并且实现相关的动作方法来执行数据输入或操作。

就像系统键盘一样,UIKit也发送UIKeyboardWillShowNotification, UIKeyboardDidShowNotification, UIKeyboardWillHideNotification, 和 UIKeyboardDidHideNotification 通知。该对象观察这些通知,可以得到输入视图和输入附加视图的相关的几何信息,并调整相应的编辑视图。有关示例和相关信息,参见Keyboards and Input Methods。

播放输入点击

当用户点击自定义输入视图和键盘附加视图的时候,你可以播放标准的系统键盘点击音。首先,在你的输入视图中采用UIInputViewAudioFeedback协议。然后,当响应该视图的键盘点击的时候调用playInputClick方法。

采用UIInputViewAudioFeedback协议

执行以下三个步骤来采用UIInputViewAudioFeedback协议:

  1. 在你的Xcode项目中,创建UIView类的子类。在头文件中,指明该子类遵守UIInputViewAudioFeedback协议,就像这样:
@interface KeyboardAccessoryView : UIView <UIInputViewAudioFeedback> {
}
  1. 在你的UIView子类的实现文件中,实现enableInputClicksWhenVisible方法,如下所示:
 - (BOOL) enableInputClicksWhenVisible {
    return YES;
}
  1. 最后,在你的自定输入或附加视图的Interface Builder文件中,选择该视图对象。在身份检查器中,设置该对象的类为你的UIView子类。
播放输入点击

想要在点击自定义输入或键盘附加视图的键时播放输入点击音,首先要确认该视图采用了UIInputViewAudioFeedback协议。然后,为每个点击提供你想要的点击声音,调用UIDevice类的playInputClick方法,如下所示:

- (void) playClickForCustomKeyTap {
   [[UIDevice currentDevice] playInputClick];
}

系统自动为自定义输入点击管理音频会话,包括根据需要的音频回避。(更多关于音频会话的信息,参见Audio Session Programming Guide。)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容