TextKit框架详细解析 (十一) —— 文本编程指南之输入数据的自定义视图(七)

版本记录

版本号 时间
V1.0 2018.09.01

前言

TextKit框架是对Core Text的封装,用简洁的调用方式实现了大部分Core Text的功能。 TextKit是一个偏上层的开发框架,在iOS7以上可用,使用它可以方便灵活处理复杂的文本布局,满足开发中对文本布局的各种复杂需求。TextKit实际上是基于CoreText的一个上层框架,其是面向对象的。接下来几篇我们就一起看一下这个框架。感兴趣的看下面几篇文章。
1. TextKit框架详细解析 (一) —— 基本概览和应用场景(一)
2. TextKit框架详细解析 (二) —— 基本概览和应用场景(二)
3. TextKit框架详细解析 (三) —— 一个简单布局示例(一)
4. TextKit框架详细解析 (四) —— 一个简单布局示例(二)
5. TextKit框架详细解析 (五) —— 文本编程指南之简介(一)
6. TextKit框架详细解析 (六) —— 文本编程指南之展示文本内容(二)
7. TextKit框架详细解析 (七) —— 文本编程指南之排版概念(三)
8. TextKit框架详细解析 (八) —— 文本编程指南之管理Text Fields and Text Views(四)
9. TextKit框架详细解析 (九) —— 文本编程指南之管理键盘(五)
10. TextKit框架详细解析 (十) —— 文本编程指南之复制、剪切和粘贴操作(六)

Custom Views for Data Input - 输入数据的自定义视图

UIKit允许应用程序替换系统键盘的自定义输入视图。 它还使应用程序在系统键盘或自定义输入视图上方具有附件视图。 此外,当用户点击输入视图或输入附件视图的控件时,它使应用程序能够播放按键点击声音。


Input Views and Input Accessory Views - 输入视图和输入附件视图

UIKit框架包括对自定义输入视图和输入附件视图的支持。当用户在视图中编辑文本或其他形式的数据时,您的应用可以用自己的输入视图替换系统键盘。例如,应用程序可以使用自定义输入视图从符文字母表中输入字符。您还可以将输入附件视图附加到系统键盘或自定义输入视图;此附件视图沿主输入视图的顶部运行,并且可以包含(例如)以某种方式影响文本的控件或显示有关文本的某些信息的label。

要获得此功能,如果您的应用程序使用UITextViewUITextField对象进行文本编辑,只需将自定义视图分配给inputViewinputAccessoryView属性即可。当文本对象成为第一响应者时,将显示这些自定义视图。

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

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

当响应者对象成为第一个响应者并且inputView(或inputAccessoryView)不是nil时,UIKit将输入视图设置为在父视图下方的位置(或将输入附件视图附加到输入视图的顶部)。第一个响应者可以通过调用UIResponderreloadInputViews方法重新加载输入和附件视图。

UITextView类将inputViewinputAccessoryView属性重新声明为readwrite。 UITextView对象的客户端只需要获取输入和输入附件视图 - 通过加载nib文件或在代码中创建视图 - 并将它们分配给它们的属性。自定义视图类(以及从UIResponder继承的其他子类)应重新声明这些属性及其后备实例变量中的一个或两个,并重写属性的getter方法 - 即,不合成属性的访问器方法。在他们的getter-method实现中,他们应该返回视图,如果它还不存在则加载或创建它。

您可以在定义输入视图或输入附件视图的大小和内容方面具有很大的灵活性。虽然这些视图的高度可以是您想要的,但它们应该与系统键盘的宽度相同。如果UIKit在其自动调整掩码中遇到具有UIViewAutoresizingFlexibleHeight值的输入视图,则会更改高度以匹配键盘。输入视图和输入附件视图可能具有的子视图(例如控件)的数量没有限制。有关输入视图和输入附件视图的更多指导,请参阅iOS Human Interface Guidelines

要在运行时加载nib文件,首先在Interface Builder中创建输入视图或输入附件视图。然后在运行时获取应用程序的主包并调用loadNibNamed:owner:options:,传递nib文件的名称,nib文件的文件所有者以及任何选项。此方法返回nib中顶级对象的数组,其中包括输入视图或输入附件视图。将视图分配给其对应的属性。有关此主题的更多信息,请参阅Resource Programming Guide中的Nib Files

Listing 6-1说明了一个自定义视图类,它在inputAccessoryView的 getter方法中懒创建其输入附件视图。

// Listing 6-1  Creating an input accessory view programmatically

- (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发布了UIKeyboardWillShowNotificationUIKeyboardDidShowNotificationUIKeyboardWillHideNotificationUIKeyboardDidHideNotification通知。 观察这些通知的对象可以获得与输入视图和输入附件视图相关的几何信息,并相应地调整编辑的视图。 有关示例和相关信息,请参阅Keyboards and Input Methods


Playing Input Clicks

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

1. Adopting the UIInputViewAudioFeedback Protocol - 采取UIInputViewAudioFeedback协议

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

  • 1)在Xcode项目中,创建UIView类的子类。 在头文件中,指示子类符合UIInputViewAudioFeedback协议,如下所示:
@interface KeyboardAccessoryView:UIView <UIInputViewAudioFeedback> {
}
- (BOOL)enableInputClicksWhenVisible {
     返回YES;
}
  • 3)最后,在自定义输入或附件视图的Interface Builder文档中,选择View对象。 在Identity检查器中,将对象的类设置为UIView子类。

2. Playing Input Clicks - 进行输入播放点击

要在自定义输入或键盘附件视图中点击按键,请首先确保视图采用UIInputViewAudioFeedback协议,如Adopting the UIInputViewAudioFeedback Protocol中所述。 然后,对于要为其提供单击声音的每个tap,请调用UIDevice类的playInputClick方法,如下所示:

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

系统自动管理音频会话以进行自定义输入点击,包括根据需要进行audio ducking。 (有关音频会话的信息,请参阅Audio Session Programming Guide。)

后记

本篇主要讲述了输入数据的自定义视图,感兴趣的给个赞或者关注~~~

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

推荐阅读更多精彩内容