iOS开发inputView和inputAccessoryView_weixin_34392435的博客-程序员秘密

技术标签: 移动开发  

1、简介

  起初看到这两个属性是在UIResponder中,只是可读的:

@property (nullable, nonatomic, readonly, strong) __kindof UIView *inputView NS_AVAILABLE_IOS(3_2);
@property (nullable, nonatomic, readonly, strong) __kindof UIView *inputAccessoryView NS_AVAILABLE_IOS(3_2);

  后来在UITextField和UITextView中也有,是可读可写的:

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

  用一张输入法的图片简单说明一下这两个属性:

  inputAccessoryView:附件视图,就是上面汉子和拼音

  inputView:就是下面的按键输入法

  最上面的输入框:之前作法——监听键盘的通知,获取键盘高度处理输入框位置;

          现在——是否可以把输入框放入到附件视图inputAccessoryView?只是一种想法,后期我会自己试试 勿喷!

 

2、自定义inputAccessoryView和inputView

  2.1、直接赋值UITextField的这两个属性

    UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 0, 90)];
    UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(endEdi:)];
    UIBarButtonItem *right2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(endEdi:)];
    toolBar.items = [NSArray arrayWithObjects:right,right2,right,right,right,right,right, nil];
    self.inputTextField.inputAccessoryView = toolBar;
    UIView *inputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 320)];
    UIImageView *igView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 180)];
    igView.image = [UIImage imageNamed:@"pic2.png"];
    [inputView addSubview:igView];
    inputView.backgroundColor = [UIColor greenColor];
    self.inputTextField.inputView =inputView;

  • 设置坐标时只有高度才能起到约束,x、y、weight设置也不会有作用;
  • 整个弹出视图的高度是inputView.height+inputAccessoryView.height,而且附件视图会紧贴inputView视图上面;
  • inputView和inputAccessoryView的子视图需要有详细坐标约束;
  • UIToolbar继承UIView,常用于附件视图上,作点击事件处理;

  2.2、自定义控件的这两个属性

    往往会用这两个属性来自定义键盘,其实可以自定义许多底部的弹出框!

    由于UIResponder有这两个属性,所有大多数视图可以重写这个两个属性,以UILabel为例:

@interface MenuLabel()<UIPickerViewDelegate,UIPickerViewDataSource>
{
    UIToolbar *_inputAccessoryView;
    UIPickerView    *_inputView;
}
@end
@implementation MenuLabel

- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        [self setUI];
    }
    return self;
}
- (void)awakeFromNib{
    [super awakeFromNib];
    self.multipleTouchEnabled = YES;
    [self setUI];
}
- (void)setUI{
    self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes:)];
    [self addGestureRecognizer:tap];
}

- (void)tapGes:(UITapGestureRecognizer *)ges{
    [self becomeFirstResponder];
}
-(UIView *)inputAccessoryView{
    if(!_inputAccessoryView)
    {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 100)];
        view.backgroundColor = [UIColor grayColor];

        UIToolbar *toolBar = [[UIToolbar alloc]init];
        toolBar.frame = CGRectMake(0, 0, 100, 44);
        UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dodo)];
        toolBar.items = [NSArray arrayWithObject:right];
        
        [view addSubview:toolBar];
        return view;
    }
    return _inputAccessoryView;
}
-(UIPickerView *)inputView{
    if(!_inputView)
    {
        UIPickerView *  pickView = [[UIPickerView alloc]init];
        pickView.delegate =self;
        pickView.dataSource = self;
        pickView.showsSelectionIndicator = YES;
        return pickView;
    }
    return _inputView;
}
-(void)dodo{
    [self resignFirstResponder];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [NSString stringWithFormat:@"%ld",row];
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return 5;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    self.text =[NSString stringWithFormat:@"%ld",row];
}

- (BOOL)canBecomeFirstResponder{
    return YES;
}
@end

  • 要设置  self.userInteractionEnabled = YES;重写- (BOOL)canBecomeFirstResponder{     return YES; } 方法;
  • 这种方法附件的高度可以修改,但是底部并不会随inputView高度改变而变化,是固定的;
  • inputView不设置坐标,会自适应展示,由于系统inputView高度固定,也不知道不同版本会不会变化,所以就不设置自定义视图inputView的高度 过高会覆盖附件,过低会覆盖不全;
  • 附件的子视图需要详细坐标约束;

 

转载于:https://www.cnblogs.com/xianfeng-zhang/p/9518853.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34392435/article/details/93344296

智能推荐

阿里云容器服务飞天敏捷版详解_z荒野求生的博客-程序员秘密_飞天敏捷版

阿里云容器服务飞天敏捷版详解libinjingshan2017-04-2423953浏览量简介:阿里云容器服务提供了公共云、专有云以及飞天敏捷版三种部署形态,全方位地满足企业客户利用CaaS(Container as a Service)进行应用现代化上云的需求。飞天敏捷版包含了阿里在公有云上的最佳实践和Docker企业版的安全能力,打造企业一体化化的本地容器云平台方案。概述飞天敏捷版深度整合了Docker商业版套件和阿里的容器服务,成为国内唯一具有全商业版支持能力的容器云平台,可以部...

21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用_weixin_30595035的博客-程序员秘密

控制器里功能:通过分类,查分类下的所有文章 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj $category = Category::findOne(1); //查分类表里的数据 abj// $categ...

程序设计思维与实践 Week9 作业 A-咕咕东的目录管理器_DongErduo的博客-程序员秘密

题目链接:A-咕咕东的目录管理器题目描述:咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 —— 这工程量太大了,所以他定了一个小目标,从实现一个目录管理器开始。前些日子,东东的电脑终于因为过度收到宇宙射线的影响而宕机,无法写代码。他的好友TT正忙着在B站看猫片,另一位好友瑞神正忙着打守望先锋。现在只有你能帮助东东!初始时...

如何 简单确定系统 合理的线程数__自由之子_的博客-程序员秘密

和大牛聊天的时候得知,可以这么来 比如针对IO密集型的程序,一个请求时间是1秒的话,假如其中200ms是用在CPU上,800ms用在IO上,同时系统是8核的话,那么理论上系统的合理线程数是(1+4)*8=40个,另外考虑实际情况,系统的消耗等,应该是40*0.6或者0.7约等于24或者28个。大概如此了。。先行记录下来

Docker容器日志管理实践_胡玉洋 的博客-程序员秘密

这里写自定义目录标题一 、Docker 引擎日志二、容器日志1、常用查看日志命令——docker logs2 、Docker 日志 驱动2.1、Docker 日志驱动常用命令、配置更改2.2、日志驱动——local2.3、日志驱动——JSON(默认)2.4、日志驱动——syslog2.5、日志驱动——Journald三、 生产环境中该如何储存容器中的日志1、当是完全是标准输出的类型的容器2、当是完全是标准输出的类型的容器2.1、挂载目录 bind2.2、使用数据卷 volume2.3、计算容器 rootfs

5V过压保护电路原理解说_QX大黄蜂的博客-程序员秘密_5v过压保护电路

百度许久,发现这个保护电路是有,但相关的原理描述却很空白,或者描述的有点让人懵逼……因此写此文章记录一下使用心得。如图所示。当VIN电压大于稳压二极管电压时,SS8550两端存在正向压降,PNP管导通。导通的电压将PMOS管两端的GS电压相等,压降抵消,另其无法导通,VOUT输出停止。当VIN电压小于等于稳压二极管电压时,SS8550不导通,此时PMOS管的2脚电压为7V,1脚电压下拉接地,为0V,GS两端存在正向压降,导通,输出电压。要点1:稳压二极管在此电路中的作用? 作用就...

随便推点

keras如何保存和载入已经训练的模型_阿委困的不能行的博客-程序员秘密

1,保存模型:my_model = create_model_function( ...... ) my_model.compile( ...... )my_mo...

同一个浏览器登录不同账号_亚马逊账号安全问题,小白一直关心的防关联操作(真正解决)..._weixin_39959794的博客-程序员秘密

2019-11-21更新,最近已经有更成熟的技术出来了,大家可以用超级浏览器,软件名和链接我放在文末,这个超级浏览器就是一个保护伞的意思,你要登后台的时候,就用先登陆它,就会跟本地环境隔离。找了半天没有适合开头的图片,就继续用昨天那张吧因为这个也是经典问题,网络上很多只讲原理,不给答案所以,是时候表演真正的技术了账号的安全问题,主要就指关联问题,关联问题会导致账户销售权被移除,永久封号亚马逊规定,...

表格渲染和修改信息_孤巷的余温的博客-程序员秘密

查询信息的表格渲染表格渲染是在视图上进行编写代码, 在渲染表格是时我们需要定义一个变量layuiTable这个在我们创建方法的时候需要用到。function方法创建然后aui调用use的方法(‘写入你需要加载的模块’),接下来是给layuiTable赋值;这时候需要在定义一个变量tabAcademe,等一下我们需要这个来补充表格的信息,在用layuiTable调用render的方法执行渲染,接...

SpringMVC 处理静态资源 <mvc:default-servlet-handler/>_杜鲁门的博客-程序员秘密

SpringMVC 处理静态资源: 1. 为甚么会有这样的问题: 优雅的 REST 风格的资源URL 不希望带 .html 或 .do 等后缀 若将 DispatcherServlet 请求映射配置为 / , 则SpringMVC 将捕获WEB 容器的所有请求, 包括静态资源的请求, SpringMVC 会将他们当成一个普通请求