Text Programming Guide for iOS - 07 - Custom Views for Data Input

123 阅读5分钟

数据输入的自定义视图

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

输入视图和输入附件视图

UIKit框架包括对自定义输入视图(input views)和输入附件视图(input accessory views.)的支持。当用户在视图中编辑文本或其他形式的数据时,你的应用程序可以用它自己的输入视图代替系统键盘。例如,应用程序可以使用自定义输入视图从符文字母表中输入Characters。还可以将输入附件视图附加到系统键盘或自定义输入视图;这个附属视图在主输入视图的顶部,例如,以某种方式影响文本的控件或显示有关文本的一些信息的Labels。

如果您的应用程序使用UITextView和UITextField对象进行文本编辑,要获得此功能,只需将自定义视图分配给inputView和inputAccessoryView属性。当text对象成为第一响应程序时,这些自定义视图就会显示出来。

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

@property (readonly, retain) UIView *inputView;

@property (readonly, retain) UIView *inputAccessoryView;

当responder对象成为第一响应者并且inputView(或inputAccessoryView)不是nil时,UIKit将输入视图以动画的形式显示到父视图下方(或将输入附件视图附加到输入视图顶部)。第一个响应者可以通过调用UIResponder的reloadInputViews方法重新加载输入和附件视图。

UITextView类将inputView和inputAccessoryView属性重新声明为readwrite。UITextView对象的客户端只需要持有输入视图和输入附属视图(通过加载nib文件或在代码中创建视图),并将它们分配给它们的属性。自定义视图类应该重新声明这两个属性中的一个或两个,并覆盖属性的getter方法——也就是说,不要合成属性的访问方法。在它们的getter-method实现中,它们应该返回这个视图,如果视图不存在,则加载或创建视图。也就是实现一个懒加载。

在定义输入视图或输入附件视图的大小和内容时,你有很大的灵活性。尽管这些视图的高度可以是你想要的,但它们应该与系统键盘的宽度相同。如果设置了UIViewAutoresizingFlexibleHeight值的输入视图,它会改变高度以匹配键盘(自己实验一下就明白了)。输入视图和输入附件视图的子视图(如控件)数量没有限制。有关输入视图和输入附件视图的更多指导,请参阅iOS人机界面指南。

要在运行时加载nib文件,首先在Interface Builder中创建输入视图或输入附件视图。然后在运行时获取应用程序的主包并在其上调用loadNibNamed:owner:options:,传递nib文件的名称、nib文件的所有者和任何选项。这个方法返回nib中顶层对象的数组,其中包括输入视图或输入附属视图。将视图赋值给相应的属性。有关此主题的更多信息,请参见资源编程指南中的Nib文件。(如果你的公司还在用nib的话,可以试试)

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

播放输入点击

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

采用UIInputViewAudioFeedback协议

要采用UIInputViewAudioFeedback协议,请执行以下三个步骤。

  1. 在Xcode项目中,创建UIView类的一个子类。在头文件中,指出这个子类符合UIInputViewAudioFeedback协议,如下所示:
@interface KeyboardAccessoryView : UIView <UIInputViewAudioFeedback>  {
}
  1. 在你的UIView子类的实现文件中,实现enableInputClicksWhenVisible方法,如下所示:
- (BOOL) enableInputClicksWhenVisible {
    return YES;
}

最后,在自定义输入视图或附件视图的Interface Builder文档中,选择视图对象。在标识检查器中(Identity inspector),将对象的类设置为UIView的子类。

播放输入点击

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

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

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