iOS 获取 UITabViewController 和 UINavigationController 的图标位置
这些图标是放在 UITabBar 和 UINavigationBar 里的。所以只要遍历它们的 subViews,找到类型是 UIButton 的就可以了。
所有想获取它们的相对位置很容易。
获取到相对位置之后,根据容器位置进行调整就可以了。
所以 UITabBar 里图标的位置:
CGPoint center = CGPointMake(centerInTab.x + tabBar.frame.origin.x, centerInTab.y + tabBar.frame.origin.y);
UINavigationBar 里图标的位置:
CGPoint center = CGPointMake(point.x + self.navigationController.navigationBar.frame.origin.x, point.y + self.navigationController.navigationBar.frame.origin.y);
注意:获取位置的这些函数的调用要在 viewDidAppear 之后,否则结果不准确。
获取相对位置的代码:
+ (CGPoint)centerForTabInTabBar:(UITabBar*)tabBar withIndex:(NSUInteger)index
{
NSMutableArray *tabBarItems = [NSMutableArray arrayWithCapacity:[tabBar.items count]];
for (UIView *view in tabBar.subviews) {
if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")] && [view respondsToSelector:@selector(frame)]) {
// check for the selector -frame to prevent crashes in the very unlikely case that in the future
// objects thar don't implement -frame can be subViews of an UIView
[tabBarItems addObject:view];
}
}
if ([tabBarItems count] == ) {
// no tabBarItems means either no UITabBarButtons were in the subView, or none responded to -frame
// return CGRectZero to indicate that we couldn't figure out the frame
return CGPointZero;
} // sort by origin.x of the frame because the items are not necessarily in the correct order
[tabBarItems sortUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) {
if (view1.frame.origin.x < view2.frame.origin.x) {
return NSOrderedAscending;
}
if (view1.frame.origin.x > view2.frame.origin.x) {
return NSOrderedDescending;
}
NSAssert(NO, @"%@ and %@ share the same origin.x. This should never happen and indicates a substantial change in the framework that renders this method useless.", view1, view2);
return NSOrderedSame;
}]; CGPoint center = CGPointZero;
if (index < [tabBarItems count]) {
// viewController is in a regular tab
UIView *tabView = tabBarItems[index];
center = tabView.center;
}
else {
// our target viewController is inside the "more" tab
UIView *tabView = [tabBarItems lastObject];
center = tabView.center;
}
return center;
}
+ (CGPoint)centerForItemInNavigationBar:(UINavigationBar *)navigationBar withIndex:(NSUInteger)index
{
NSLog(@"centerForItemInNavigationBar: withIndex:%d",index);
NSMutableArray *navigationBarItems = [NSMutableArray arrayWithCapacity:[navigationBar.items count]];
for (UIView *view in navigationBar.subviews) {
if ([view isKindOfClass:NSClassFromString(@"UIButton")] && [view respondsToSelector:@selector(frame)]) {
// check for the selector -frame to prevent crashes in the very unlikely case that in the future
// objects thar don't implement -frame can be subViews of an UIView
[navigationBarItems addObject:view];
}
}
if ([navigationBarItems count] == ) {
// no navigationBarItems means either no UIButton were in the subView, or none responded to -frame
// return CGRectZero to indicate that we couldn't figure out the frame
return CGPointZero;
} // sort by origin.x of the frame because the items are not necessarily in the correct order
[navigationBarItems sortUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) {
if (view1.frame.origin.x < view2.frame.origin.x) {
return NSOrderedAscending;
}
if (view1.frame.origin.x > view2.frame.origin.x) {
return NSOrderedDescending;
}
NSAssert(NO, @"%@ and %@ share the same origin.x. This should never happen and indicates a substantial change in the framework that renders this method useless.", view1, view2);
return NSOrderedSame;
}]; CGPoint point = CGPointZero; UIView *navigationView = navigationBarItems[index];
NSLog(@"center %f,%f", navigationView.center.x, navigationView.center.y);
return navigationView.center;
}
iOS 获取 UITabViewController 和 UINavigationController 的图标位置的更多相关文章
- iOS 获取文件的目录路径的几种方法 [转]
iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...
- iOS获取各种数据方法整理以及IDFA与IDFV使用环境
iOS获取APP版本号: NSString *AppVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBun ...
- iOS 获取当前经纬度
一般说来LBS功能一般分为两块:一块是地理定位,就是获取当前精度.纬度和地理位置的功能,这一部分功能主要用到CoreLocation.Frameworks.一部分就是显示地图信息.丰富地图内容等,这一 ...
- 解决mxGraph放大/缩小在非IE浏览器下overlay图标位置不变化的问题
首先要创建一个工具栏.并为工具栏中的放大.缩小button定义事件. <div id="toolbar" style="float:left;margin-top: ...
- iOS获取设备唯一标识的8种方法
8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...
- iOS获取设备型号、装置类型等信息
iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...
- Swift3.0 iOS获取当前时间 - 年月日时分秒星期
Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...
- IOS 获取最新设备型号方法
1.IOS 获取最新设备型号方法列表最新对照表:http://theiphonewiki.com/wiki/Models方法: #import "sys/utsname.h” struct ...
- ios 获取通讯录的所有信息
iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...
随机推荐
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- 表单的编辑添加和删除 .removeClass() .append() .preAll() .attr('b') document.createElement()
1.$(..).removeClass() 去除属性 2$(..).append 把内容加在后面 3.$(..).preAll() 前面所有的兄弟属性 4.$(..).attr('b') 属性 ...
- Android 获取图片转bitmap
1. Resources resources = mContext.getResources(); Drawable drawable = resources.getDrawable(R.drawab ...
- Thrift分析
[Thrift分析] Thrift定义一套IDL(Interface Definition Language)用于描述接口,通常后缀名为.thrift,通过thrift程序把.thrift文件导出成各 ...
- LUA Metatables
__index:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果. 博主注:__index有点像异常处理的意思 __newindex ...
- PHP GD库
<?php $file = '12.jpg'; //打开图片 $im = imagecreatefromjpeg($file); //设置水印字体颜色 $color = imagecoloral ...
- docker 容器创建参数错误记录
sudo docker ps -a -q sudo docker ps -a|cutawk '{print $1}' #删除前八条 sudo docker ps -a -q|head -n |xarg ...
- 模板模式c#(非常简单,但又非常简洁好玩)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 模板模式{ ...
- 解决root@localhost's password:localhost:permission denied,please try again
背景:在装完Hadoop及jdk之后,在执行start-all.sh的时候出现 root@localhost's password:localhost:permission denied,please ...
- PDF Document Creation, Viewing
[PDF Document Creation, Viewing, and Transforming] Quartz provides the data type CGPDFDocumentRef to ...