ios 知识点ios开发控件-UIView半栈工程师

UITextView

2017-12-19  本文已影响231人  无邪8

一、简介

<<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];

}

上一篇下一篇

猜你喜欢

热点阅读