【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大部分都是相似的,这里只总结它们的区别:

  1. UITextView 为多行文本框;UITextField为单行文本框;
  2. UITextView没有继承 UIControl 控件——因此不能为该控件的事件绑定IBAction事件处理方法,也不能调用 UIControl 提供的addTarget:<#(nullable id)#> action:<#(nonnull SEL)#> forControlEvents:<#(UIControlEvents)#>方法来绑定事件处理方法。
  3. UITextView继承了UIScrollView,具有UIScrollView的功能和行为。

UIScrollView支持的属性

简单说下UIScrollView,UIScrollView代表一个可滚动控件——允许用户拖动手指滚动该控件的内容,该内容可以显示多于一个屏幕的内容。

UIScrollView默认实现并处理放大或缩小手势。——UIScrollView及其子类默认可以通过手指捏合动作进行放大,缩小。

UIScrollView支持3个控制显示区域的属性

  1. contentSize: 是一个 CGSize(结构体) 的值,其中有2个成员变量,用于代表UIScrollView所需要显示内容的完整宽度和完整高度;
  2. contentInset: 是一个 UIEdageInsets(结构体)的值,有4个成员变量,代表UIScrollView所需显示内容在上,下,左,右的留白。
  3. 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
0 0