iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题
前言:
本文由DevDiv社区@Vincent 原创,转载请注明出处!
http://www.devdiv.com/iOS_iPhone-ios_ios_uibarbuttonitem_-thread-206858-1-1.html
问题引入:
iOS7中导航栏按钮图片会有左右偏移,比如leftBarButtonItem可能会向右偏移10几个像素。
解决办法1:
自定义一个Button,代码如下:
|
1 |
@interface BarItemButton : UIButton |
|
2 |
|
3 |
@end |
实现如下方法:
|
01 |
- (UIEdgeInsets)alignmentRectInsets |
|
02 |
{ |
|
03 |
UIEdgeInsets insets; |
|
04 |
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) |
|
05 |
{ |
|
06 |
if([self isLeftButton]) |
|
07 |
{ |
|
08 |
insets = UIEdgeInsetsMake(0, 13, 0, 0); |
|
09 |
} |
|
10 |
else |
|
11 |
{ |
|
12 |
insets = UIEdgeInsetsMake(0, 0, 0, 13); |
|
13 |
} |
|
14 |
} |
|
15 |
else |
|
16 |
{ |
|
17 |
insets = UIEdgeInsetsZero; |
|
18 |
} |
|
19 |
|
20 |
return |
|
21 |
} |
|
22 |
|
23 |
- (BOOL)isLeftButton |
|
24 |
{ |
|
25 |
return |
|
26 |
} |
然后把这样一个Button作为left button,代码如下:
|
1 |
UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom]; |
|
2 |
btn.frame = CGRectMake(0, 0, 45, 40); |
|
3 |
[btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal]; |
|
4 |
[btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside]; |
|
5 |
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn]; |
这样可以解决问题,但并不完美,
如果我们我们从一个controller跳转到这样一个controller中:
[self.navigationController pushViewController:[[TestViewController alloc] init] animated:YES];
那么你会发现这个left button位置一开始并不正确,然后通过一个动画移动到我们希望的位置上。
大致效果是这样,controller启动时候有一个明显的动画,蓝色的view在移动,而导航栏上的button也在移动
启动完成后button才回到正确的位置,如下图
而这个动画显然不是我们需要的!
解决办法2:
去掉button的alignmentRectInsets方法实现,
将left button设置代码修改如下:
|
1 |
self.view.backgroundColor = [UIColor blueColor]; |
|
2 |
UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom]; |
|
3 |
btn.frame = CGRectMake(0, 0, 45, 40); |
|
4 |
[btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal]; |
|
5 |
btn.imageEdgeInsets = UIEdgeInsetsMake(0, -13, 0, 0); |
|
6 |
[btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside]; |
|
7 |
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn]; |
这里最重要是的我们设置了button的imageEdgeInsets,让它在构造的时候就在-13这个位置固定住,而不是layout的时候才移动到我们希望的位置上。
iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题的更多相关文章
- IOS7 新特性(针对同样讨厌更新后IOS7的开发者)
本文转载至 http://blog.csdn.net/hanbing861210/article/details/13614211 您还未登录!|登录|注册|帮助 首页 业界 移动 云计算 研发 论坛 ...
- iOS- 给App添加内购& 验证购买iOS7新特性
1.内购——应用内购买 我所说的内购——也可以说是应用内购买 大家都知道通过苹果应用程序商店有三种主要赚钱的方式: 1.直接收费(与国内大部分用户的消费习惯相悖,如果要收费,直接收高的,别收6块钱) ...
- IOS7 新特性
相关ios7新特性 帖子.挺全的.一定要看看哪 http://www.devdiv.com/iOS_iPhone-ios_ui_uikit_text_kit_-thread-203631-1-1.ht ...
- iOS11自定义导航条上移处理
image.png 在自定义导航条时,通常会继承系统的UINavigationBar,但如上图,在iOS11上,导航条改动了.自定义导航条代码 -(MBNavigationBar *)myNavBar ...
- jQuery Mobile 自定义导航条图标
1.jQuery Mobile 自定义导航条图标
- ios7新特性1-UI变化、UIKit动态行为支持与Text Kit新接口
iOS 7.0新特性1 iOS 7的UI经过了重新设计.另外,iOS7中引入了新的动画系统,便于创建2D和2.5D的游戏.多任务支持提升,点对点通讯以及其他重要的特征使iOS7相对于以往的SDK来说发 ...
- ios7新特性实践
一 iOS 7 新特性:视图控制器切换API 二 iOS 7系列译文:认识 TextKit 三 iOS 7系列译文:iOS7的多任务处理 四 iOS7 最佳实践:一个天气应用案例(上) 五 iOS7 ...
- ios7新特性3-Map Kit新特性
Map Kit 框架 (MapKit.framework) 包含了大量的改进以及为基于地图的程序提供了新特性.利用地图显示位置信息的应用现在可以使用Maps这个程序用到的3D地图,包括控制程序控制视线 ...
- React Native中自定义导航条
这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求. 尝试了一下当时React Native自带的 ...
随机推荐
- 20140412 iphone不完美越狱 无限黑屏解决
1.不完美越狱 工具:爱思助手.cydia 方法: 爱思助手刷6.1.3固件 一键越狱->关机越狱 高手工具->不完全越狱引导 进入手机后,打开cydia,下载insomnia防黑屏插件 ...
- spring关于bean的一些配置说明
<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean上面的注解.该标签主要向容器中掩式定的注了 AutowiredAnnotati ...
- Sublime Text Build 3207 x64 无法安装Package Control和插件
两个问题的解决方法: 以下都是问题的解决,在本人电脑成功解决,还有就是在虚拟机上也成功解决,可以自行尝试下 . 测试电脑为win7-64位 问题1 : 安装Package Control失败 解决问题 ...
- 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w
现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...
- python_django_models模块中的查询
查询集:表示从数据库获取的对象集合,查询集可以有多个过滤器,过滤器就是一个函数(方法),基于所给参数限制查询集结果 从sql角度来说,查询集和select等价,过滤器和where等价 查询集特点: 惰 ...
- 分布式唯一ID实现
ID生成的核心需求 全局唯一 趋势有序 为什么要全局唯一 避免ID冲突 著名的例子就是身份证号码,身份证号码确实是对人唯一的,然而一个人是可以办理多个身份证的,例如你身份证丢了,又重新补办了一张,号码 ...
- drop database出现1010
> drop database glc; ERROR (HY000): Error dropping database (can't rmdir './glc/', errno: 17) Fri ...
- 【JZOJ6275】小L的数列
description analysis 考虑矩阵乘法 设初始\(m×m\)矩阵上\(i\)行\(j\)列的数字表示该矩阵第\(j\)位上\(f[i]\)的指数 那么一开始表示\(f[1..k]\)的 ...
- JavaScript中的表单编程
表单编程 1获取表单相关信息 1.什么是表单元素 1.什么是表单元素 在H TML中表单就是指form标签,它的作用是将用户输入或选择的数据提交给指定的服务器 2.如何获取表单元素 <form ...
- truncate和delete的区别
TRUNCATE 命令用法 语法 TRUNCATE TABLE name 参数 name 是要截断的表的名称或要删除其全部行的表的名称. 注释 TRUNCATE TABLE 在功能上与不带 W ...