iOS 常见控件开发指南
1. UITextField 相关
UITextField 有多个用于指定边界的方法:
-
placeholderRectForBounds
:指定占位符文本的边界。
-
editingRectForBounds
:指定编辑时文本的边界。
-
clearButtonRectForBounds
:指定清除按钮的渲染边界。
-
leftViewRectForBounds
:指定左视图的渲染边界。
-
rightViewRectForBounds
:指定右视图的渲染边界。
1.1 代理方法
可以通过
delegate
属性为
UITextField
指定代理,代理可接收多种事件。以下是可用的代理方法:
| 方法 | 说明 |
| — | — |
|
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField;
| 返回布尔值,指定文本字段是否允许开始编辑。若要完全禁用编辑,此方法应始终返回
NO
。 |
|
-(void)textFieldDidBeginEditing:(UITextField *)textField;
| 当用户点击文本字段启用编辑时调用,此时文本字段成为第一响应者。 |
|
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField;
| 返回布尔值,指定文本字段是否允许结束编辑。结束编辑时,文本字段放弃第一响应者身份。 |
|
-(void)textFieldDidEndEditing:(UITextField *)textField;
| 当给定文本字段内的编辑完成,且文本字段放弃第一响应者身份时调用。 |
|
-(BOOL)textField:(UITextField *)textField, shouldChangeCharactersInRange:(NSRange)range, replacementString:(NSString *)string;
| 当用户调用自动更正将给定文本更改为建议文本时调用。若要阻止文本更改,返回
NO
。 |
|
-(BOOL)textFieldShouldClear:(UITextField *)textField;
| 返回布尔值,指定文本字段是否允许应用户请求清除内容。 |
|
-(BOOL)textFieldShouldReturn:(UITextField *)textField;
| 返回布尔值,指定按下返回键是否允许结束编辑。若要在用户按下返回键时结束编辑,可在此处调用
resignFirstResponder
方法。示例代码如下:
- (BOOL) textFieldShouldReturn:(UITextField *)textField {
[ textField resignFirstResponder ];
return YES;
}
1.2 通知
由于
UITextField
类派生自
UIControl
类,因此
UIControl
类的通知系统也适用于文本字段。除了标准事件,还可使用以下特定于
UITextField
类的自定义事件:
-
UITextFieldTextDidBeginEditingNotification
:文本字段进入编辑模式时触发。
-
UITextFieldTextDidChangeNotification
:字段内文本更改时触发。
-
UITextFieldTextDidEndEditingNotification
:文本字段退出编辑模式时触发。
此外,由于文本字段使用键盘进行文本输入,在以下事件发生时也可能发送操作通知:
-
UIKeyboardWillShowNotification
:键盘显示前发送。
-
UIKeyboardDidShowNotification
:键盘显示后发送。
-
UIKeyboardWillHideNotification
:键盘隐藏前发送。
-
UIKeyboardDidHideNotification
:键盘隐藏后发送。
1.3 滚动文本字段
当编辑屏幕底部附近的文本字段时,键盘弹出可能会遮挡该字段。从 iPhoneOS 2.2 版本开始,滚动功能已实现自动化。对于早期固件版本,可通过滚动包含控件的视图使文本字段可见。这依赖于两个文本字段代理方法:
textFieldDidBeginEditing
和
textFieldShouldReturn
。
操作步骤如下:
1. 为给定文本字段设置代理为包含视图类:
textControl.delegate = self;
-
当用户点击文本字段时,
textFieldDidBeginEditing代理方法将被通知。可使用以下代码将视图向上滚动 240 像素:
- (void)textFieldDidBeginEditing:(UITextView *)textview {
[ UIView beginAnimations: nil context: NULL ];
[ UIView setAnimationDuration: 0.3 ];
CGRect frame = self.view.frame;
frame.origin.y -= 240.0;
frame.size.height += 240.0;
self.view.frame = frame;
[ UIView commitAnimations ];
}
- 当用户按下返回键时,可将框架滚动回原来的位置,并通过放弃第一响应者身份关闭键盘:
- (BOOL)textFieldShouldReturn:(UITextView *) textView {
[ UIView beginAnimations: nil context: NULL ];
[ UIView setAnimationDuration: 0.3 ];
CGRect frame = self.view.frame;
frame.origin.y += 240.0;
frame.size.height -= 240.0;
self.view.frame = frame;
[ UIView commitAnimations ];
[ textView resignFirstResponder ];
return YES;
}
2. 按钮
按钮是简单的控件,能够显示文本或图像,按下时通知应用程序。可将按钮控件附加到
UIView
对象、表格单元格等。由于它们派生自
UIControl
类,因此与基类共享相同的通知结构。此外,
UIButton
类还提供了许多额外功能。
2.1 创建控件
可通过调用
initWithFrame
方法初始化按钮控件,指定其偏移量和宽度。此外,
UIButton
类提供了静态方法
buttonWithType
用于创建多种预定义样式的按钮:
UIButton *myButton = [ UIButton buttonWithType: UIButtonTypeRoundedRect ];
buttonWithType
方法可提供以下按钮样式:
| 样式 | 描述 |
| — | — |
|
UIButtonTypeCustom
| 自定义按钮,不提供样式 |
|
UIButtonTypeRoundedRect
| 白色圆角按钮,类似偏好设置表格单元格或地址簿卡片 |
|
UIButtonTypeDetailDisclosure
| 蓝色披露图标,位于任何文本旁边 |
|
UIButtonTypeInfoLight
| 信息圆圈,位于任何文本旁边,用于小部件 |
|
UIButtonTypeInfoDark
| 适用于白色背景的深色信息圆圈 |
|
UIButtonTypeContactAdd
| 蓝色加号按钮(+),位于任何文本旁边 |
创建按钮后,可通过为按钮的
frame
属性分配
CGRect
结构来设置其偏移量和大小:
CGRect *myButtonFrame = CGRectMake(25.0, 25.0, 100.0, 100.0);
myButton.frame = myButtonFrame;
还可使用
setTitle
方法为任何给定按钮状态设置标题:
[ myButton setTitle: @"Click Here" forState: UIControlStateNormal ];
使用
setImage
方法为给定按钮状态设置图像:
[ myButton setImage:
[ UIImage applicationImageNamed: @"button.png" ]
forState: UIControlStateNormal
];
另外,可使用
setTitleColor
、
setTitleShadowColor
和
setBackgroundImage
方法分别设置标题颜色、标题阴影颜色和背景图像:
[ myButton setTitleColor:
[ UIColor redColor ] forState: UIControlStateNormal
];
[ myButton setTitleShadowColor:
[ UIColor grayColor ] forState: UIControlStateNormal
];
[ myButton setBackgroundImage:
[ UIImage applicationImageNamed: @"background.png" ]
forState: UIControlStateNormal
];
2.2 显示控件
初始化按钮后,可将其作为子视图添加到任何可承载它的对象中进行显示:
[ myView addSubview: button ];
2.3 渲染覆盖
除了
UIButton
对象的众多样式选项外,还可为自定义
UIButton
对象添加不同的覆盖方法,影响按钮的渲染方式。这些方法返回
CGRect
结构,指定按钮各组件的边界。以下是子类化
UIButton
时可用的覆盖方法:
-
backgroundRectForBounds
:指定渲染背景图像的边界。
-
contentRectForBounds
:指定渲染按钮内容的边界。
-
titleRectForContentRect
:指定渲染按钮标题文本的边界。
-
imageRectForContentRect
:指定渲染按钮图像的边界。
例如:
- (CGRect) imageRectForContentRect: (CGRect) bounds {
return myButtonImageBounds;
}
3. 页面控件
页面控件为通过拇指“滑动”切换页面的应用程序提供视觉指示器,而非使用导航按钮,或者用于需要显示页面指示器的场景。页面控件通常显示为屏幕顶部或底部的一系列点,并在用户翻页时由应用程序更新。
3.1 创建控件
创建页面控件可使用标准的
initWithFrame
方法指定其偏移量和大小。指定大小为 0 时,将根据页面数量自动设置水平大小、垂直大小或两者。指定宽度为屏幕宽度时,将使控件在其显示区域内水平居中:
UIPageControl *pageControl = [ [ UIPageControl alloc ]
initWithFrame: CGRectMake(0.0, 400.0, 320.0, 0.0)
];
设置控件将推断的页面数量,可使用
numberOfPages
属性:
pageControl.numberOfPages = 5;
默认情况下,第一页被选中。若要选择不同的页面,可设置
currentPage
属性(页面从 0 开始索引):
pageControl.currentPage = 0;
默认情况下,即使只有一个页面,指示器也会显示。若要在只有一个页面时隐藏指示器,可将
hidesForSinglePage
值设置为
YES
:
pageControl.hidesForSinglePage = YES;
若希望指示器在你完成自己的操作后再更新当前页面,可将
defersCurrentPageDisplay
设置为
YES
,并调用
updateCurrentPageDisplay
方法更新当前页面:
pageControl.defersCurrentPageDisplay = YES;
[ pageControl updateCurrentPageDisplay ];
3.2 显示控件
初始化页面控件后,将其作为子视图添加到任何可承载它的对象中进行显示:
[ myView addSubview: pageControl ];
页面控件配置为使用透明背景,因此若要使其像主屏幕那样响应点击,需要确保其后面有另一个视图对象。
3.3 通知
当用户点击页面控件时,会创建一个
UIControlEventValueChanged
事件。可使用
UIControl
类的
addTarget
方法指定一个操作:
[ myView addTarget: self action:@selector(pageChanged:)
forControlEvents: UIControlEventValueChanged
];
相应的操作方法将被通知,可读取新的页面值并采取适当的操作:
- (void) pageChanged: (id) selector {
UIPageControl *control = (UIPageControl *) selector;
NSInteger page = control.currentPage;
/* Additional code to handle page change */
}
4. 偏好设置表格
偏好设置表格为显示和更改程序设置或显示结构化信息(如联系人或网络信息)提供了美观丰富的界面。应用程序应尽可能使用偏好设置包在 iPhone 的设置应用程序中添加设置选项卡,但缺点是需要退出应用程序才能更改设置。不过,也可使用官方提供的 API 在应用程序中创建偏好设置表格,这对于更改运行时设置很有用。此外,若应用程序显示分组信息表(如自定义联系人或网络信息显示),这种表格也有助于组织数据。偏好设置表格提供可调整大小的单元格,能够承载控件、文本框和信息文本,还提供了将相似偏好逻辑分组的机制。
4.1 创建偏好设置表格
实现偏好设置表格需要提前规划,因为使用数据源代理来查询填充表格所需的信息。这与通用列表式的
UITableView
类实现类似,但复杂度更高。运行时类会调用数据源中的一组协议方法来返回有关偏好设置表格的信息。
偏好设置表格由两部分组成(表格和数据源),最简洁的组装方式是创建
UITableViewController
的子类,并使其作为表格的数据源。这样应用程序可以创建控制器类的实例(包含其自己的表格对象)并在屏幕上显示。
4.2 子类化表格视图控制器
创建自包含的偏好设置表格,可创建
UITableViewController
的子类,并包含将其绑定为数据源代理所需的所有协议方法。以下示例创建了一个名为
MyPreferencesViewController
的子类:
@interface MyPreferencesViewController : UITableViewController
{
}
/* Preferences table methods */
- (id)init;
- (void)loadView;
- (void)dealloc;
/* Data source methods */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section;
数据源方法说明如下:
| 方法 | 说明 |
| — | — |
|
numberOfSectionsInTableView
| 返回偏好设置表格中的逻辑分组数量,分组计数不包括组标签。每个逻辑组将在屏幕上显示为一个单独的“气泡”。 |
|
numberOfRowsInSection
| 返回给定偏好设置组中的行数,行计数不包括组标签。数据源将每行视为
UITableViewCell
对象,由
cellForRowAtIndexPath
方法返回。 |
|
cellForRowAtIndexPath
| 返回与指定组和行对应的
UITableViewCell
对象。此方法应像第 3 章的
TableDemo
表格示例一样检查队列中是否有现有单元格。 |
|
heightForRowAtIndexPath
| 返回指定索引路径处行的高度。 |
|
titleForHeaderInSection
| 返回指定部分的标题。 |
偏好设置表格与数据源之间的交互流程如下:
graph LR
A[偏好设置表格] --> B(询问数据源有多少单元格组)
B --> C(数据源回复数量)
A --> D(询问第一组的样子和大小)
D --> E(数据源回复)
A --> F(询问第二组的情况)
F --> G(数据源回复)
A --> H(准备绘制,请求第一组的第一个单元格)
H --> I(数据源提供单元格)
A --> J(请求第一组的第二个单元格)
J --> K(数据源提供单元格)
A --> L(请求第二组的第二个单元格)
L --> M(数据源提供单元格)
总结
本文详细介绍了 iOS 开发中常见控件的使用方法,包括
UITextField
、按钮、页面控件和偏好设置表格。对于
UITextField
,我们了解了其边界指定方法、代理方法、通知以及滚动功能的实现。按钮部分介绍了创建、显示和渲染覆盖的操作。页面控件说明了创建、显示和处理通知的步骤。偏好设置表格则阐述了创建和子类化表格视图控制器的方法。通过掌握这些控件的使用,开发者可以构建出功能丰富、用户体验良好的 iOS 应用程序。在实际开发中,可根据具体需求灵活运用这些控件,并结合相应的代理方法和通知机制,实现各种交互效果。
超级会员免费看
30

被折叠的 条评论
为什么被折叠?



