背景介绍 :在普通的iOS开发组中,通常测试机都不止一台,可是咱们在开发的时候,不可能每台测试机时刻保持最新的代码,这就出现了一个问题,当测试测出问题的时候,(或者产品忽然拿去点点看的时候出了问题)若是不知道当前的版本,可能不肯定是何时出的问题。git
解决方案:若是当前环境是测试服的时候,展现一个全局浮动标签,这样不只看到此标志就告诉测试(包括咱们本身)当前的环境,当出现问题的时候,经过标签,能够快速定位当前问题发生的版本号等等
思路:github
知识1:按钮显示2行文字面试
//UIbutton的换行显示 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; //而后如同title的内容用包含“\n”就会换行 title = @“123\n666”
知识2:Version 与 Build号的获取api
NSString *versionStr = [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleShortVersionString"]; NSString *buildStr = [[[NSBundle mainBundle]infoDictionary]valueForKey:@"CFBundleVersion"];
知识3:控件的移动 - 本质上:坐标 ++数据结构
//拖动改变控件的水平方向x值 - (CGRect)changeXWithFrame:(CGRect)originalFrame point:(CGPoint)point{ BOOL q1 = originalFrame.origin.x >= 0; BOOL q2 = originalFrame.origin.x + originalFrame.size.width <= screenW; if (q1 && q2) { originalFrame.origin.x += point.x; } return originalFrame; } //拖动改变控件的竖直方向y值 - (CGRect)changeYWithFrame:(CGRect)originalFrame point:(CGPoint)point{ BOOL q1 = originalFrame.origin.y >= 0; BOOL q2 = originalFrame.origin.y + originalFrame.size.height <= screenH; if (q1 && q2) { originalFrame.origin.y += point.y; } return originalFrame; }
知识4:控件的移动 - 越界处理(跑到屏幕外了)架构
//拖动改变控件的水平方向x值 - (CGRect)changeXWithFrame:(CGRect)originalFrame point:(CGPoint)point{ BOOL q1 = originalFrame.origin.x >= 0; BOOL q2 = originalFrame.origin.x + originalFrame.size.width <= screenW; if (q1 && q2) { originalFrame.origin.x += point.x; } return originalFrame; } //拖动改变控件的竖直方向y值 - (CGRect)changeYWithFrame:(CGRect)originalFrame point:(CGPoint)point{ BOOL q1 = originalFrame.origin.y >= 0; BOOL q2 = originalFrame.origin.y + originalFrame.size.height <= screenH; if (q1 && q2) { originalFrame.origin.y += point.y; } return originalFrame; }
知识5:封装需求 - 若是限制只能水平 or 竖直滑动 or 全局滑动app
MNAssistiveTouchTypeNone = 0, //没限制随便移动 MNAssistiveTouchTypeVerticalScroll, //只能垂直移动 MNAssistiveTouchTypeHorizontalScroll, //只能竖直移动 switch (type) { case MNAssistiveTouchTypeNone: { 水平方向坐标 ++; 竖直方向坐标 ++; break; }case MNAssistiveTouchTypeHorizontalScroll:{ 竖直方向坐标 ++; break; } case MNAssistiveTouchTypeVerticalScroll:{ 水平方向坐标 ++; break; } }
使用方法工具
0.下载 demo文件
1.引入“MNAssistiveBtn”文件
2.进入“AppDelegate.m”
3.在 - (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions{...} 方法中,添加如下两句代码
//示例demo样式 MNAssistiveBtn *btn = [MNAssistiveBtn mn_touchWithType:MNAssistiveTouchTypeHorizontalScroll Frame:frame title:title titleColor:[UIColor whiteColor] titleFont:[UIFont systemFontOfSize:11] backgroundColor:nil backgroundImage:[UIImage imageNamed:@"test"]]; [self.window addSubview:btn];
最终样式展现~学习
1.CocoaPods : pod
MNFloatBtn
测试
2.手动导入 : 拖入MNFloatBtn
文件夹
导入头文件,#import <MNFloatBtn/MNFloatBtn.h>
一行代码,显示悬浮按钮
[MNFloatBtn show];
[MNFloatBtn showDebugModeWithType:MNAssistiveTypeNone];
[MNFloatBtn hidden];
[MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { NSLog(@btn.btnClick ~); };
进阶用法:
[[MNFloatBtn sharedBtn] setBuildShowDate:YES];
#define kAddress @"testapi.miniLV.com" //#define kAddress @"devapi.miniLV.com" //#define kAddress @"api.miniLV.com" //本身配置 - 什么api环境下,要显示什么标签 NSDictionary *envMap = @{ @"测试":@"testapi.miniLV.com", @"开发":@"devapi.miniLV.com", @"生产":@"api.miniLV.com" }; //设置不一样环境下,要展现的不一样title,以及当前的Host [[MNFloatBtn sharedBtn]setEnvironmentMap:envMap currentEnv:kAddress];