UITextView

一、简介

<<UITextView(文本视图) : UITextView可以输入多行文字并且可以滚动显示浏览全文的控件.在App中UITextView是出现频率最高的控件之一

<<继承关系:UITextField-->UIScrollView-->UIView-->UIResponder-->NSObject

<<UITextView文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文。UITextField的用处多,UITextView的用法也不少。常见UITextView使用在APP的软件简介、内容详情显示、小说阅读显示、发表空间内容输入、说说文本框、评论文本框等。UITextView的使用有它本身的代理方法,也有继承于父类的方法。本身的方法有从开始编辑到结束编辑的整个过程的监听,继承的方法主要是继承于UIScrollView的方法,因为关于滚动的控制都属于UIScrollView的


格式为

1-->初始化(作用)

typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {

UIDataDetectorTypePhoneNumber                                        = 1 << 0, // Phone number detection

UIDataDetectorTypeLink                                              = 1 << 1, // URL detection

UIDataDetectorTypeAddress NS_ENUM_AVAILABLE_IOS(4_0)                = 1 << 2, // Street address detection

UIDataDetectorTypeCalendarEvent NS_ENUM_AVAILABLE_IOS(4_0)          = 1 << 3, // Event detection

UIDataDetectorTypeShipmentTrackingNumber NS_ENUM_AVAILABLE_IOS(10_0) = 1 << 4, // Shipment tracking number detection

UIDataDetectorTypeFlightNumber NS_ENUM_AVAILABLE_IOS(10_0)          = 1 << 5, // Flight number detection

UIDataDetectorTypeLookupSuggestion NS_ENUM_AVAILABLE_IOS(10_0)      = 1 << 6, // Information users may want to look up

UIDataDetectorTypeNone          = 0,              // Disable detection

UIDataDetectorTypeAll          = NSUIntegerMax    // Enable all types, including types that may be added later

} __TVOS_PROHIBITED;(如果属性有枚举类型的话,这里会有枚举类型说明

UITextView *textView = [[UITextView alloc] init]; (这是具体的例子

@property(null_resettable,nonatomic,copy) NSString *text;// UITextField 设置提示文字    (这是说明

二、UITextView的文本属性(属性的顺序与苹果API一致)

1-->设置UITextView Delegate代理

textView.delegate = self;//设置textView Delegate代理

@property(nullable,nonatomic,weak) id <UITextViewDelegate>delegate; //弱引用

2-->设置文字

textView.text = @"反馈内容(最多可输入120字)";//设置文字

@property(nullable, nonatomic,copy) NSString *text;//设置显示文字, 默认是空的

3-->设置字号//一般方法

textView.font = [UIFont systemFontOfSize:30];

@property(null_resettable, nonatomic,strong) UIFont *font;//  设置字体

4-->文字字体加粗//系统加粗方法

[textView setFont:[UIFont boldSystemFontOfSize:25]];

5-->自定义文字字体和字号

textView.font = [UIFont fontWithName:@"Zapfino"size:30];

6-->自定义文字字体加粗和字号

[textView setFont:[UIFont fontWithName:@"Helvetica-Bold"size:25]];

7-->设置文字颜色

textView.textColor = [UIColor redColor];//设置文字颜色

@property(nullable, nonatomic,strong) UIColor *textColor;

8-->文字对齐方式

typedef NS_ENUM(NSInteger, NSTextAlignment) {

NSTextAlignmentLeft      = 0,    // 居左对齐

#if TARGET_OS_IPHONE

NSTextAlignmentCenter    = 1,    //居中对齐

NSTextAlignmentRight    = 2,    // 居右对齐

#else /* !TARGET_OS_IPHONE */

NSTextAlignmentRight    = 1,    //居右对齐

NSTextAlignmentCenter    = 2,    //居中对齐

#endif

NSTextAlignmentJustified = 3,    //合理铺满 等同于居左

NSTextAlignmentNatural  = 4,    //默认 等同于居左

}

textView.textAlignment = NSTextAlignmentCenter;

@property(nonatomic)        NSTextAlignment    textAlignment;//  对齐方式,默认是NSLeftTextAlignment

默认都是竖直居中的

UITextView不能设置竖直方向的排列布局,但是可以通过sizeToFit改变UITextView的frame来实现曲线救国。

9-->设置选中范围 是否可以编辑

textView.selectedRange = NSMakeRange(0,0);//当UITextView中含有文字时,系统默认将光标定位到最后的位置,设置光标定位到首位置。

@property(nonatomic) NSRange selectedRange;//设置光标定位的位置

10-->设置是否可以编辑

textView.editable = NO; // 默认YES

@property(nonatomic,getter=isEditable) BOOL editable __TVOS_PROHIBITED;//设置是否可以编辑,默认YES(TVOS 禁止使用)

11-->是否可以选中

textView.selectable = NO; // 默认YES 当设置为NO时,不能选择@property(nonatomic,getter=isSelectable) BOOL selectable;//切换可选择性,它控制用户选择内容和与url和附件交互的能力。在tvOS上,这也使得文本视图可聚焦。

12-->设置显示数据类型的连接模式

typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {

UIDataDetectorTypePhoneNumber                                        = 1 << 0, //检测电话

UIDataDetectorTypeLink                                              = 1 << 1, //检测网址和邮箱

UIDataDetectorTypeAddress NS_ENUM_AVAILABLE_IOS(4_0)                = 1 << 2, // 检测地址

UIDataDetectorTypeCalendarEvent NS_ENUM_AVAILABLE_IOS(4_0)          = 1 << 3, // 检测日历

UIDataDetectorTypeShipmentTrackingNumber NS_ENUM_AVAILABLE_IOS(10_0) = 1 << 4, // 货物追踪号码检测

UIDataDetectorTypeFlightNumber NS_ENUM_AVAILABLE_IOS(10_0)          = 1 << 5, // 班机号码检测

UIDataDetectorTypeLookupSuggestion NS_ENUM_AVAILABLE_IOS(10_0)      = 1 << 6, //用户可能要查找的信息

UIDataDetectorTypeNone          = 0,              // 禁用检测

UIDataDetectorTypeAll          = NSUIntegerMax   // 检测所有类型链接

} __TVOS_PROHIBITED;

textview.dataDetectorTypes=UIDataDetectorTypePhoneNumber; // 检测电话号码

@property(nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;//设置检测的类型。

详见使用UIDataDetectorTypes自动检测电话、网址和邮箱

13-->设置是否允许编辑属性字符串文本

textView.allowsEditingTextAttributes = YES; // 默认NO

@property(nonatomic) BOOL allowsEditingTextAttributes NS_AVAILABLE_IOS(6_0); // 默认为NO

14-->设置富文本

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text];-->先把UITextField上的文字赋值给可变字符串

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(5,10)];-->设置更改后的颜色和改变文字的区域

[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(20, 25)];-->设置更改后的字体大小和改变文字的区域

textView.attributedText = str;-->把改后的字符串重新赋值给UITextField

@property(null_resettable,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0); //更改任意文字的颜色和字体大小

15-->设置属性字典

NSMutableDictionary * attributesDic = [textView.typingAttributes mutableCopy];

[attributesDic setObject:[UIColor redColor] forKey:NSForegroundColorAttributeName];

// automatically resets when the selection changes

// 重新设置 接下来改变的文字 的属性字典

textView.typingAttributes = attributesDic;

@property(nullable, nonatomic,copy) NSDictionary*typingAttributes NS_AVAILABLE_IOS(6_0); //.(当选中文本时,自动复位)适用于用户输入的新文本的属性。字典包含适用于新类型文本的属性键(和对应的值)。当文本字段的选择更改时,自动清除字典的内容。如果文本字段不是编辑模式,此属性包含值为零。类似地,除非文本字段当前处于编辑模式,否则不能将此属性赋值给该属性

16-->滚动到文本的某个段落

[textView scrollRangeToVisible:NSMakeRange(50, 5)];

- (void)scrollRangeToVisible:(NSRange)range;//滚动textView使其显示在本一段文本。

17-->当文本字段成为第一响应者时,自定义输入视图显示。

UIImageView *imgView1=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"logo-60@3x.png"]];

imgView1.frame=CGRectMake(60, 60, 300, 300);

textView.inputView=imgView1;

@property (nullable, readwrite, strong) UIView *inputView;//只有height值会对视图有影响,只会改变附加视图的高度,弹出添加的这个视图,一般用作像银行app的自定义键盘

18-->当文本字段成为第一响应者时,该自定义辅助视图显示。

UIView * view = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 50)];

view.backgroundColor = [UIColor redColor];

// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮

textView.inputAccessoryView = view;

@property (nullable, readwrite, strong) UIView *inputAccessoryView;// 在键盘上附加一个视图,一般用于添加一个收回键盘的按钮

19-->设置是否显示删除按钮

textView.clearsOnInsertion = YES; // 默认为NO

@property(nonatomic) BOOL clearsOnInsertion NS_AVAILABLE_IOS(6_0); // 默认为没有。如果是,选择UI是隐藏的,插入文本将替换字段的内容。更改选择将自动设置为NO.

三、设置UITextView的初始化方法

1-->父类方法(没有初始frame)

UITextView * textView = [[UITextView alloc] init];

2-->父类方法(初始frame)

UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 80, 300, 200)];

3-->UITextView 的一个类方法

NSTextContainer *textContainer =[[NSTextContainer alloc]init];

UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 80, 300, 200) textContainer:container];

- (instancetype)initWithFrame:(CGRect)frame textContainer:(nullable NSTextContainer *)textContainer NS_AVAILABLE_IOS(7_0) NS_DESIGNATED_INITIALIZER;

4-->UITextView的一个类方法

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

详见 initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解

四、UITextView的textContainer属性

1-->定义了一个矩形区域用于存放已经进行了排版并设置好属性的文字(只读属性)

NSTextContainer *textContainer=textView.textContainer;

@property(nonatomic,readonly) NSTextContainer *textContainer NS_AVAILABLE_IOS(7_0);/ /获取文本视图的文本容器

2-->设置显示内容的填充

textView.textContainerInset=UIEdgeInsetsMake(0, 10, 0, 10);

@property(nonatomic, assign) UIEdgeInsets textContainerInset NS_AVAILABLE_IOS(7_0);//在文本视图的内容区域内设置文本容器的布局区域

五、UITextView的布局属性

1-->用于管理NSTextStorage其中的文字内容的排版布局(只读属性)

NSInteger characterIndex=[textView.layoutManager characterIndexForPoint:touchPoint inTextContainer:textView.textContainer fractionOfDistanceBetweenInsertionPoints:NULL];

@property(nonatomic,readonly) NSLayoutManager *layoutManager NS_AVAILABLE_IOS(7_0);// 方便访问器(通过文本容器访问)

2-->NSTextStorage保存并管理UITextView要展示的文字内容,该类是NSMutableAttributedString的子类,由于可以灵活地往文字添加或修改属性(只读属性)

TextStorage *textStorage=textView.textStorage;

@property(nonatomic,readonly,strong) NSTextStorage *textStorage NS_AVAILABLE_IOS(7_0);

3-->设置链接文本的样式设置

NSDictionary*linkAttributes =@{NSForegroundColorAttributeName: [UIColor greenColor],

NSUnderlineColorAttributeName: [UIColor lightGrayColor],

NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};

textView.linkTextAttributes=linkAttributes;

@property(null_resettable, nonatomic, copy) NSDictionary *linkTextAttributes NS_AVAILABLE_IOS(7_0);

六、UITextView的UITextViewDelegate代理方法

可选方法

1-->将要开始编辑

#pragma mark - UITextViewDelegate代理方法

/** 将要开始编辑

@param textView UITextView对象

@return YES:允许编辑; NO:禁止编辑

*/

- (BOOL)textViewShouldBeginEditing:(UITextView*)textView{

return YES;

}

- (BOOL)textViewShouldBeginEditing:(UITextView*)textView; //.当文本将要开始编辑时调用这个代理方法,返回 NO 时驳回编辑状态。

2-->是否结束编辑

/**

将要结束编辑

应用场景:如果当前textView有内容,则返回YES,允许收键盘或更换textView;

当前textView没有输入内容,返回NO,此时不能收起键盘或者更换textView

@param textView UITextView对象

@return YES:允许释放键盘(注销第一响应者); NO:不允许释放键盘(始终是第一响应者)

*/

- (BOOL)textViewShouldEndEditing:(UITextView*)textView{

//返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder

//要想在用户结束编辑时阻止文本字段消失,可以返回NO

//这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息

return YES;

}

- (BOOL)textViewShouldEndEditing:(UITextView*)textView;//./当文本将要结束编辑时进行调用,返回 YES 时允许编辑停止或者注销第一响应者,返回 NO,不允许编辑会话结束

3-->开始编辑时调用的方法

/**

开始编辑,即成为第一响应者,此时光标出现

@param textView UITextView对象

*/

- (void)textViewDidBeginEditing:(UITextView*)textView{

//开始编辑时触发,文本字段将成为first responder

}

- (void)textViewDidBeginEditing:(UITextView*)textView; //当文本正在开始编辑时调用,变为第一响应者

4-->结束编辑调用的方法

/**

已经结束编辑

(即使shouldEndEditing方法返回NO或者调用了endEditing:YES,该方法仍可能调用)

官方注释:may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called

@param textView UITextView对象

*/

- (void)textViewDidEndEditing:(UITextView*)textView{

//结束编辑时触发

}

- (void)textViewDidEndEditing:(UITextView*)textView;//上面返回YES后执行;上面返回NO时有可能强制执行(e.g.view removed from window)

5-->是否允许字符改变(控制输入文字的长度和内容,可通调用以下代理方法实现)

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{

if(range.location>=100){

//控制输入文本的长度

returnNO;

}

if([textisEqualToString:@"\n"]) {

//禁止输入换行

returnNO;

}

else{

returnYES;

}

}

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text;//内容将要发生改变编辑

6-->字符内容改变触发的方法

- (void)textViewDidChange:(UITextView*)textView{

//计算文本的高度

CGSizeconstraintSize;

constraintSize.width= textView.frame.size.width-16;

constraintSize.height=MAXFLOAT;

CGSizesizeFrame =[textView.textsizeWithFont:textView.font

constrainedToSize:constraintSize

lineBreakMode:UILineBreakModeWordWrap];

//重新调整textView的高度

textView.frame=CGRectMake(textView.frame.origin.x,textView.frame.origin.y,textView.frame.size.width,sizeFrame.height+5);

}

- (void)textViewDidChange:(UITextView*)textView;//内容发生改变编辑

7-->选中内容改变触发的方法

- (void)textViewDidChangeSelection:(UITextView *)textView{

NSLog(@"textViewDidChangeSelection:");

}

- (void)textViewDidChangeSelection:(UITextView *)textView;

8-->是否允许对文本中的URL进行操作

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {

if([[URL scheme] isEqualToString:@"url1"]) {

NSString* url =[URL host];

NSLog(@"%@",url);//在这里利用url做点什么事情......

return NO;

}

return YES;

}

- (BOOL)textView:(UITextView*)textView shouldInteractWithURL:(NSURL*)URL inRange:(NSRange)characterRange;

8-->是否允许对文本中的富文本进行操作

- (BOOL)textView:(UITextView*)textView shouldInteractWithTextAttachment:(NSTextAttachment*)textAttachment inRange:(NSRange)characterRange{

NSLog(@"附件被点击");

return YES;

}

- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange NS_AVAILABLE_IOS(7_0);

九、UITextField的通知

UITextView派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用。除了UIControl类的标准事件,你还可以使用下列UITextView类特有的事件

UITextViewTextDidBeginEditingNotification

UITextViewTextDidChangeNotification

UITextViewTextDidEndEditingNotification

当文本字段退出编辑模式时触发。通知的object属性存储了最终文本。

因为文本字段要使用键盘输入文字,所以下面这些事件发生时,也会发送动作通知

UIKeyboardWillShowNotification  //键盘显示之前发送

UIKeyboardDidShowNotification   //键盘显示之后发送

UIKeyboardWillHideNotification  //键盘隐藏之前发送

UIKeyboardDidHideNotification   //键盘隐藏之后发送

十、UITextView的UITextViewDelegate代理方法拓展

1-->UITextView:响应键盘的 return事件

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

if([text isEqualToString:@"\n"]){//判断输入的字是否是回车,即按下return

//在这里做你响应return键的代码

[textView resignFirstResponder];

returnNO;//这里返回NO,就代表return键值失效,即页面上按下return,不会出现换行,如果为yes,则输入页面会换行

}

return YES;

}

2-->textView自适应输入的文本的内容的高度

- (void)textViewDidChange:(UITextView*)textView{

//计算文本的高度

CGSizeconstraintSize;

constraintSize.width= textView.frame.size.width-16;

constraintSize.height=MAXFLOAT;

CGSizesizeFrame =[textView.textsizeWithFont:textView.font

constrainedToSize:constraintSize

lineBreakMode:UILineBreakModeWordWrap];

//重新调整textView的高度

textView.frame=CGRectMake(textView.frame.origin.x,textView.frame.origin.y,textView.frame.size.width,sizeFrame.height+5);

}

3-->控制输入文字的长度和内容,可通调用以下代理方法实现

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{

if(range.location>=100){

//控制输入文本的长度

returnNO;

}

if([textisEqualToString:@"\n"]) {

//禁止输入换行

returnNO;

}

else

{

returnYES;

}

}

3、UITextView中打开或禁用复制,剪切,选择,全选等功能

// 继承UITextView重写这个方法

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

// 返回NO为禁用,YES为开启

    // 粘贴

    if(action == @selector(paste:)) returnNO;

    // 剪切

    if(action == @selector(cut:)) returnNO;

    // 复制

    if(action == @selector(copy:)) returnNO;

    // 选择

    if(action == @selector(select:)) returnNO;

    // 选中全部

    if(action == @selector(selectAll:)) returnNO;

    // 删除

    if(action == @selector(delete:)) returnNO;

    // 分享

    if(action == @selector(share)) returnNO;

    return [super canPerformAction:action withSender:sender];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349