原文链接在我的个人博客主页

(一)、引言:

IQKeyboardManagerMasonry 同时使用时,导航栏上移和 make.right失效等问题多多。

其实我们完美的效果应该是这样的:(NO Pictures say *8 !O(∩_∩)O~)

(二)、问题介绍:

我们使用 IQKeyboardManager 可以很好的处理键盘弹起输入框上移事件。但是当你的 backView 【底视图】不是 tableView 或者scrollView 时。你的导航栏会随着一起往上跑了。

就像这样:

如果是上图那种效果。你的产品经理会放过你这个逗比吗?

不!!!,绝不会。一定会说:“重做。导航栏不能往上跑。”

好吧。不往上跑。于是你在网上会找到 如下方法解决了这个问题:

 -(void)loadView {

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[scrollView setBackgroundColor:[UIColor grayColor]];
self.view = scrollView;
}

但是虽然不往上跑了。尼玛又出现了其他问题:

像这样:

哎呀,我擦:

怎么我的控件布局都乱了。

【本屌也是在这个地方卡蛮久,最后自己摸索出了本文章的解决办法。】

在经过多次尝试之后你会发现。真正的问题所在是 IQKeyboardManagerMasonry 同时使用时,控件放在 scrollView上面。masonrymake.right 约束就会失效。

但是 make.width 等等其他约束还是正常的。

你可以不使用 make.right 约束,用 make.widthmake.left代替约束。但是我觉得还是用 make.rightmake.left 约束组合要好些。不要老是写个 make.width的固定宽度。

(三)、需求目的:

我们想要的效果很简单。就如文章开篇的图一那样。。控件布局正常,键盘弹起时相应的输入框要上抬。但是啊,这个导航栏是坚决不能也上抬的。同时支持 make.right 约束。

(四)、解决方法:

  • 1.重写 loadView 方法 。把 self.view 替换成 scrollView

  • 2.背景容器视图(back)必须设置。而且对 back 约束时 要附带 make.width.mas_equalTo(self.view);【不写导致 textField 布局的 make.right 失效】

  • 3.子控件要直接放在self.view 上。不能放在背景容器视图(back)上面。【放在 back上时会无法点击,无法成为第一响应】

(方法中有点脑残的地方就是设置了 backView 底视图但是没有用它。还没想到好的优化方法,先就实现需求而言想出的这个搓比方法。)

【附上本demo的垃圾代码如下:】

//
// ViewController.m
// IQKeyboardManagerAndMasonryConflictDemo
//
// Created by Mingo on 17/4/6.
// Copyright © 2017年 Mingo. All rights reserved.
// #import "ViewController.h"
#import <Masonry/Masonry.h> @interface ViewController () @end @implementation ViewController #pragma mark - step 01
-(void)loadView { //不将 self.view 替换成 scrollView 会在点击底部输入框时 导航栏也一起往上跑。 UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[scrollView setBackgroundColor:[UIColor grayColor]];
self.view = scrollView;
} /**
1.重写 loadView 方法 。把 self.view 替换成 scrollView。 2.背景容器视图(back)必须设置。而且对 back 约束时 要附带 make.width.mas_equalTo(self.view);
【不写导致 textField 布局的 make.right 失效】 3.子控件要直接放在self.view 上。不能放在背景容器视图(back)上面。
【放在 back上时会无法点击,无法成为第一响应】 */ - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"我是导航栏"; #pragma mark - step 02
UIView *back = [[UIView alloc] init];
[self.view addSubview:back];
[back mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view);
make.width.mas_equalTo(self.view);
//此处必填 - 【关键点】 。不写导致 textField 布局的 make.right 失效。
//(但是布局textField 时使用 make.width不受这句话限制。)
}]; for (int i = 0 ; i < 30 ; i++) { UITextField *textField = [[UITextField alloc] init];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.placeholder = [NSString stringWithFormat:@"%d请输入文字",i]; #pragma mark - step 03
[self.view addSubview:textField];
// [back addSubview:textField];
// textField 放在 back上时会无法点击,无法成为第一响应。 [textField mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.with.offset(20);
make.right.with.offset(-20);
make.height.mas_equalTo(30);
make.top.mas_equalTo(i *40+5);
}];
}
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} @end

完整的 demo 已经上传 github 中:
https://github.com/yfming93/IQKeyboarManagerAndMasonryConflictDemo

这个demo是为解决IQKeyboardManager和Masonry同时使用时,导航栏上移和make.right失效的问题的更多相关文章

  1. 解决echart在IE中使用时,在div中加入postion后图表不显示问题

    <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px;width:1 ...

  2. 解决Django和EasyUI搭配使用时出现的CSRF问题

    在<head></head>中添加以下代码即可: <script type="text/javascript"> $.ajaxSetup({ d ...

  3. 第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法

    边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple ...

  4. Swift - 修改导航栏“返回”按钮文字和图标 /手势冲突解决/响应范围

    iOS11之前 修改导航栏“返回”按钮文字,图标 https://blog.csdn.net/u012701023/article/details/50264265 iOS11 完美解决导航栏按钮偏移 ...

  5. 聊天界面使用IQKeyboardManager导航栏及整个页面上移的解决方法

    问题: 使用第三方库IQKeyboardManager时会使整个页面上移,导航栏页偏移出了显示范围.在聊天界面就会使得上面的消息看不到. 解决方法: 首先说明:在聊天界面使用IQKeyboardMan ...

  6. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

    在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...

  7. IOS开发之Bug--iOS7View被导航栏遮挡问题的解决

    在实际开发中,遇到在UITextView的frame等于当前控制器的View的frame的情况下,然后运行的时候,发现控制器的Frame的高度y值会从导航条的位置64变化到0. 导致UITextVie ...

  8. iOS 解决导航栏左右 BarButtonItem偏移位置的问题

    iOS7 之后,我们直接在导航栏添加barbuttonItem时候,会发现有一定偏移量, 比如: self.navigationItem.leftBarButtonItem = UIBarButton ...

  9. iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色

    问题描述: 遇到一种情况,在一个控制器上(隐藏了导航栏),打开照片选择器 UIImagePickerController后,照片选择器头部一片空白,且上滑相册时,信息会有错乱效果. 原因分析: 通过查 ...

随机推荐

  1. FaceNet---深度学习与人脸识别的二次结合

    今天我给大家带来一篇来自谷歌的文章,众所周知,谷歌是全世界最有情怀,最讲究技术的公司,比我们天朝的莆田广告商良心多了.还有就是前段时间的最强大脑,莆田广告商的那个小机器,也就忽悠忽悠行外人了,懂的人深 ...

  2. iOS 注册密码加密 添加了时间戳 遇到的问题...

    今天项目 遇到一个事故,我本想用 一个形容这个事故的adj  算了 既然 叫事故 已经能表达我们处于的一种状态, 是这样的: 有小部分用户反应 app无法注册 总提示密码错误的情况 实际 该步骤 已经 ...

  3. linux 之 tcpdump

    tcpdump详细命令 -i 参数指定监听网口 -c 参数指定监听的数据包数量 -s 参数指定监听数据包大小 -w 参数指定监听数据包写入文件 如果要监听某几台主机数据包 例如10.10.10.10. ...

  4. SVN 中trunk、branches、tags的详解

    1.trunk是主分支,是日常开发进行的地方.2.branches是分支.一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中.又比如为不同用户客制化的版本 ...

  5. js三大家族offset,scroll,cliennt的区别

    offset偏移(返回的是number类型) offsetLeft:返回盒子距离左边的距离 offsetTop:返回盒子距离顶部的距离 offsetHeight:返回盒子的高度,包括border,pa ...

  6. forEach、map、filter、some、every五个数组方法

    forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter() 方法使指定函数测试数组的每一个元素,并 ...

  7. 大数据系列之Flume--几种不同的Sources

    1.flume概念 flume是分布式的,可靠的,高可用的,用于对不同来源的大量的日志数据进行有效收集.聚集和移动,并以集中式的数据存储的系统. flume目前是apache的一个顶级项目. flum ...

  8. C# 使用 USB转串 接收数据 问题

    C# 使用 USB转串 接收数据的 问题 硬件设备是MicroUSB接口,通过USB转串驱动接入PC机.自己用winForm写了一个读取串口数据的小程序,总是接收不到数据. 用传sscom32串口工具 ...

  9. mysql新建数据库时的collation选择(转)

    转自别处的文章.末尾附原文链接 mysql的collation大致的意思就是字符序.首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则.collation做 ...

  10. [原创]HBase学习笔记(1)-安装和部署

    HBase安装和部署 使用的HBase版本是1.2.4 1.安装步骤(默认hdfs已安装好) # 下载并解压安装包 cd tools/ tar -zxf hbase-1.2.4-bin.tar.gz ...