iPhone X UITabBarController UITabBar 适配解读
来源:互联网 发布:new event js 位置 编辑:程序博客网 时间:2024/05/22 01:39
iPhone X 简直就是神一般的存在
iPhone X的分辨率是:1125 X 2436
但是iPhone X的 UIScreen bounds 却是:CGRectMake(0, 0, 375, 812)
#define isIphoneX CGRectEqualToRect([UIScreen mainScreen].bounds, CGRectMake(0, 0, 375, 812))
其次是tabbar高度,在iPhone 4,5,6,7,8(plus略过)上tabbar的高度是49 ,在iPhone X 上也是49 ,不是83吗 ?? ,我们写一个包含tabbar的项目在iPhone X 上运行看下 。。
上面我们提到 iPhone X的tabbar高度是49,但是底部无效点击区域的高度是33 ,所以有点地方也说iPhone X的tabbar高度是 82 ,为什么说下面高度33 的区域是无效点击区域了 ?? 来张gif
那么这个就比较尴尬了 。。。。 虽然在iPhone X上 微信和 app store都是这个样子 ,底部有无效的区域;但是总有个别另类把无效区域变成有效区域 先来张图。。。
某宝的APP , 我们不能说某宝的APP始作俑者,但是对于展示类的APP来说屏幕区域展示多多益善,展示类APP巴不得全屏展示 。。。 或许这种展示类的APP的产品经理看到iPhone X 的淘宝 ,然后对程序猿说:跟淘宝一样,不用我说程序猿肯定脸一黑 我朝APP市场不就是 一直在模仿从未被超越吗 ?? 如何能做到跟淘宝一样了 ?? 首先我们需要把系统的tabbar搞出来,这是第一步
1.构造系统的tabbar
#import "ViewController.h"#import "H1ViewController.h"#import "H2ViewController.h"#import "H3ViewController.h"#import "H4ViewController.h"#define isIphoneX CGRectEqualToRect([UIScreen mainScreen].bounds, CGRectMake(0, 0, 375, 812))@interface ViewController (){ UITabBarController *viewController;}@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; H1ViewController *h1 = [[H1ViewController alloc] init]; h1.tabBarItem.image = [UIImage imageNamed:@"1"]; h1.tabBarItem.title = @"首页"; UINavigationController *h11 = [[UINavigationController alloc] initWithRootViewController:h1]; H2ViewController *h2 = [[H2ViewController alloc] init]; h2.tabBarItem.image = [UIImage imageNamed:@"2"]; h2.tabBarItem.title = @"联系人"; UINavigationController *h22 = [[UINavigationController alloc] initWithRootViewController:h2]; H3ViewController *h3 = [[H3ViewController alloc] init]; h3.tabBarItem.image = [UIImage imageNamed:@"3"]; h3.tabBarItem.title = @"消息"; UINavigationController *h33 = [[UINavigationController alloc] initWithRootViewController:h3]; H4ViewController *h4 = [[H4ViewController alloc] init]; h4.tabBarItem.image = [UIImage imageNamed:@"4"]; h4.tabBarItem.title = @"设置"; UINavigationController *h44 = [[UINavigationController alloc] initWithRootViewController:h4]; [[UITabBar appearance] setTintColor:[UIColor colorWithRed:255 / 255.0 green:50 / 255.0 blue:50 / 255.0 alpha:1.0]]; UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 49)]; backView.backgroundColor = [UIColor cyanColor]; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage new]]; imageView.contentMode = UIViewContentModeScaleToFill; imageView.frame = backView.frame; [backView addSubview:imageView]; viewController = [[UITabBarController alloc] init]; viewController.viewControllers = @[h11, h22, h33, h44]; viewController.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); [viewController.tabBar setClipsToBounds:YES]; [viewController.tabBar insertSubview:backView atIndex:0]; viewController.tabBar.opaque = YES; [self.view addSubview:viewController.view]; NSLog(@"%@",NSStringFromCGRect(viewController.tabBar.frame));}
运行代码将得到 以下界面
问题来了 。。。。。 tabbar如何让它下去了 ???也就是我们需要改变tabbar的高度或坐标 ,相信很多人都改过。。。发现无效,tabbar还是那个tabbar了。。 如何改了 ??
我们需要自定义UITabBarController
.h文件
#import <UIKit/UIKit.h>@interface HBTabBarController : UITabBarController@end
.m文件
#import "HBTabBarController.h"#define isIphoneX CGRectEqualToRect([UIScreen mainScreen].bounds, CGRectMake(0, 0, 375, 812))@interface HBTabBarController ()@end@implementation HBTabBarController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.}-(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if (isIphoneX) { CGRect frame = self.tabBar.frame; frame.size.height = 49; frame.origin.y = self.view.frame.size.height - frame.size.height; self.tabBar.frame = frame; for (UITabBarItem *item in self.tabBar.items) { item.imageInsets = UIEdgeInsetsMake(15,0, -15, 0); [item setTitlePositionAdjustment:UIOffsetMake(0, 32)]; } }}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}
同样我们需要修改下 ViewController.m ,直接上代码
#import "ViewController.h"#import "H1ViewController.h"#import "H2ViewController.h"#import "H3ViewController.h"#import "H4ViewController.h"#import "HBTabBarController.h"//#define isIphoneX CGRectEqualToRect([UIScreen mainScreen].bounds, CGRectMake(0, 0, 375, 812))@interface ViewController (){ HBTabBarController *viewController;}@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; H1ViewController *h1 = [[H1ViewController alloc] init]; h1.tabBarItem.image = [UIImage imageNamed:@"1"]; h1.tabBarItem.title = @"首页"; UINavigationController *h11 = [[UINavigationController alloc] initWithRootViewController:h1]; H2ViewController *h2 = [[H2ViewController alloc] init]; h2.tabBarItem.image = [UIImage imageNamed:@"2"]; h2.tabBarItem.title = @"联系人"; UINavigationController *h22 = [[UINavigationController alloc] initWithRootViewController:h2]; H3ViewController *h3 = [[H3ViewController alloc] init]; h3.tabBarItem.image = [UIImage imageNamed:@"3"]; h3.tabBarItem.title = @"消息"; UINavigationController *h33 = [[UINavigationController alloc] initWithRootViewController:h3]; H4ViewController *h4 = [[H4ViewController alloc] init]; h4.tabBarItem.image = [UIImage imageNamed:@"4"]; h4.tabBarItem.title = @"设置"; UINavigationController *h44 = [[UINavigationController alloc] initWithRootViewController:h4]; [[UITabBar appearance] setTintColor:[UIColor colorWithRed:255 / 255.0 green:50 / 255.0 blue:50 / 255.0 alpha:1.0]]; UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 49)]; backView.backgroundColor = [UIColor cyanColor]; UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage new]]; imageView.contentMode = UIViewContentModeScaleToFill; imageView.frame = backView.frame; [backView addSubview:imageView]; viewController = [[HBTabBarController alloc] init]; viewController.viewControllers = @[h11, h22, h33, h44]; viewController.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); [viewController.tabBar setClipsToBounds:YES]; [viewController.tabBar insertSubview:backView atIndex:0]; viewController.tabBar.opaque = YES; [self.view addSubview:viewController.view]; NSLog(@"%@",NSStringFromCGRect(viewController.tabBar.frame));}
我们把UITabBarController替换成我们自定义的HBTabBarController ,我们运行看下效果
看起来是成功了。 。。。 但是 。。。 我们点击看一看 。。
很麻烦,单击Tabbar下面的文本根本无法触发Tabbar切换 。。。。。 貌似我们点击的都是无效区域。。。。这个比较麻烦 。。。。。 那么我们怎么解决了 ? 我们知道,这种情况(Tabbar下移动,点击无法切换)只会在iPhone X上出现 ,那么在iPhone X 我们所谓的无效区域 touches 是否执行了 ?? 我们来看下
无效区域 touches 执行了 ! 那这个就好办了 。。。。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ if (!isIphoneX) { return; } NSSet *allTouches = [event allTouches]; //返回与当前接收者有关的所有的触摸对象 UITouch *touch = [allTouches anyObject]; //视图中的所有对象 UIView *v = [touch view]; if (!CGRectEqualToRect(v.frame, CGRectMake(0, 0, 375, 49))) { return; } CGPoint point = [touch locationInView:v]; //返回触摸点在视图中的当前坐标 int x = point.x; int y = point.y; if (y>49||y<0) { return; } CGFloat w = 375.0/4; if (x>=0&&x<=w) { viewController.selectedIndex = 0; }else if (x>w&&x<=w*2){ viewController.selectedIndex = 1; }else if (x>w*2&&x<=w*3){ viewController.selectedIndex = 2; }else if (x>w*3&&x<=w*4){ viewController.selectedIndex = 3; } NSLog(@"touch (x, y) is (%d, %d) %@", x, y,[touch view] );}
貌似大功告成 ,但是 。。。 有个地方有点蛋疼 。。。。
蛋疼。。 其实系统提供了去掉的方法。。。。。
-(BOOL)prefersHomeIndicatorAutoHidden{ return YES;}
那么iPhone X上面的 Tabbar 基本 介绍完了 。。。 代码下载地址
http://download.csdn.net/download/chmod_r_755/10119241
- iPhone X UITabBarController UITabBar 适配解读
- UITabBarController、UITabBar
- UITabBarController with hidden UITabBar
- UITabBarController中自定义UITabBar
- UITabbarController 的UITabbar高度
- UITabBarController中自定义UITabBar
- UITabBarController笔记(UITabBar/UITabBarButton)
- 自定义实现UITabBarController和UITabBar
- iOS UITabBarController 的 UITabBar 自定义
- 自定义UITabBarController、UITabBar和UIButton
- 自定义UITabBarController以及UITabBar的分析
- iOS 自定义UITabBarController以及UITabBar的分析
- UITabBarController中自定义UITabBar方法2
- iOS中 UITabBarController中自定义UITabBar
- 关于UITabBarController的UITabBar隐藏问题
- 修改UINavigationController、UITabBarController、UITabBar、UIToolBar颜色
- UItabbarController自定义 常用架构 UITabBar UITabBaritem
- UITabBarController(二)自定义UITabBar方式一
- PAT Huffman Codes 哈弗曼树,C语言实现
- Android | AppCompatActivity
- JavaScript声明一个对象的三种方式
- IIS和Tomcat共用80端口后撤回,用Tomcat使用80端口
- 《android在活动中使用menu》有感
- iPhone X UITabBarController UITabBar 适配解读
- Oracle学习
- vim 命令全
- springMVC modelAndView初级应用
- 基于51单片机的pwm和串口通信
- linux简介及常用命令2
- qt数据库多线程问题的解决(QSqlDatabase 同一个连接只能在创建它的线程中使用)
- 我与诗经的故事(一)
- 轮播图片的实现