美文网首页
UITextView学习笔记

UITextView学习笔记

作者: 寻心_0a46 | 来源:发表于2019-12-13 09:44 被阅读0次

    UITextView

    UITextView,可滚动的多行文本区域。支持使用自定义样式信息显示文本,还支持文本编辑。通常使用文本视图显示多行文本,例如在显示大型文本文档的正文时。

    此类通过使用AttributeText属性支持多种文本样式。(iOS 6之前的版本不支持样式文本。)设置此属性的值将导致文本视图使用属性字符串中提供的样式信息。您仍然可以使用“字体”、“文本颜色”和“文本对齐”属性来设置样式属性,但这些属性适用于“文本”视图中的所有文本。建议您使用文本视图而不是UIWebView对象在应用程序中同时显示纯文本和富文本。

    常用属性

    @property(nullable,nonatomic,weak) id<UITextViewDelegate> delegate;

    属性描述 : 设置文本视图的代理,文本视图代理从文本视图响应与编辑相关的消息。可以使用代理跟踪文本本身和当前选择的更改。

    @property(nullable,nonatomic,weak) id<UITextViewDelegate> delegate;
    

    @property(null_resettable,nonatomic,copy) NSString *text;

    属性描述 : 文本视图显示的文本。在iOS 6及更高版本中,为该属性分配新值也会将attributeText属性的值替换为相同的文本,尽管没有任何固有的样式属性。相反,文本视图使用类的字体、文本颜色和其他与样式相关的属性设置新字符串的样式。

    @property(null_resettable,nonatomic,copy) NSString *text;
    

    @property(nullable,nonatomic,strong) UIFont *font;

    属性描述 : 文本的字体。此属性应用于整个文本字符串。此属性的默认值是系统字体的主体样式。可以使用UIFont类的方法获取有关系统上可用字体的信息。

    在iOS 6及更高版本中,为该属性指定一个新值将导致新字体应用于文本视图的整个内容。如果只想将字体应用于文本的一部分,则必须使用所需的样式信息创建一个新的属性化字符串,并将其分配给attributed text属性。

    @property(nullable,nonatomic,strong) UIFont *font;
    

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

    属性描述 : 文本的颜色。此属性应用于整个文本字符串。默认文本颜色为黑色。

    在iOS 6及更高版本中,为该属性指定一个新值将使新的文本颜色应用于文本视图的整个内容。如果只想将颜色应用于文本的一部分,则必须使用所需的样式信息创建一个新的属性化字符串,并将其分配给attributed text属性。

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

    @property(nonatomic) NSTextAlignment textAlignment;

    属性描述 : 设置文本的对齐方式。此属性应用于整个文本字符串。该属性的默认值是NSTextAlignmentNatural。

    将新值赋给此属性将导致新文本对齐应用于文本视图的整个内容。如果希望仅对文本的一部分应用对齐,则必须创建一个新的带属性字符串,该字符串具有所需的样式信息,并将其分配给attributedText属性。

    @property(nonatomic) NSTextAlignment textAlignment; 
    

    @property(nonatomic,getter=isSelectable) BOOL selectable API_AVAILABLE(ios(7.0));

    属性描述 :切换可选择性,它控制用户选择内容以及与url和附件交互的能力。在tvOS上,这也使得文本视图可以聚焦。

    @property(nonatomic,getter=isSelectable) BOOL selectable API_AVAILABLE(ios(7.0));
    

    @property(nonatomic,getter=isEditable) BOOL editable API_UNAVAILABLE(tvOS);

    属性描述 : 文本是否可编辑的布尔值。此属性的默认值为“YES”。

    @property(nonatomic,getter=isEditable) BOOL editable API_UNAVAILABLE(tvOS);
    

    @property(nonatomic) UIDataDetectorTypes dataDetectorTypes API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(tvOS);

    属性描述 :在文本视图中转换为可点击URL的数据类型。可以使用此属性指定应在文本视图中自动转换为URL的数据类型(电话号码、http链接等)。点击时,文本视图打开负责处理URL类型的应用程序,并将URL传递给它。请注意,如果文本视图的可编辑属性设置为“YES”,则不会进行数据检测。

    //UIDataDetectorTypes枚举值如下:
    typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {
        UIDataDetectorTypePhoneNumber  = 1 << 0, // 电话号码检测
        UIDataDetectorTypeLink  = 1 << 1, // URL 检测
        UIDataDetectorTypeAddress API_AVAILABLE(ios(4.0))  = 1 << 2, // 街道地址检测
        UIDataDetectorTypeCalendarEvent API_AVAILABLE(ios(4.0)) = 1 << 3, // 事件检测
        UIDataDetectorTypeShipmentTrackingNumber API_AVAILABLE(ios(10.0)) = 1 << 4, // 发货运单号检测
        UIDataDetectorTypeFlightNumber API_AVAILABLE(ios(10.0)) = 1 << 5, // 班机号码检测
        UIDataDetectorTypeLookupSuggestion API_AVAILABLE(ios(10.0)) = 1 << 6, // 用户可能需要查找信息
        UIDataDetectorTypeNone  = 0,   // 禁用检测
        UIDataDetectorTypeAll = NSUIntegerMax    // 启用所有类型,包括以后可能添加的类型
    } API_UNAVAILABLE(tvOS);
    
    @property(nonatomic) UIDataDetectorTypes dataDetectorTypes API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(tvOS);
    

    @property(nonatomic) BOOL allowsEditingTextAttributes API_AVAILABLE(ios(6.0));

    属性描述 : 一个布尔值,指示文本视图是否允许用户编辑样式信息。当设置为YES时,文本视图允许用户更改当前选定文本的基本样式。编辑菜单中列出了可用的样式选项,并且仅适用于所选内容。此属性的默认值为NO。

    @property(nonatomic) BOOL allowsEditingTextAttributes API_AVAILABLE(ios(6.0));
    

    @property(null_resettable,copy) NSAttributedString *attributedText API_AVAILABLE(ios(6.0));

    属性描述 : 文本视图显示的样式文本。将新值赋给该属性也会用相同的字符串数据替换text属性的值,尽管没有任何格式化信息。此外,还更新了字体、textColor和textal属性,以反映文本视图的输入属性。

    @property(null_resettable,copy) NSAttributedString *attributedText API_AVAILABLE(ios(6.0));
    

    @property(nonatomic,copy) NSDictionary<NSAttributedStringKey, id> *typingAttributes API_AVAILABLE(ios(6.0));

    属性描述 : 应用于用户输入的新文本的属性。此字典包含要应用于新键入文本的属性键(和相应的值)。当文本视图的选择改变时,字典的内容将自动清除。

    @property(nonatomic,copy) NSDictionary<NSAttributedStringKey, id> *typingAttributes API_AVAILABLE(ios(6.0));
    

    @property (nullable, readwrite, strong) UIView *inputView;

    属性描述 : 当文本视图成为第一个响应时显示的自定义输入视图。如果此属性中的值为nil,则文本视图在成为第一个响应者时显示标准系统键盘。将自定义视图分配给此属性将导致显示该视图。此属性的默认值为nil。

    @property (nullable, readwrite, strong) UIView *inputView;
    

    @property (nullable, readwrite, strong) UIView *inputAccessoryView;

    属性描述 : 此属性的默认值为nil。当文本视图成为第一个响应对象时,将视图分配给此属性将导致该视图显示在标准系统键盘之上(如果提供自定义输入视图,则显示在自定义输入视图之上)。例如,可以使用此属性将自定义工具栏附加到键盘上。

    @property (nullable, readwrite, strong) UIView *inputAccessoryView;
    

    @property(nonatomic) BOOL clearsOnInsertion API_AVAILABLE(ios(6.0));

    属性描述 : 一个布尔值,指示插入文本是否替换以前的内容。此属性的默认值为NO。当此属性的值为YES且文本视图处于编辑模式时,将隐藏选择UI并插入新文本以清除文本视图的内容,并将此属性的值设置回NO。

    @property(nonatomic) BOOL clearsOnInsertion API_AVAILABLE(ios(6.0));
    

    @property(nonatomic, assign) UIEdgeInsets textContainerInset API_AVAILABLE(ios(7.0));

    属性描述 : 文本视图内容区域中文本容器布局区域的内边距。此属性为文本视图中布局的文本提供文本边距。默认情况下,此属性的值为(8,0,8,0)。

    @property(nonatomic, assign) UIEdgeInsets textContainerInset API_AVAILABLE(ios(7.0));
    

    @property(nonatomic,readonly) NSLayoutManager *layoutManager API_AVAILABLE(ios(7.0));

    属性描述 : 布局管理器,为接收者的文本容器布局文本。此属性是一个方便的访问器,提供通过文本容器的访问。

    @property(nonatomic,readonly) NSLayoutManager *layoutManager API_AVAILABLE(ios(7.0));
    

    @property(null_resettable, nonatomic, copy) NSDictionary<NSAttributedStringKey,id> *linkTextAttributes API_AVAILABLE(ios(7.0));

    属性描述 : 应用于链接的属性。默认属性指定带有单个下划线和指针光标的蓝色文本。

    @property(null_resettable, nonatomic, copy) NSDictionary<NSAttributedStringKey,id> *linkTextAttributes API_AVAILABLE(ios(7.0));
    

    @property (nonatomic) BOOL usesStandardTextScaling API_AVAILABLE(ios(13.0));

    属性描述 : 当打开时,这将更改文本的呈现比例以匹配标准文本缩放,并在将文本视图的内容复制到粘贴板时保留原始字体点大小。显示大量文本内容的应用程序,如文本查看器或编辑器,应该打开这个选项并使用标准的文本缩放。

    @property (nonatomic) BOOL usesStandardTextScaling API_AVAILABLE(ios(13.0));
    

    UITextViewDelegate提供的一些方法

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

    函数描述 : 询问代理是否应在指定的文本视图中开始编辑。当用户执行通常会启动编辑会话的操作时,文本视图首先调用此方法,以查看是否应该继续进行编辑。在大多数情况下,只需从这个方法返回YES就可以继续编辑。

    由代理实现此方法是可选的。如果它不存在,编辑过程就像这个方法已经返回YES一样。

    参数 :

    textView :即将开始编辑的文本视图。

    返回值 :

    如果应启动编辑会话,则为“YES”;否则,为“NO”,则不允许编辑。

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

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

    函数描述 : 询问代理是否应在指定的文本视图中停止编辑。当要求文本视图放弃第一响应程序状态时,调用此方法。当用户试图将编辑焦点更改为其他控件时,可能会发生这种情况。但是,在焦点实际更改之前,文本视图调用此方法以使委托有机会决定是否应该这样做。

    通常,将从该方法返回YES以允许文本视图放弃第一个响应者状态。但是,如果代理要验证文本视图的内容,则可能返回NO。通过返回NO,可以防止用户在文本视图包含有效值之前切换到其他控件。

    注意,此方法仅提供有关编辑是否应结束的建议。即使从该方法返回NO,编辑仍有可能结束。例如,当文本视图被从其父视图或窗口中删除而被迫放弃第一响应程序状态时,可能会发生这种情况。

    代理对此方法的实现是可选的。如果不存在,则第一响应程序状态将被放弃,如同此方法返回了YES一样。

    参数 :

    textView :编辑即将结束的文本视图。

    返回值 :

    如果应停止编辑,则为“YES”;否则,如果应继续编辑会话,则为“NO”

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

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

    函数描述 : 通知代理已开始编辑指定的文本视图。此方法的实现是可选的。文本视图在用户开始在文本视图中进行编辑之后,在实际进行任何更改之前,立即将此消息发送给其代理。可以使用此方法设置任何与编辑相关的数据结构,并通常为代理准备接收将来的编辑消息。

    参数 :

    textView : 开始编辑的文本视图。

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

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

    函数描述 : 通知代理指定文本视图的编辑已结束。此方法的实现是可选的。文本视图在关闭任何未完成的编辑并放弃其第一响应状态后将此消息发送给其代理。您可以使用此方法来销毁开始编辑时设置的任何数据结构或更改任何状态信息。

    参数 :

    textView : 结束编辑的文本视图。

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

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

    属性描述 : 询问代理是否应在文本视图中替换指定的文本。每当用户键入新字符或删除现有字符时,文本视图调用此方法。此方法的实现是可选的。在文本提交到文本视图存储之前,可以使用此方法替换文本。例如,拼写检查器可以使用此方法将拼写错误的单词替换为正确的拼写。

    参数 :

    textView : 包含更改的文本视图。

    range : 当前选择范围。如果范围长度为0,则范围反映当前插入点。如果用户按下Delete键,则范围的长度为1,空字符串对象将替换该字符。

    text :要插入的文本。

    返回值 :

    如果旧文本应替换为新文本,则为“YES”;如果应中止替换操作,则为“NO”。

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

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

    函数描述 : 通知委托指定文本视图中的文本或属性已被用户更改。文本视图调用此方法以响应用户对文本发起的更改。此方法不是响应以编程方式启动的更改而调用的。

    参数 :

    textView :包含更改的文本视图。

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

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

    函数描述 : 通知代理在指定的文本视图中更改了文本选择。此方法的实现是可选的。可以使用文本视图的selectedRange属性来获取新的选择。

    参数 :

    textView : 所选内容已更改的文本视图。

     (void)textViewDidChangeSelection:(UITextView *)textView;
    

    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction API_AVAILABLE(ios(10.0));

    函数描述 : 询问代理指定的文本视图是否应允许指定类型的用户与给定文本范围内的给定URL进行交互。此方法仅在与URL链接的第一次交互时调用。例如,当用户希望第一次与URL交互时,调用此方法以显示他们可以执行的操作列表;如果用户从列表中选择打开操作,则不调用此方法,因为“打开”表示与同一URL的第二次交互。

    文本视图中的链接只有在文本视图可选择但不可编辑时才是交互式的。也就是说,如果UITextViewselectable属性的值为YES,而editable属性的值为NO。

    参数 :

    textView :包含文本附件的文本视图。

    URL :要处理的URL。

    characterRange : 包含URL的字符范围。

    interaction : 正在发生的交互类型(有关可能的值,请参阅UITextItemInteraction)。

    返回值 :

    如果允许与URL交互,则为YES;如果不允许交互,则为NO。

    //UITextItemInteraction的枚举值如下:
    typedef NS_ENUM(NSInteger, UITextItemInteraction) {
        UITextItemInteractionInvokeDefaultAction,//用户希望对文本项执行默认操作;例如,打开URL。
        UITextItemInteractionPresentActions,//用户希望看到可以对文本项执行的操作列表,例如以其他方式打开链接或从链接下载内容。
        UITextItemInteractionPreview,//用户希望获得文本项表示的内容的预览,例如通过启动链接上的peek和pop。
    } API_AVAILABLE(ios(10.0));
    
    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction API_AVAILABLE(ios(10.0));
    

    - (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction API_AVAILABLE(ios(10.0));

    函数描述 : 询问委托,指定的文本视图是否应允许在给定文本范围内与提供的文本附件进行指定类型的用户交互。如果用户轻击或长按文本附件且其图像属性不是nil,则文本视图将调用此方法。除了将文本附件内联显示外,还可以使用此方法触发操作。

    参数 :

    textView : 包含文本附件的文本视图。

    textAttachment : 文本附件。

    characterRange : 包含文本附件的字符范围。

    interaction : 正在发生的交互类型(有关可能的值,请参阅UITextItemInteraction)。

    返回值 :

    如果允许与文本附件交互,则为“YES”;如果不允许交互,则为“NO”。

    - (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction API_AVAILABLE(ios(10.0));
    

    UITextView相关通知

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidBeginEditingNotification;

    通知描述 :通知观察者一个编辑会话在一个文本视图中开始。受影响的视图存储在通知的对象参数中。没有使用userInfo字典。

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidBeginEditingNotification;
    

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidChangeNotification;

    通知描述 : 通知观察者文本视图中的文本已更改。受影响的视图存储在通知的对象参数中。没有使用userInfo字典。

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidChangeNotification;
    

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidEndEditingNotification;

    通知描述 : 通知观察者,文本视图的编辑会话已结束。受影响的视图存储在通知的对象参数中。没有使用userInfo字典。

    UIKIT_EXTERN NSNotificationName const UITextViewTextDidEndEditingNotification;
    

    UITextView添加placeholder代码示例

    //
    //  UIPlaceHolderTextView.h
    //  
    
    #import <UIKit/UIKit.h>
    
    
    @interface UIPlaceHolderTextView : UITextView<UITextViewDelegate>
    
    @property(nonatomic, retain) UILabel *placeHolderLabel;
    @property(nonatomic, retain) NSString *placeholder;
    @property(nonatomic, retain) UIColor *placeholderColor;
    @property(nonatomic, strong) NSIndexPath *indexPath;
    
    -(void)textChanged:(NSNotification*)notification;
    
    @end
    
    
    //
    //  UIPlaceHolderTextView.m
    //  
    
    #import "UIPlaceHolderTextView.h"
    
    @implementation UIPlaceHolderTextView
    
    -(void)dealloc{
        
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    
    }
    
    -(void)awakeFromNib{
        
        [super awakeFromNib];
        
        [self setPlaceholder:@""];
        
        [self setPlaceholderColor:[UIColor grayColor]];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
    
    }
    
    - (id)initWithFrame:(CGRect)frame{
        
        if((self = [super initWithFrame:frame])){
            //默认提示文本为空
            [self setPlaceholder:@""];
            //默认提示文本颜色
            [self setPlaceholderColor:[UIColor lightGrayColor]];
            //设置键盘return键样式
            self.returnKeyType = UIReturnKeyDefault;
            //设置代理
            [super setDelegate:self];
            //监听文本改变事件
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
            
        }
        
        return self;
        
    }
    
    ///文本改变事件
    - (void)textChanged:(NSNotification *)notification{
        
        //文本改变时判断文本视图中是否有提示语
        if([[self placeholder] length] == 0){
            
            return;
            
        }
        //如果没有输入文本
        if([[self text] length] == 0){
            //显示文本视图中的提示语
            [[self viewWithTag:999] setAlpha:1];
            
        }else{
            //隐藏文本视图中的提示语
            [[self viewWithTag:999] setAlpha:0];
            
        }
        
    }
    
    - (void)setText:(NSString *)text {
        
        [super setText:text];
        
        [self textChanged:nil];
        
    }
    
    - (void)drawRect:(CGRect)rect{
        
        if( [[self placeholder] length] > 0 ){
            //设置文本提示标签
            if (self.placeHolderLabel == nil ){
                
                self.placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,5,self.bounds.size.width - 16,0)];
                self.placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping ;
                self.placeHolderLabel.numberOfLines = 0;
                self.placeHolderLabel.font = self.font;
                self.placeHolderLabel.backgroundColor = [UIColor clearColor];
                self.placeHolderLabel.textColor = self.placeholderColor;
                self.placeHolderLabel.alpha = 0;
                self.placeHolderLabel.tag = 999;
                [self addSubview:self.placeHolderLabel];
                
            }
            
            self.placeHolderLabel.text = self.placeholder;
            [self.placeHolderLabel sizeToFit];
            [self sendSubviewToBack:self.placeHolderLabel];
            
        }
        
        if( [[self text] length] == 0 && [[self placeholder] length] > 0 ){
            
            [[self viewWithTag:999] setAlpha:1];
            
        }
        [super drawRect:rect];
        
    }
    
    ///隐藏键盘,实现UITextViewDelegate
    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{
        
        if ([text isEqualToString:@"\n"]) {
            
            [textView resignFirstResponder];
            NSLog(@"aa");
            
            return NO;
        }
        
        return YES;
        
    }
    
    @end
    
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
        
        UIPlaceHolderTextView *placeHolderTextView = [[UIPlaceHolderTextView alloc]initWithFrame:CGRectZero];
        
        placeHolderTextView.backgroundColor = [UIColor greenColor];
        placeHolderTextView.placeholder = @"粘贴文本,可自动识别姓名、电话和地址。\r如:李明 139****8888 北京市朝阳区xx街道xx大厦xx楼xx室。";
        placeHolderTextView.placeholderColor = [UIColor redColor];
        placeHolderTextView.font = [UIFont systemFontOfSize:12];
        [self.view addSubview:placeHolderTextView];
        [placeHolderTextView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(self.view);
            make.size.mas_equalTo(CGSizeMake(200, 70));
        }];
        
    }
    

    效果如下:


    Jietu20191213-094320-HD.gif

    关于键盘的监听

    UIKIT_EXTERN NSNotificationName const UIKeyboardWillShowNotification API_UNAVAILABLE(tvOS);

    描述 : 键盘将要显示的通知,通知对象为nil。userInfo字典包含关于键盘的信息。使用键盘通知用户信息键中描述的键,从userInfo字典中获取键盘的位置和大小。

    UIKIT_EXTERN NSNotificationName const UIKeyboardWillShowNotification API_UNAVAILABLE(tvOS);
    

    UIKIT_EXTERN NSNotificationName const UIKeyboardDidShowNotification API_UNAVAILABLE(tvOS);

    描述 : 键盘已经显示的通知;通知对象为nil。userInfo字典包含关于键盘的信息。使用键盘通知用户信息键中描述的键,从userInfo字典中获取键盘的位置和大小。

    UIKIT_EXTERN NSNotificationName const UIKeyboardDidShowNotification API_UNAVAILABLE(tvOS);
    

    UIKIT_EXTERN NSNotificationName const UIKeyboardWillHideNotification API_UNAVAILABLE(tvOS);

    描述 : 键盘将要隐藏的通知,通知对象为nil。userInfo字典包含关于键盘的信息。使用键盘通知用户信息键中描述的键,从userInfo字典中获取键盘的位置和大小。

    UIKIT_EXTERN NSNotificationName const UIKeyboardWillHideNotification API_UNAVAILABLE(tvOS);
    

    UIKIT_EXTERN NSNotificationName const UIKeyboardDidHideNotification API_UNAVAILABLE(tvOS);

    描述 :键盘隐藏后的通知,通知对象为nil。userInfo字典包含关于键盘的信息。使用键盘通知用户信息键中描述的键,从userInfo字典中获取键盘的位置和大小。

    UIKIT_EXTERN NSNotificationName const UIKeyboardDidHideNotification API_UNAVAILABLE(tvOS);
    

    例如 :

    @interface TestCodeController ()<UITextViewDelegate>
    
    @property (nonatomic, strong) UITextView *textView;
    
    @end
    
    @implementation TestCodeController
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
        
        UITextView *textView = [[UITextView alloc]initWithFrame:CGRectZero];
        textView.backgroundColor = [UIColor grayColor];
        textView.font = [UIFont systemFontOfSize:15];
        textView.textColor = [UIColor whiteColor];
        textView.delegate = self;
        self.textView = textView;
        [self.view addSubview:self.textView];
        [textView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(self.view);
            make.size.mas_equalTo(CGSizeMake(150, 100));
        }];
        //监听键盘将要出现
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        //监听键盘已经出现
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
        //监听键盘将要隐藏
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
        //监听键盘已经隐藏
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    }
    
    
    - (void)keyboardWillShow:(NSNotification *)notification{
        NSLog(@"键盘将要出现");
    }
    
    - (void)keyboardDidShow:(NSNotification *)notification{
        NSLog(@"键盘已经出现");
    }
    
    - (void)keyboardWillHide:(NSNotification *)notification{
        NSLog(@"键盘将要隐藏");
    }
    
    - (void)keyboardDidHide:(NSNotification *)notification{
        NSLog(@"键盘已经隐藏");
    }
    
    ///隐藏键盘,实现UITextViewDelegate
    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{
        
        if ([text isEqualToString:@"\n"]) {
            
            [textView resignFirstResponder];
            NSLog(@"放弃第一响应对象,隐藏键盘");
            
            return NO;
        }
        
        return YES;
    }
    
    
    Jietu20191209-233357-HD.gif

    获取键盘的高度可以在通知执行的方法中添加如下代码片段,例如:

    - (void)keyboardWillShow:(NSNotification *)notification{
        NSLog(@"键盘将要出现");
        //获取高度
        NSDictionary *userInfo = [notification userInfo];
        NSValue *value = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardRect = [value CGRectValue];
        int height = keyboardRect.size.height;
        NSLog(@"%d",height);
    }
    

    问题记录

    设置UITextView属性时,要注意设置属性的顺序,要先设置字体大小,再设置内容,例如 :

    UITextView *textView = [[UITextView alloc]initWithFrame:CGRectZero];
        textView.backgroundColor = [UIColor grayColor];
        textView.font = [UIFont systemFontOfSize:15];
        textView.text = @"文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的";
        textView.textColor = [UIColor whiteColor];
        textView.delegate = self;
        self.textView = textView;
        [self.view addSubview:self.textView];
        [textView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(self.view);
            make.size.mas_equalTo(CGSizeMake(150, 100));
        }];
    

    它和你玩的样式就挺正常:

    Jietu20191219-111824@2x.gif

    要是先设置内容,再设置字体大小,例如 :

    UITextView *textView = [[UITextView alloc]initWithFrame:CGRectZero];
        textView.backgroundColor = [UIColor grayColor];
        textView.text = @"文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的";
        textView.font = [UIFont systemFontOfSize:15];
        textView.textColor = [UIColor whiteColor];
        textView.delegate = self;
        self.textView = textView;
        [self.view addSubview:self.textView];
        [textView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(self.view);
            make.size.mas_equalTo(CGSizeMake(150, 100));
        }];
    

    它玩玩的就开始扬沙子了:

    Jietu20191219-114415@2x.gif

    要是非要先设置内容,再设置字体大小,可以增加这个属性textView.layoutManager.allowsNonContiguousLayout = NO;
    例如 :

    UITextView *textView = [[UITextView alloc]initWithFrame:CGRectZero];
        textView.backgroundColor = [UIColor grayColor];
        textView.text = @"文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的,文本内容挺多的";
        textView.font = [UIFont systemFontOfSize:15];
        textView.layoutManager.allowsNonContiguousLayout = NO;
        textView.textColor = [UIColor whiteColor];
        textView.delegate = self;
        self.textView = textView;
        [self.view addSubview:self.textView];
        [textView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(self.view);
            make.size.mas_equalTo(CGSizeMake(150, 100));
        }];
    
    

    它和你玩的样式就又挺正常了:

    截屏2019-12-20下午5.52.31.png

    相关文章

      网友评论

          本文标题:UITextView学习笔记

          本文链接:https://www.haomeiwen.com/subject/ajrmgctx.html