OC和Swift中的UITabBar和UINaviGationBar的适配 [UITabbar在IPad中的适配]
作者 sundays http://www.cnblogs.com/sundaysgarden/
OC中UITabbar的适配[iphoneX和Ipad适配]
自定可以UITabar
自定义UITabar头文件
#import <UIKit/UIKit.h>
@interface MCTabBar : UITabBar
@property (nonatomic, strong) UIButton *centerBtn; //中间按钮
@end
自定义UITabar m文件
#import "GBArcView.h"
//#import ""
#define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width
#define GBVIEWSCALL 1.2
#define CENTERBUTTONSCALL 1.1
@interface MCTabBar ()
@property (nonatomic,strong) GBArcView *gbview; //半圆View
@property(assign,nonatomic)int index;//UITabBar子view的索引
@end
@implementation MCTabBar
//重新初始化方法,从stroyboard 中加载,会调用
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
self.backgroundColor=[UIColor whiteColor];
self.clipsToBounds=NO;//不裁剪子控件
self.selectedItem=0;//初始化索引
//设置tabBaritem 的文字颜色
// [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:RGB_COLOR(74, 74, 74), UITextAttributeTextColor, nil] forState:UIControlStateNormal];
//
// [[UITabBarItem appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:RGB_COLOR(0, 147, 197),UITextAttributeTextColor, nil]forState:UIControlStateSelected];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]){
[self initView];
}
return self;
}
- (void)initView{
[self addSubview:_centerBtn];
[self insertSubview:_gbview belowSubview:_centerBtn];
}
//处理超出区域点击无效的问题
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
if (self.hidden){
return [super hitTest:point withEvent:event];
}else {
//转换坐标
CGPoint tempPoint = [self.centerBtn convertPoint:point fromView:self];
//判断点击的点是否在按钮区域内
if (CGRectContainsPoint(self.centerBtn.bounds, tempPoint)){
_centerBtn.selected = YES;
//返回按钮
return _centerBtn;
}else {
_centerBtn.selected = NO;
// __weak __typeof(&*self)weakSelf =self;
return [super hitTest:point withEvent:event];
}
}
}
//绘制横线
- (void)drawRect:(CGRect)rect {
//中间的按钮宽度是UItabBar的高度,其他按钮的宽度就是,(self.width-self.height)/4.0
CGFloat buttonW = (self.width-self.height)/4.0;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:0.8].CGColor);
CGContextSetLineWidth(context, SINGLE_LINE_WIDTH + 2.0f);
// CGContextSetLineWidth(context, 5);
CGContextBeginPath(context);
CGFloat lineMargin =0;
//1PX线,像素偏移
CGFloat pixelAdjustOffset = 0;
if (((int)(1 * [UIScreen mainScreen].scale) + 1) % 2 == 0) {
pixelAdjustOffset = SINGLE_LINE_ADJUST_OFFSET;
}
CGFloat yPos = lineMargin - pixelAdjustOffset;
//第一段线
CGContextMoveToPoint(context, 0, yPos);
CGContextAddLineToPoint(context, buttonW*2+SINGLE_LINE_WIDTH*2, yPos);
CGContextStrokePath(context);
//第二段线
CGContextMoveToPoint(context, buttonW*2+self.frame.size.height-SINGLE_LINE_WIDTH*2, yPos);
CGContextAddLineToPoint(context, self.bounds.size.width, yPos);
CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:0.8].CGColor);
CGContextStrokePath(context);
}
//自定义按钮的懒加载
-(UIButton *)centerBtn{
if(!_centerBtn){
_centerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
// 设定button大小为适应图片
UIImage *normalImage = [UIImage imageNamed:@"3_gray"];
_centerBtn.frame = CGRectMake(0, 0, normalImage.size.width, normalImage.size.height);
[_centerBtn setImage:normalImage forState:UIControlStateNormal];
UIImage *selectImage = [UIImage imageNamed:@"3_hover"];
[_centerBtn setImage:selectImage forState:UIControlStateSelected];
//去除选择时高亮
_centerBtn.adjustsImageWhenHighlighted = NO;
//根据图片调整button的位置(图片中心在tabbar的中间最上部,这个时候由于按钮是有一部分超出tabbar的,所以点击无效,要进行处理)
_centerBtn.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width - normalImage.size.width)/2.0, - normalImage.size.height/2.0 + 8, normalImage.size.width, normalImage.size.height);
_centerBtn.transform = CGAffineTransformMakeScale(CENTERBUTTONSCALL, CENTERBUTTONSCALL);
}
return _centerBtn;
}
////自定义半圆View的懒加载
-(UIView *)gbview{
if(!_gbview){
CGFloat buttonW = self.centerBtn.width;
GBArcView *gbview = [[GBArcView alloc]initWithFrame:CGRectMake(0,0,buttonW *GBVIEWSCALL,buttonW*GBVIEWSCALL)];
gbview.backgroundColor=[UIColor whiteColor];
gbview.layer.masksToBounds=YES;
gbview.layer.cornerRadius=buttonW*GBVIEWSCALL*0.5f;
gbview.center = _centerBtn.center;
gbview.transform = CGAffineTransformMakeScale(GBVIEWSCALL, GBVIEWSCALL);
_gbview = gbview;
}
return _gbview;
}
-(void)setHidden:(BOOL)hidden{
[super setHidden:hidden];
//手动设置UITabBar 隐藏时,我们要将自定义的按钮和背景隐藏
[self.gbview setHidden:hidden];
[self.centerBtn setHidden:hidden];
}
//******核心部分******
//当配置 hidesBottomBarWhenPushed 的viewController ,隐藏UITabBar时,会改变其frame,就是将UITabBar 的Y值设为屏幕最大的y值,就不可见。我们重写这个方法,判断当frame的y小于屏幕的高度 ,那么UITabBar就是被隐藏了,这时候我们将自定的控件隐藏。相反的,我们就显示我们的自定义控件。
-(void)setFrame:(CGRect)frame{
// if (self.superview &&CGRectGetMaxY(self.superview.bounds) !=CGRectGetMaxY(frame)) {
// frame.origin.y =CGRectGetHeight(self.superview.bounds) -CGRectGetHeight(frame);
// }
[super setFrame:frame];
if(frame.origin.y>=[UIScreen mainScreen].bounds.size.height){
[self.gbview setHidden:YES];
[self.centerBtn setHidden:YES];
}else{
[self.gbview setHidden:NO];
[self.centerBtn setHidden:NO];
}
}
//适配ipad
//重写traitCollection方法,使UITabbar保持图为垂直排列,防止在ipad11出现水平排列
- (UITraitCollection *)traitCollection {
if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
return [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact];
}
return [super traitCollection];
}
@end
在UITabBarController.m文件中设置适配iPhoneX
//利用KVC 将自己的tabbar赋给系统tabBar
ViewDidLoad方法添加如下代码
//利用kvc将自定义的文件copy给系统
[self setValue:_mcTabbar forKeyPath:@"tabBar"];
给系统的[自定义]的UITabBar添加一个View设置UITabBar的高度
[self setupTabBar];
- (void)setupTabBar{
//删除现有的tabBar
CGRect rect = self.tabBar.frame;
[self.tabBar removeFromSuperview]; //移除TabBarController自带的下部的条
// [self.tabBarController.tabBar removeFromSuperview];
rect.size.height = 49;
rect.origin.y = [UIScreen mainScreen].bounds.size.height - 49;
UIView *myView = [[UIView alloc] init];
myView.frame = rect;
myView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:myView];
}
自定义UItabBar中引用的文件
GBArcView.h
#define SINGLE_LINE_WIDTH (1 / [UIScreen mainScreen].scale)
#define SINGLE_LINE_ADJUST_OFFSET ((1 / [UIScreen mainScreen].scale) / 2)
@interface GBArcView : UIView
@end
GBArch.m
#import <QuartzCore/QuartzCore.h>
#import "Math.h"
#import <CoreGraphics/CoreGraphics.h>
@implementation GBArcView
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor *color1 = [UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:0.8];
CGContextSetStrokeColorWithColor(context, color1.CGColor);
CGContextSetLineWidth(context, SINGLE_LINE_WIDTH + 0.5f);
CGContextBeginPath(context);
// CGFloat lineMargin =self.frame.size.width*0.5f;
//1px线,偏移像素点
CGFloat pixelAdjustOffset = 0;
if (((int)(1 * [UIScreen mainScreen].scale) + 1) % 2 == 0) {
pixelAdjustOffset = SINGLE_LINE_ADJUST_OFFSET;
}
CGFloat yPos = self.frame.size.width*0.5f - pixelAdjustOffset;
CGFloat xPos = self.frame.size.width*0.5f - pixelAdjustOffset - 4.0f;
CGContextAddArc(context, xPos, yPos, self.frame.size.width*0.5 - 1.f , M_PI*1.08, M_PI*1.95, 0);
CGContextDrawPath(context, kCGPathStroke);
// CGContextStrokePath(context);
}
@end
适配IPhoneX
定义UITabar的分类实现适配
OC和Swift中的UITabBar和UINaviGationBar的适配 [UITabbar在IPad中的适配]的更多相关文章
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理 ...
- oc工程中oc、swift混编代码打包成静态framework踩坑笔记
参考资料: https://www.jianshu.com/p/734341f7c242 https://www.jianshu.com/p/55038871e7de 两天时间探索,期间不知道遇到 ...
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- IOS --- OC与Swift混编
swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...
- iOS OC和Swift进行互相调用
有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用. swift调用oc的方法: 1.桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) 2 ...
- 关于C、OC、C++、OC++、Swift的一些常识
关于C.OC.C++.OC++.Swift的一些常识 OC是C语言的一个超集,是一门面向对象的语言,因为苹果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 C ...
- iOS - OC 与 Swift 互相操作
前言 在 Swift 语言中,我们可以使用 Objective-C.C 语言编写代码,我们可以导入任意用 Objective-C 写的 Cocoa 平台框架.Objective-C 框架或 C 类库. ...
- Swift语言学习之OC和Swift混编
本文转自http://www.helloswift.com.cn/swiftbase/2015/0112/3469.html iOS OC和Swift混编 1.创建一个swift或者oc的工程:我这里 ...
- 【转】IOS --- OC与Swift混编
群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...
随机推荐
- listview的工作原理
/** * Unsorted views that can be used by the adapter as a convert view. */ private ArrayList<View ...
- 采用JSP+JavaBean的方式进行简单的实现用户的网页登陆实例
我们都知道J2EE中的Model1开发模式,那么下面就让我们一起简单的进行一下回顾,其主要是体现了一个初步的分层的思想: jsp层,业务逻辑层,以及我们的数据库层,主要的作用分别为,jsp层负责与用户 ...
- CentOS安装并设置MariaDB
作者: 铁锚 日期: 2013年12月27日 部分参考: Centos 使用YUM安装MariaDB 说明: 首先必须能链接外网. 如果不能直接访问,那也可以设置代理,请参考: 在内网机器上设置yum ...
- spring 注解模式 详解
Spring基于注解实现Bean定义支持如下三种注解: Spring自带的@Component注解及扩展@Repository.@Service.@Controller,如图12-1所示: JSR-2 ...
- CUDA学习,查看device性能参数
#include "../common/book.h" #include< stdio.h> #include "cuda_runtime.h" # ...
- Understanding Android Security(安卓安全的理解)
论文作者: Enck, William Ongtang, MacHigar McDaniel, Patrick 下一代的开放操作系统不会在个人主机和大型主机上出现,而是在只能手机上.新环境的开放性将会 ...
- 【Java编程】Java基本数据类型
在较前面的一篇博文<C/C++基本数据类型>中,我主要介绍了c/c++的基本数据类型.我们知道C语言没有具体规定各类数据类型所占内存的字节数,只要求long型数据长度不小于int型,sho ...
- C/C++中关键字static的用法及作用
本文将主要从static在C和C++共有的作用及C++特有的作用两个方面进行解析. 在C和C++中共有的作用 隐藏(对变量.函数均可) 当同时编译多个文件时,所有未加static前缀的全局变量或全局函 ...
- sxoi爆炸祭
好吧,纯粹是去玩玩的,我这么一个弱省的蒟蒻,进队纯粹是开玩笑.... Day0 去五中试机,感觉电脑手感不错,打了半个线段树的板子才发现试机要在自己的电脑上试,然后我无奈的搬东西(从26号搬到2号), ...
- .Net C# 串口 Serialort safe handle has been closed 问题的解决
最近在一个平台上使用SerialPort类开发程序时,发现程序在使用SerialPort类时会异常退出,而且诡异的是,就算把所有操作串口的代码都放在try{}catch{}块中也无法捕获这个异常.最终 ...