22、iOS 常见控件开发指南

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;
  1. 当用户点击文本字段时, 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 ];
}
  1. 当用户按下返回键时,可将框架滚动回原来的位置,并通过放弃第一响应者身份关闭键盘:
- (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 应用程序。在实际开发中,可根据具体需求灵活运用这些控件,并结合相应的代理方法和通知机制,实现各种交互效果。

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能和辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场与微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模与仿真技巧,拓展在射频与无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程和边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸和材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理与工程应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值