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

简介: (Swift&OC)UITextView的的使用技巧

一、关键词



  • 1.1.弹性方向
    alwaysBounceVertical垂直
    alwaysBounceHorizontal 水平
  • 1.2.滑动UITextView键盘下去
    keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
  • 1.3.输入框是否有内容
    hasText : 状态是true  和 false
  • 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


目录
相关文章
|
6月前
|
Swift Perl
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
OC和swift混合工程更新库时报:target has transitive dependencies that include statically linked binaries
98 0
|
API Swift iOS开发
45 Swift和OC的混编
Swift和OC的混编
123 0
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
81 0
|
Swift iOS开发
Swift - 与OC混编时如何创建桥接头文件
Swift - 与OC混编时如何创建桥接头文件
474 0
Swift - 与OC混编时如何创建桥接头文件
|
Swift iOS开发
oc与swift混编
1.swift中调用oc;2.oc中调用swift
289 0
oc与swift混编
|
Swift
Swift和OC控制器互相跳转
Swift和OC控制器互相跳转
322 0
|
Swift iOS开发
Swift与OC的混编
Swift调用OC文件 OC调用Swift文件
379 0
Swift与OC的混编
|
Swift iOS开发 容器
iOS 仿支付宝银行卡界面(支持Swift/OC)
在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
381 0
|
Swift
OC 和 swift 创建单例方法
OC 和 swift 创建单例方法
326 0
|
Swift
OC与swift的数据传输
该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知) 如果oc与swift之间的桥接有疑问请参考:OC与swift桥接互调
224 0
OC与swift的数据传输