iPhone应用程序编程指南(文本和Web)

关于文本和Web的支持

文本视图

UIKit框架提供三个显示文本内容的基本类:

虽然标签和文本编辑框通常用于显示相对少量的文本,但实际上这些类可以显示任意数量的文本。

在使用可编辑的文本视图时,您必须提供一个委托对象,负责管理编辑会话。文本视图会向委托对象发送几个不同的通告,让它知道编辑何时开始,何时结束,并使它有机会重载某些编辑动作。

Web视图

除了显示内容,您还可以用web视图对象来显示web表单,收集用户输入。和UIKit的其它文本类相似,如果您在web页面的表单中有可编辑的文本框,则轻触该文本框就会弹出键盘,用户可以通过键盘输入文本。这是web浏览整体体验的一部分,web视图会自行管理键盘的显示和消除。

web视图通过其关联的委托对象提供有关网页何时被装载、及装载过程是否发生错误的信息。web委托是指实现一个或多个UIWebViewDelegate协议方法的对象。您可以通过实现委托方法来响应装载错误或处理一些与装载有关的其它任务。

键盘和输入法

每当用户触击一个可以接受文本输入的对象时,该对象就会请求系统显示一个合适的键盘。根据用户程序的需要和偏好的语言,系统可以显示几种不同的键盘。您的应用程序虽然不能控制用户的偏好语言(因此也不能控制键盘的输入法),但可以控制键盘的使用属性,比如特殊键的配置及其行为。

您可以直接通过应用程序中的文本对象来配置键盘的属性。UITextFieldUITextView类都遵循UITextInputTraits协议,该协议定义了一些配置键盘的属性。在程序或Interface Builder的查看器窗口中设置这些属性就可以使系统显示指定类型的键盘。

请注意:虽然UIWebView类并不直接支持UITextInputTraits协议,但您还是可以配置文本输入元素的一些键盘属性。特别值得一提的是,您可以在输入元素的定义中包含autocorrectautocapitalization属性,通过这些属性来指定键盘的行为,如下面的例子所示:

<input type="text" size="30" autocorrect="off" autocapitalization="on">
您不能在输入元素中指定键盘的类型。web视图显示的是缺省的键盘,但包含一些额外的控制,可以进行表单元素之间漫游。

 

管理键盘

接收键盘通告

当键盘被显示或隐藏的时候,iPhone OS会向所有经过注册的观察者对象发出如下通告

当键盘首次出现或者消失,以及键盘的所有者或应用程序的方向发生变化的任何时候,系统都会发出键盘通告。

在上述的各种情况下,系统只发送与具体场景相关的的消息集合。举例来说,如果键盘的所有者发生变化,系统只向当前的拥有者发送UIKeyboardWillHideNotification消息,但不发送UIKeyboardDidHideNotification消息,因为这个变化不会导致键盘最终被隐藏。UIKeyboardWillHideNotification消息只是简单地通知键盘当前的所有者即将失去键盘焦点。而改变键盘的方向则会使系统发出上述的两种消息,因为每个方向的键盘是不同的,在显示新的键盘之前,必须先隐藏原来的键盘。

每个键盘通告都包含键盘在屏幕上的位置和尺寸。您应该使用通告中的信息来确定键盘的尺寸和位置,而不是假定键盘具有某个特定的尺寸或处于某个特定的位置。

图5-5  在肖像模式和景观模式下的相对键盘尺寸

Relative keyboard sizes in portrait and landscape modes

请注意:info字典中的UIKeyboardBoundsUserInfoKey键包含的矩形只能用于取得尺寸信息,不要将该矩形的原点(它的值总是为{0.0, 0.0})用于矩形计算。由于键盘是以动画的形式出现在它的位置上的,其实际的边界尺寸会随着时间的不同而不同,因此,info字典中有UIKeyboardCenterBeginUserInfoKeyUIKeyboardCenterEndUserInfoKey两个键,用于保存键盘的起始和终止的位置,您可以根据这些位置计算出键盘的原点。

使用键盘通告的一个原因是为了重新定位被键盘遮掩的内容。

显示键盘

当用户触击一个视图时,系统就会自动将该视图作为第一响应者。而当这种场景发生在包含可编辑文本的视图时,该视图就会启动一个文本编辑会话。如果当前键盘不可见,该视图会在编辑会话刚开始时请求系统显示键盘。如果键盘已经显示在屏幕上了,第一响应者的改变会导致来自键盘的文本输入被重定向到用户刚刚触击的视图上。

键盘是在视图变为第一响应者时自动被显示的,因此,您通常不需要为了显示它而做什么工作。但是,您可以通过调用视图对象的becomeFirstResponder方法来为可编辑的文本视图显示键盘。调用这个方法可以使目标视图成为第一响应者,并开始编辑过程,其效果和用户触击该视图是一样的。

如果您的应用程序在一个屏幕上管理几个基于文本的视图,则需要跟踪当前哪个视图是第一响应者,以便在需要的时候取消键盘的显示。

取消键盘

虽然键盘通常是自动显示的,但它并不自动取消。相反,您的应用程序需要在恰当的时机取消键盘。通常情况下,您在响应用户动作的时候进行这样的操作,比如当用户触击键盘上的Return或Done按键、或者触击应用程序界面上的其它按键时。根据键盘配置的不同,您可能需要在用户界面上加入额外的控件来取消键盘。

您可以调用作为当前第一响应者的文本视图的resignFirstResponder方法来取消键盘。当文本视图失去第一响应者的状态时,就会结束其当前的编辑会话,将这个变化通知它的委托对象,并取消键盘。

移动键盘下面的内容

需要做的调整通常包括暂时调整一或多个视图的尺寸和位置,从而使文本对象可见。管理带有键盘的文本对象的最简单方法是将它们嵌入到一个UIScrollView(或其子类,如UITableView)对象。当键盘被显示出来时,您需要做的只是调整滚动视图的尺寸,并将目标文本对象滚动到合适的位置。为此,在UIKeyboardDidShowNotification通告的处理代码中需要进行如下操作:

  1. 取得键盘的尺寸。

  2. 将滚动视图的高度减去键盘的高度。

  3. 将目标文本框滚动到视图中。

图5-6演示了一个简单的应用程序如何处理上述的几个步骤。

该程序将几个文本输入框嵌入到UIScrollView对象中,当键盘出现时,通告处理代码首先调整滚动视图的尺寸,然后用UIScrollView类的scrollRectToVisible:animated:方法将被触击的文本框滚动到视图中。

图5-6  调整内容的位置,使其适应键盘

Adjusting content to accommodate the keyboard
请注意:在配置滚动视图时,请务必为所有的内容视图配置恰当的自动尺寸调整规则。在之前的图中,文本框实际上是一个UIView对象的子视图,该UIView对象又是UIScrollView对象的子视图。如果该UIView对象的UIViewAutoresizingFlexibleWidthUIViewAutoresizingFlexibleHeight选项被设置了,则改变滚动视图的边框尺寸会同时改变它的边框,因而可能导致不可预料的结果。禁用这些选项可以确保该视图保持尺寸不变,并正确滚动。

描画文本

除了显示和编辑文本的UIKit类之外,iPhone OS还包含几个直接在屏幕上描画文本的方法。描画简单字符串的最简单有效的方法是使用NSString类的UIKit扩展,该扩展包含一些在屏幕上描画字符串的方法,并且可以描画时使用多种属性。还有一些方法,可以在真正描画之前计算渲染字符串所需要的尺寸,这些方法有助于更加精确布局应用程序的内容。

重要提示:由于性能上的考虑,您应该尽可能避免直接描画文本。对于静态文本,通过一或多个UILabel对象进行描画比使用定制描画例程要高效得多。类似地,UITextField类也支持不同的风格,这些风格使您更加易于将可编辑的文本区域集成到您的内容中。

 

当您需要在界面上描画定制文本字符串时,请使用NSString方法。UIKit包含一些对基本NSString类的扩展,用于在视图中描画字符串。这些方法使您可以精确调整文本的位置,以及将文本和视图内容进行融合;这个类的方法还可以根据指定的字体和风格属性计算文本的包围矩形。更多信息请参见NSString UIKit扩展参考

如果您需要对描画过程中用到的字体有更多的控制,还可以使用Core Graphics框架中的函数来进行描画。Core Graphics框架提供的方法可以对字形和文本进行精确描画和定位。有关这些函数及其用法的更多信息,请参见Quartz 2D编程指南Core Graphics框架参考

在Web视图中显示内容

对于本地的内容,您可以动态创建,也可以使用文件,然后调用loadData:MIMEType:textEncodingName:baseURL:loadHTMLString:baseURL:方法;

如果要从网络加载,则需要创建一个NSURLRequest对象,然后传递给web视图对象的loadRequest:方法。

在发起一个基于网络的请求后,如果由于某种原因必须释放web视图,则必须在释放之前取消待处理的请求。为此,您可以调用web视图的stopLoading方法。通常情况下,您可以在web视图的视图控制器的viewWillDisappear:方法中执行这些代码。如果需要确定一个请求是否处于等待状态,可以通过web视图的loading属性来判断。

posted @ 2012-02-14 00:36  Piosa  阅读(813)  评论(0编辑  收藏  举报