【IOS 开发学习总结-OC-44】★★ios开发之UI控件——文本框与多行文本控件(彩蛋——上拉刷新一般实现代码)
来源:互联网 发布:golang chan 编辑:程序博客网 时间:2024/04/26 10:25
文本框控件UITextField
UITextField在头文件中的定义为@interface UITextField : UIControl <UITextInput, NSCoding>
。
UITextField继承了 UIControl 控件,因此它可作为活动控件使用。添加方式可以在界面设计文件中添加,也可以在代码中添加,本质一样。
Xcode 中UITextField属性控制面板:
属性捡要说明:
1. placeholder:用于显示灰色的提示信息。
2. capitaliization:——是否自动转换该文本框中输入文本的大小写;
3. correction:是否对文本自动更正;
4. keyboard:——键盘类型的选择,支持的类型有:
- default:默认的虚拟键盘;
- ASCII capable:显示英文字母键盘。
- number and punctuation:显示数字和标点符号键盘;
- number pad:显示数字键盘;
- phone pad: 显示电话拨号键盘;
- E-mail address:显示输入E-mail 地址的虚拟键盘;
- decimal pad: 显示可输入数字和小数点的虚拟键盘。
-
5. return—key: 设置用户在文本框内按下return 键后的行为。
return—key 列表框下的2个复选框:
- auto-enable return key: 勾选后return 键默认禁用——当用户在输入内容后,return 键才会变得可用。通过这种方式强制用户输入内容;
- secure:密码安全遮掩。输入的内容会变为黑点;
示例图片:
多行文本控件——UITextView
UITextView在头文件中,@interface UITextView : UIScrollView <UITextInput>
。
UITextView继承了UIScrollView与 UIView(UIScrollView的父类)
——所以默认有滚动条。通过代码或 interface builder 都能添加该控件。
UITextView与UITextField的区别:
UITextView与UITextField大部分都是相似的,这里只总结它们的区别:
- UITextView 为多行文本框;UITextField为单行文本框;
- UITextView没有继承 UIControl 控件——因此不能为该控件的事件绑定IBAction事件处理方法,也不能调用 UIControl 提供的
addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>
方法来绑定事件处理方法。- UITextView继承了UIScrollView,具有UIScrollView的功能和行为。
UIScrollView支持的属性
简单说下UIScrollView,UIScrollView代表一个可滚动控件——允许用户拖动手指滚动该控件的内容,该内容可以显示多于一个屏幕的内容。
UIScrollView默认实现并处理放大或缩小手势。——UIScrollView及其子类默认可以通过手指捏合动作进行放大,缩小。
UIScrollView支持3个控制显示区域的属性
- contentSize: 是一个 CGSize(结构体) 的值,其中有2个成员变量,用于代表UIScrollView所需要显示内容的完整宽度和完整高度;
- contentInset: 是一个 UIEdageInsets(结构体)的值,有4个成员变量,代表UIScrollView所需显示内容在上,下,左,右的留白。
- contentOffset:CGSize类型的值,包含 x,y2个成员变量。
下图可帮助理解contentOffset,它是个坐标点。
如果还不明白,可以参考这篇博文:contentInset 和 contentOffset和frame 之间的含义 让我们彻底搞懂!或者下面的知识扩充。
知识扩充:
contentSize、contentInset和contentOffset 是 scrollView三个基本的属性。
contentSize: The size of the content view. 其实就是scrollview可以滚动的区域,比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960),代表你的scrollview可以上下滚动,滚动区域为frame大小的两倍。contentOffset:The point at which the origin of the content view is offset from the origin of the scroll view. 是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentoffset就是(0 ,480),也就是y偏移了480
contentInset:The distance that the content view is inset from the enclosing scroll view.是scrollview的contentview的顶点相对于scrollview的位置,例如你的contentInset = (0 ,100),那么你的contentview就是从scrollview的(0 ,100)开始显示
示例代码——上拉刷新一般实现代码:
/* 上拉刷新一般实现代码如下 */ //上拉加载更多 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; float offset=scrollView.contentOffset.y; float contentHeight=scrollView.contentSize.height; float sub=contentHeight-offset; if ((scrollView.height-sub)>20) { //如果上拉距离超过20p,则加载更多数据 //[self loadMoreData];//此处在view底部加载更多数据 } }
看 Xcode属性面板。
补充图片中的内容:
- delays content touches: 如果勾选,该UIScrollView将延迟到真正确定滚动意图才去处理触碰手势。——如果未勾选,只要用户触碰该控件,该UIScrollView立即调用touchesShouldBegin: withEvent:inContentView
方法处理滚动。
- ⭐️ cancellable content touches:如果勾选,如果该UIScrollView中的内容已经跟踪用户手指触碰动作,并且用户拖动手指足以启动一个滚动事件——该UIScrollView将会调用touchesCancelled:withEvent:
方法,并将该拖动事件当做滚动UIScrollView控件。如果不勾选,——只要控件的内容追踪用户手指触碰动作,将不会理会手指在该控件上的其他移动。通常建议勾选。
UITextView事件怎么处理?——可以使用委托对象处理
UITextView没有继承 UIControl 类——所以不支持绑定 IBAction 事件处理方法。
使用委托对象这种方法处理UITextView事件,UITextView必须实现UITextViewDelegate 协议。该协议中定义了如下方法:
1. - (BOOL)textViewShouldBeginEditing:(UITextView *)textView;
——将要开始编辑该UITextView内容的时候自动激发该方法;
2. - (BOOL)textViewShouldEndEditing:(UITextView *)textView;
——将要结束编辑该UITextView内容的时候自动激发该方法;
3. - (void)textViewDidBeginEditing:(UITextView *)textView;
——开始编辑时激发该方法;
4. - (void)textViewDidEndEditing:(UITextView *)textView;
——结束编辑时激发该方法;
5. - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
该UITextView内指定范围内的文本内容将要被替换时激发该方法;
6. - (void)textViewDidChange:(UITextView *)textView;
UITextView包含的文本内容改变时激发该方法;
7. - (void)textViewDidChangeSelection:(UITextView *)textView;
选中该UITextView控件中某些文本时会激发该方法;
8. - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange NS_AVAILABLE_IOS(7_0);
textView指定范围的内容与 URL 将要相互作用时激发该方法——该方法随着 IOS7被使用;
9. - (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange NS_AVAILABLE_IOS(7_0);
textView指定范围的内容与文本附件将要相互作用时,自动激发该方法——该方法随着 IOS7被使用;
自定义选择内容后的菜单
效果图:
实现部分代码:
#import "FKViewController.h"@interface FKViewController ()@end@implementation FKViewController- (void)viewDidLoad{ [super viewDidLoad]; // 创建两个菜单项 UIMenuItem *mailShare = [[UIMenuItem alloc]initWithTitle:@"邮件分享" action:@selector(mailShare:)]; UIMenuItem *weiboShare = [[UIMenuItem alloc]initWithTitle:@"微博分享" action:@selector(weiboShare:)]; // 创建UIMenuController控制器 UIMenuController *menu = [UIMenuController sharedMenuController]; // 为UIMenuController控制器添加两个菜单项 [menu setMenuItems:[NSArray arrayWithObjects: mailShare , weiboShare , nil]];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning];}// 重写UIResponder的canPerformAction: withSender:方法// 当该方法返回YES时,该界面将会显示该Action对应的控件-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{ // 如果Action是mailShare:或weiboShare:方法 if(action == @selector(mailShare:) || action == @selector(weiboShare:)) { // 如果textView选中的内容长度大于0,返回YES。 // 当该方法返回YES时,该Action对应的控件将会显示出来。 if(self.textView.selectedRange.length > 0) return YES; } return NO; }- (void) mailShare:(id)sender{ NSLog(@"模拟通过邮件分享!");}- (void) weiboShare:(id)sender{ NSLog(@"模拟通过微博分享!");}@end
代码说明:
为 UIMenuController添加2个菜单项。然后再重写重写UIResponder的canPerformAction: withSender:
方法——判断当激发的 Action 是mailShare:或weiboShare:,并且选中的文本长度大于0,那么该方法返回 YES,应用程序显示这个菜单项。
完成输入后如何关闭键盘?
请参见我的另一篇总结:IOS开发——隐藏键盘的4种方法
除了上面这篇文章提到的4种方法,还有一种方法:自定义键盘附件关闭键盘。就像下面的效果图那样关闭键盘。这里的示例勾选了水平回弹和垂直回弹的属性。源码地址:自定义键盘附件关闭键盘(源码)
源码地址:自定义键盘附件关闭键盘(源码)
核心代码段:
@implementation FKViewController- (void)viewDidLoad{ [super viewDidLoad]; // 创建一个UIToolBar工具条 UIToolbar * topView = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; // 设置工具条风格 [topView setBarStyle:UIBarStyleDefault]; // 为工具条创建第1个“按钮” UIBarButtonItem* myBn = [[UIBarButtonItem alloc] initWithTitle:@"无动作" style:UIBarButtonItemStyleBordered target:self action:nil]; // 为工具条创建第2个“按钮”,该按钮只是一片可伸缩的空白区。 UIBarButtonItem* spaceBn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; // 为工具条创建第3个“按钮”,单击该按钮会激发editFinish方法 UIBarButtonItem* doneBn = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStyleDone target:self action:@selector(editFinish)]; // 以3个按钮创建NSArray集合 NSArray * buttonsArray = [NSArray arrayWithObjects :myBn,spaceBn,doneBn,nil]; // 为UIToolBar设置按钮 [topView setItems:buttonsArray]; // 为textView关联的虚拟键盘设置附件 [self.textView setInputAccessoryView:topView];}-(void) editFinish{ [self.textView resignFirstResponder];}@end
- 【IOS 开发学习总结-OC-44】★★ios开发之UI控件——文本框与多行文本控件(彩蛋——上拉刷新一般实现代码)
- 【IOS 开发学习总结-OC-42】★ios开发——UI控件之UIControl基类
- 【IOS 开发学习总结-OC-50】★ios开发之UI控件——UIToolBar(工具栏)
- 【IOS 开发学习总结-OC-51】★★★ios开发之UI控件——UITableView 与UITableViewCell
- 【IOS 开发学习总结-OC-45】★★ios开发之UI控件——UISegmentedControl与UIImageView
- 【IOS 开发学习总结-OC-48】★★ios开发之UI控件——UIDatePicker与 UIPickerView
- 【IOS 开发学习总结-OC-49】★★ios开发之UI控件——UIStepper与UIWebView
- 【IOS 开发学习总结-OC-47】★ios开发之UI控件——UIAlertView与 UIActionSheet
- 【IOS 开发学习总结-OC-41】★★ios开发——代码控制 UI 界面与 UI 控件的自定义
- 【IOS 开发学习总结-OC-58】★UI控件——UITabBar 与UITabBarController
- 【IOS 开发学习总结-OC-53】★★ios开发UI 控件——UISearchBar与UISearchDisplayController
- 【IOS 开发学习总结-OC-54】★★ios开发UI 控件——UINavigationBar 与UINavigationController
- 【IOS 开发学习总结-OC-46】★ios开发之UI控件——UIProgressView 与 UISlider(另:可拉伸图片)
- 【IOS 开发学习总结-OC-59】UI控件——UIPageControl 与UIPageViewController
- iOS开发UI篇—实现UItableview控件数据刷新
- iOS开发UI篇—实现UItableview控件数据刷新
- IOS开发UI篇—实现UItableview控件数据刷新
- iOS开发UI篇—实现UItableview控件数据刷新
- Machine Learning-Andrew Ng-week3
- 设计模式--创建者模式
- c++链接postgresql过程
- 《计算机网络 :自顶向下方法》第5章 链路层和局域网
- 人生杂谈---一次由吃杂酱面引发的感想
- 【IOS 开发学习总结-OC-44】★★ios开发之UI控件——文本框与多行文本控件(彩蛋——上拉刷新一般实现代码)
- 关于子目录源码文件编写makefile文件
- 验证码图片生成类
- Android学习记事(一)
- 数据库的相关操作
- linux VM中复制虚拟机后eth0变成eth1
- java入门第三天 switch case 运算符 小游戏准备
- [PAT (Advanced Level) ]1031.Hello World for U 解题文档
- Android adb.exe程序启动不起来,如何处理