(Swift&OC)UITextView的的使用技巧

一、关键词

  • 1.1.弹性方向

    alwaysBounceVertical垂直
    alwaysBounceHorizontal 水平

  • 1.2.滑动UITextView键盘下去
    keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag

  • 1.3.输入框是否有内容

    hasText : 状态是truefalse

  • 1.4. UITextView上面添加view

    inputAccessoryView

  • 1.5. 自定义键盘

    inputView

  • 1.6.有关键盘的通知(设置动画节奏),建议多看看下面的代码注释

    • UIView动画的本质是核心动画, 所以可以给核心动画设置动画节奏

二、Swift中的使用

  • 2.1.键盘上加一个view(JKTextViewController)

    import UIKit
    
    class JKTextViewController: UIViewController {
    
    override func viewDidLoad() {
      super.viewDidLoad()
      
      /**
          1.控制器的基本设置
       */
      title = "JKTextView"
      view.backgroundColor = UIColor.white
      self.edgesForExtendedLayout = []
      
      /**
          2.添加UITextView和提示内容以及键盘上的view
       */
      view.addSubview(textView)
      textView.addSubview(placeholderLabel)
      textView.inputAccessoryView = jkInputAccessoryView
    }
    
    // MARK: UITextView 的创建
    private lazy var textView:UITextView = {
      
      let textview = UITextView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height-64))
      textview.font = UIFont.systemFont(ofSize: 20)
      // 垂直水平方向有弹性
      textview.alwaysBounceVertical = true
      // 垂直方向滑动键盘下去
      textview.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
      return textview
    }()
    
    // MARK: UILabel 提示文本
    private lazy var placeholderLabel: UILabel = {
      
      let label = UILabel(frame: CGRect(x: 5, y: 9, width: UIScreen.main.bounds.width-10, height: 22))
      label.font = UIFont .systemFont(ofSize: 20)
      label.textColor = UIColor.red
      label.text = "分享新鲜事"
      return label
      
    }()
    
     // MARK: UIView 键盘上加个view
     private lazy var jkInputAccessoryView: UIView = {
      
       let inputView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
       inputView.backgroundColor = UIColor.green
       return inputView
      
     }()
    }
    
    // MARK: UITextView代理的实现
     extension JKTextViewController: UITextViewDelegate{
    
     func textViewDidChange(_ textView: UITextView) {
      
       /**
           hasText 可以判断UITextView是否有内容
        */
       placeholderLabel.isHidden = textView.hasText
    
       }
     }
    
  • 2.2.切换自定义键盘(JKTextViewController)

    import UIKit
    
    class JKTextViewController: UIViewController {
    
    override func viewDidLoad() {
      super.viewDidLoad()
      
      // 0.注册通知监听键盘弹出和消失
      NotificationCenter.default.addObserver(self, selector: #selector(JKTextViewController.keyboardChange), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
      
      /**
          1.控制器的基本设置
       */
      title = "JKTextView"
      view.backgroundColor = UIColor.white
      self.edgesForExtendedLayout = []
      
      /**
          2.添加UITextView和提示内容以及键盘上的view
       */
      view.addSubview(textView)
      textView.addSubview(placeholderLabel)
      /**
          3.输入框上面自定义一个view
       */
      view.addSubview(toolBar)
      toolBar.addSubview(toolBarBtn)
      
    }
    
     /**
         只要键盘改变就会调用
      */
     @objc func keyboardChange(notify: NSNotification)
     {
      // 1.取出键盘最终的rect
      let value = notify.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
      let rect = value.cgRectValue
      
      // 2.修改工具条的约束
      // 弹出 : Y = 409 height = 258
      // 关闭 : Y = 667 height = 258
      // 667 - 409 = 258
      // 667 - 667 = 0
      
      let duration = notify.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
      /*
       工具条回弹是因为执行了两次动画, 而系统自带的键盘的动画节奏(曲线) 7
       7在apple API中并没有提供给我们, 但是我们可以使用
       7这种节奏有一个特点: 如果连续执行两次动画, 不管上一次有没有执行完毕, 都会立刻执行下一次
       也就是说上一次可能会被忽略
       
       如果将动画节奏设置为7, 那么动画的时长无论如何都会自动修改为0.5
       
       UIView动画的本质是核心动画, 所以可以给核心动画设置动画节奏
       */
      // 1.取出键盘的动画节奏
      let curve = notify.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! NSNumber
      
      UIView.animate(withDuration: duration.doubleValue) { () -> Void in
          
          // 2.设置动画节奏
          UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: curve.intValue)!)
          self.toolBar.frame.origin.y = rect.origin.y - 64 - 44
      }
      
      let anim = toolBar.layer.animation(forKey: "position")
      print("duration = \(String(describing: anim?.duration))")
    }
    
    // MARK: 切换键盘
    @objc func switchKeyBoard() {
      
      print("切换表情键盘")
      print(#function)
      // 结论: 如果是系统自带的键盘, 那么inputView = nil
      //      如果不是系统自带的键盘, 那么inputView != nil
      //        print(textView.inputView)
      
      // 1.关闭键盘
      textView.resignFirstResponder()
      
      // 2.设置inputView
      textView.inputView = (textView.inputView == nil) ? keyBoardView : nil
      
      // 3.从新召唤出键盘
      textView.becomeFirstResponder()
    }
    
     deinit
     {
       NotificationCenter.default.removeObserver(self)
     }
    
     // MARK: UITextView 的创建
     private lazy var textView:UITextView = {
      
      let textview = UITextView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height-64))
      textview.font = UIFont.systemFont(ofSize: 20)
      // 垂直水平方向有弹性
      textview.alwaysBounceVertical = true
      // 垂直方向滑动键盘下去
      textview.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
      return textview
     }()
    
     // MARK: UILabel 提示文本
     private lazy var placeholderLabel: UILabel = {
      
      let label = UILabel(frame: CGRect(x: 5, y: 9, width: UIScreen.main.bounds.width-10, height: 22))
      label.font = UIFont .systemFont(ofSize: 20)
      label.textColor = UIColor.red
      label.text = "分享新鲜事"
      return label
      
     }()
    
     // MARK: UIView 键盘上加个view
     private lazy var toolBar: UIView = {
      
      let inputView = UIView(frame: CGRect(x: 0, y: UIScreen.main.bounds.height-64-44, width: UIScreen.main.bounds.width, height: 44))
      inputView.backgroundColor = UIColor.green
      return inputView
      
     }()
    
     // MARK: UIView 键盘上加个view 上面加个button
     private lazy var toolBarBtn: UIButton = {
      
      let btn = UIButton(frame: CGRect(x: UIScreen.main.bounds.width-150, y: 0, width: 100, height: 44))
      btn.backgroundColor = UIColor.purple
      btn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
      btn.setTitle("切换键盘", for: UIControlState.normal)
      btn.addTarget(self, action: #selector(JKTextViewController.switchKeyBoard), for: UIControlEvents.touchUpInside)
      return btn
      
     }()
    
     // MARK: 自定义键盘
     private lazy var keyBoardView: UIView = {
      
      let keyboardView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 100))
      keyboardView.backgroundColor = UIColor.brown
      return keyboardView
      
      }()
    }
    
    // MARK: UITextView代理的实现
    extension JKTextViewController: UITextViewDelegate{
    
      func textViewDidChange(_ textView: UITextView) {
        /**
            hasText 可以判断UITextView是否有内容
         */
         placeholderLabel.isHidden = textView.hasText
      }
    }
    

三、OC中的使用

  • 3.1.键盘上加一个view(TestViewController)

    #import "TestViewController.h"
    #define CIO_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
    #define CIO_SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
    #define TitleBlackCOLOR [UIColor colorWithRed:(51)/255.0 green:(51)/255.0 blue:(51)/255.0 alpha:1]
    #define backGayCOLOR [UIColor colorWithRed:(232)/255.0 green:(232)/255.0 blue:(232)/255.0 alpha:1]
    @interface TestViewController ()<UITextViewDelegate>
    
    /**
       UITextView输入框的创建
     */
    @property(nonatomic,strong) UITextView *jkTextView;
    /**
     提示内容
    */
    @property(nonatomic,strong) UILabel *placeholderLabel;
    /**
      键盘上添加一个view
     */
    @property(nonatomic,strong) UIView *jkInputAccessoryView;
    
    @end
    
    @implementation TestViewController
    
    - (void)viewDidLoad {
       [super viewDidLoad];
    
       self.edgesForExtendedLayout = UIRectEdgeNone;
       self.view.backgroundColor = [UIColor whiteColor];
    
       [self.view addSubview:self.jkTextView];
       [self.jkTextView addSubview:self.placeholderLabel];
       self.jkTextView.inputAccessoryView = self.jkInputAccessoryView;
    
    }
    
    #pragma mark  textview的变化
    -(void)textViewDidChange:(UITextView *)textView{
    
       self.placeholderLabel.hidden = textView.hasText;
    }
    
    -(UITextView *)jkTextView{
    
      if (!_jkTextView) {
    
        _jkTextView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, CIO_SCREEN_WIDTH,CIO_SCREEN_HEIGHT-64)];
        [_jkTextView becomeFirstResponder];
        // UITextView可以垂直滑动弹出键盘
        _jkTextView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
        _jkTextView.alwaysBounceVertical = YES;
        _jkTextView.delegate = self;
        _jkTextView.backgroundColor = [UIColor whiteColor];
        _jkTextView.textColor = TitleBlackCOLOR;
        _jkTextView.font = [UIFont systemFontOfSize:16.f];
       }
      return _jkTextView;
    }
    
    -(UILabel *)placeholderLabel{
    
        if (!_placeholderLabel) {
    
           _placeholderLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, 9, CIO_SCREEN_WIDTH-10, 22)];
           _placeholderLabel.text = @"分享新鲜事";
           _placeholderLabel.textColor = backGayCOLOR;
           _placeholderLabel.font = [UIFont systemFontOfSize:20];
         }
    
      return _placeholderLabel;
    }
    
    -(UIView *)jkInputAccessoryView{
    
       if (!_jkInputAccessoryView) {
    
          _jkInputAccessoryView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CIO_SCREEN_WIDTH, 44)];
          _jkInputAccessoryView.backgroundColor = [UIColor redColor];
        }
       return _jkInputAccessoryView;
     }
    
    @end
    
  • 3.2.切换自定义键盘(TestViewController)

    #import "TestViewController.h"
    #import "UIView+JKUiviewExtension.h"
    
    #define CIO_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
    #define CIO_SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
    #define TitleBlackCOLOR [UIColor colorWithRed:(51)/255.0 green:(51)/255.0 blue:(51)/255.0 alpha:1]
    #define backGayCOLOR [UIColor colorWithRed:(232)/255.0 green:(232)/255.0 blue:(232)/255.0 alpha:1]
    
    @interface TestViewController ()<UITextViewDelegate>
    
     /**
         UITextView输入框的创建
       */
       @property(nonatomic,strong) UITextView *jkTextView;
       /**
          提示内容
        */
       @property(nonatomic,strong) UILabel *placeholderLabel;
       /**
           键盘上添加一个view
        */
        @property(nonatomic,strong) UIView *tooBarView;
        @property(nonatomic,strong) UIButton *tooBarViewBtn;
    
    // 自定义键盘
    @property(nonatomic,strong) UIView *keyBoardView;
    
    @end
    
    @implementation TestViewController
    
    - (void)viewDidLoad {
      [super viewDidLoad];
    
      self.edgesForExtendedLayout = UIRectEdgeNone;
      self.view.backgroundColor = [UIColor whiteColor];
    
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
      [self.view addSubview:self.jkTextView];
      [self.jkTextView addSubview:self.placeholderLabel];
      [self.view addSubview: self.tooBarView];
      [self.tooBarView addSubview:self.tooBarViewBtn];
    }
    
     #pragma mark 切换键盘
     -(void)switchKeyBoard{
    
       // 1.关闭键盘
       [self.jkTextView resignFirstResponder];
    
       // 2.设置inputView
       self.jkTextView.inputView = (self.jkTextView.inputView == nil) ? self.keyBoardView : nil;
    
      // 3.从新召唤出键盘
      [self.jkTextView becomeFirstResponder];
     }
    
     #pragma mark 监听键盘
     //实现接收到通知时的操作
     -(void)keyBoardChange:(NSNotification *)notification
     {
       //获取键盘弹出或收回时frame
       CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
       //获取键盘弹出所需时长
      float duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
    
      NSLog(@"键盘的弹出的时间=%lf",duration);
    
      /*
        工具条回弹是因为执行了两次动画, 而系统自带的键盘的动画节奏(曲线) 7
        7在apple API中并没有提供给我们, 但是我们可以使用
        7这种节奏有一个特点: 如果连续执行两次动画, 不管上一次有没有执行完毕, 都会立刻执行下一次
        也就是说上一次可能会被忽略
    
        如果将动画节奏设置为7, 那么动画的时长无论如何都会自动修改为0.5
    
        UIView动画的本质是核心动画, 所以可以给核心动画设置动画节奏
      */
     // 1.取出键盘的动画节奏
     float curve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] floatValue];
    
     [UIView animateWithDuration:duration animations:^{
      
      // 2.设置动画节奏
      [UIView setAnimationCurve:curve];
      
      self.tooBarView.y = keyboardFrame.origin.y - 64 - 44;
      
     }];
    }
    
    #pragma mark  textview的变化
    -(void)textViewDidChange:(UITextView *)textView{
    
        self.placeholderLabel.hidden = textView.hasText;
    }
    
    -(UITextView *)jkTextView{
    
       if (!_jkTextView) {
      
      _jkTextView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, CIO_SCREEN_WIDTH,CIO_SCREEN_HEIGHT-64)];
      [_jkTextView becomeFirstResponder];
      // UITextView可以垂直滑动弹出键盘
      _jkTextView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
      _jkTextView.alwaysBounceVertical = YES;
      _jkTextView.delegate = self;
      _jkTextView.backgroundColor = [UIColor whiteColor];
      _jkTextView.textColor = TitleBlackCOLOR;
      _jkTextView.font = [UIFont systemFontOfSize:16.f];
    }
    
     return _jkTextView;
    }
    
    -(UILabel *)placeholderLabel{
    
       if (!_placeholderLabel) {
      
       _placeholderLabel = [[UILabel alloc]initWithFrame:CGRectMake(5, 9, CIO_SCREEN_WIDTH-10, 22)];
       _placeholderLabel.text = @"分享新鲜事";
       _placeholderLabel.textColor = backGayCOLOR;
       _placeholderLabel.font = [UIFont systemFontOfSize:20];
      }
    
     return _placeholderLabel;
    }
    
    -(UIView *)tooBarView{
    
       if (!_tooBarView) {
    
         _tooBarView = [[UIView alloc]initWithFrame:CGRectMake(0, CIO_SCREEN_HEIGHT-64-44, CIO_SCREEN_WIDTH, 44)];
         _tooBarView.backgroundColor = [UIColor redColor];
       }
      return _tooBarView;
     }
    
     -(UIButton *)tooBarViewBtn{
    
        if (!_tooBarViewBtn) {
      
           _tooBarViewBtn = [[UIButton alloc]initWithFrame:CGRectMake(CIO_SCREEN_WIDTH-150, 0, 100, 44)];
           [_tooBarViewBtn addTarget:self action:@selector(switchKeyBoard) forControlEvents:UIControlEventTouchUpInside];
           [_tooBarViewBtn setTitle:@"切换键盘" forState:UIControlStateNormal];
           _tooBarViewBtn.backgroundColor = [UIColor purpleColor];
        }
       return _tooBarViewBtn;
     }
    
     -(UIView *)keyBoardView{
    
         if (!_keyBoardView) {
      
             _keyBoardView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CIO_SCREEN_WIDTH, 100)];
            _keyBoardView.backgroundColor = [UIColor brownColor];
         }
    
       return _keyBoardView;
     }
    
     @end
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    十年一品温如言1008阅读 1,619评论 0 3
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,092评论 5 13
  • 一、简介 <<UITextView(文本视图) : UITextView可以输入多行文字并且可以滚动显示浏览全文的...
    无邪8阅读 8,295评论 6 1
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    FF_911阅读 1,353评论 0 3
  • 转自:http://www.code4app.com/blog-866962-1317.html1、设置UILab...
    MMOTE阅读 1,585评论 1 1