这个demo是为解决IQKeyboardManager和Masonry同时使用时,导航栏上移和make.right失效的问题
(一)、引言:
在 IQKeyboardManager 和 Masonry 同时使用时,导航栏上移和 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;
}
但是虽然不往上跑了。尼玛又出现了其他问题:
像这样:

哎呀,我擦:
怎么我的控件布局都乱了。
【本屌也是在这个地方卡蛮久,最后自己摸索出了本文章的解决办法。】
在经过多次尝试之后你会发现。真正的问题所在是 IQKeyboardManager 和 Masonry 同时使用时,控件放在 scrollView上面。masonry 的 make.right 约束就会失效。
但是 make.width 等等其他约束还是正常的。
你可以不使用 make.right 约束,用 make.width和 make.left代替约束。但是我觉得还是用 make.right 和 make.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失效的问题的更多相关文章
- 解决echart在IE中使用时,在div中加入postion后图表不显示问题
<!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px;width:1 ...
- 解决Django和EasyUI搭配使用时出现的CSRF问题
在<head></head>中添加以下代码即可: <script type="text/javascript"> $.ajaxSetup({ d ...
- 第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法
边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple ...
- Swift - 修改导航栏“返回”按钮文字和图标 /手势冲突解决/响应范围
iOS11之前 修改导航栏“返回”按钮文字,图标 https://blog.csdn.net/u012701023/article/details/50264265 iOS11 完美解决导航栏按钮偏移 ...
- 聊天界面使用IQKeyboardManager导航栏及整个页面上移的解决方法
问题: 使用第三方库IQKeyboardManager时会使整个页面上移,导航栏页偏移出了显示范围.在聊天界面就会使得上面的消息看不到. 解决方法: 首先说明:在聊天界面使用IQKeyboardMan ...
- ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题
在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...
- IOS开发之Bug--iOS7View被导航栏遮挡问题的解决
在实际开发中,遇到在UITextView的frame等于当前控制器的View的frame的情况下,然后运行的时候,发现控制器的Frame的高度y值会从导航条的位置64变化到0. 导致UITextVie ...
- iOS 解决导航栏左右 BarButtonItem偏移位置的问题
iOS7 之后,我们直接在导航栏添加barbuttonItem时候,会发现有一定偏移量, 比如: self.navigationItem.leftBarButtonItem = UIBarButton ...
- iOS解决隐藏导航栏后,打开照片选择器后导航栏不显示的问题以及更换导航栏背景色
问题描述: 遇到一种情况,在一个控制器上(隐藏了导航栏),打开照片选择器 UIImagePickerController后,照片选择器头部一片空白,且上滑相册时,信息会有错乱效果. 原因分析: 通过查 ...
随机推荐
- CK editor 制作 ”小“plugin
ckeditor 是什么? http://ckeditor.com/ 这工具里有大量他人写好的功能(plugin),如果要求不高,会找到的.但是我就是没有找到... 需求: ·自己制作一个小功能,可以 ...
- Struts2学习第二天——动态方法调用
method属性 在前面的例子里,Action默认使用execute()方法来处理请求.但是,如果有多个不同的请求需要同一个Action进行不同处理,怎么办?在Struts.xml文件中,需要指定Ac ...
- 如何用一张图片代替 'input:file' 上传本地文件??
今天去面试,碰到了一道题,也许是因为紧张或者喝水喝多了,一时竟然没有转过弯来,回来之后一细想原来这么简单,哭笑不得,特此记录一下! 原题是这样的: 如何用一张图片代替 'input:file' 上传 ...
- 本地计算机上的XXX服务启动后停止,某些服务在未由其它服务或程序使用时将自动停止
创建WindowsService,以及安装和卸载网上的资料一搜一大堆,在这里就不再做演示,只说明下博主在工作中使用WindowsService服务出现的错误,以及最终的结局方案. 1.启动window ...
- Spring RESTful + Redis全注解实现恶意登录保护机制
好久没更博了... 最近看了个真正全注解实现的 SpringMVC 博客,感觉很不错,终于可以彻底丢弃 web.xml 了.其实这玩意也是老东西了,丢弃 web.xml,是基于 5.6年前发布的 Se ...
- Java系统属性与Preferences API的简单介绍
系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...
- 关于使用lazytag的线段树两种查询方式的比较研究
说到线段树,想来大家并不陌生——最基本的思路就是将其规划成块,然后只要每次修改时维护一下即可. 但是尤其是涉及到区间修改时,lazytag的使用往往能够对于程序的质量起到决定性作用(Ex:一般JSOI ...
- Js里面的数组去重方法
去掉数组里面重复的有很多种,我这里就说一种比较简单的吧. var arr=[23,33,44,33,44,66,44,55,44,4,44,33,23]; for(var i=0;i<arr.l ...
- 你的外接键盘的小键盘在Num Lock键亮着的,但是数字按了不能用,解决办法在这里
1.可能是Num Lock键卡住了导致的,你多按几次numlock键试试. 如果上面的不行,你就再试试下面的这个: 2.系统下开启了启用鼠标键导致的,解决的方法如下: (1).打开"控制面板 ...
- Zookepper(2015.08.16笔记)
2015.08.16zookepper Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务(如同小区里面的供水.电的系统) 它包含一个简单的原 ...