内容简介:背景介绍 :在普通的iOS开发组中,一般测试机都不止一台,但是我们在开发的时候,不可能每台测试机时刻保持最新的代码,这就出现了一个问题,当测试测出问题的时候,(或者产品突然拿去点点看的时候出了问题)如果不知道当前的版本,可能不确定是什么时候出的问题。解决方案:如果当前环境是测试服的时候,展示一个全局浮动标签,这样不仅看到此标志就告诉测试(包括我们自己)当前的环境,当出现问题的时候,通过标签,可以快速定位当前问题发生的版本号等等![需求设计图.png](http://upload-images.jianshu
背景介绍 :在普通的iOS开发组中,一般测试机都不止一台,但是我们在开发的时候,不可能每台测试机时刻保持最新的代码,这就出现了一个问题,当测试测出问题的时候,(或者产品突然拿去点点看的时候出了问题)如果不知道当前的版本,可能不确定是什么时候出的问题。
解决方案:如果当前环境是测试服的时候,展示一个全局浮动标签,这样不仅看到此标志就告诉测试(包括我们自己)当前的环境,当出现问题的时候,通过标签,可以快速定位当前问题发生的版本号等等
![需求设计图.png](http://upload-images.jianshu.io/upload_images/4563271-db6a7256eb913f31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
思路:
- 由于要全局显示,所以必须加在最上层(window层)
- 由于需求图中有文字和背景图片,优先考虑UIButton(当然,如果有勇士非要用UIView,里面放imageView 和 label也o98k)
- 由于此图片不是半透明,会挡住后面的内容,所以这个标签必须可以拖动 - 考虑添加拖拽手势
- 本质上可以理解为,创建一个UIButton,为其添加拖拽手势,然后将其添加到UIWindow显示
知识1:按钮显示2行文字
//UIbutton的换行显示 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; //然后如同title的内容用包含“\n”就会换行 title = @“123\n666” 复制代码
知识2:Version 与 Build号的获取
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:控件的移动 - 越界处理(跑到屏幕外了)
//记录该button是否屏幕越界 BOOL isOver = NO; if (frame.origin.x < 0) { frame.origin.x = 0; isOver = YES; } else if (frame.origin.x + frame.size.width > screenW) { frame.origin.x = screenW - frame.size.width; isOver = YES; } if (frame.origin.y < 0) { frame.origin.y = 0; isOver = YES; } else if (frame.origin.y+frame.size.height > screenH) { frame.origin.y = screenH - frame.size.height; isOver = YES; } if (isOver) { //如果越界-跑回来 [UIView animateWithDuration:0.3 animations:^{ self.frame = frame; }]; } 复制代码
知识5:封装需求 - 如果限制只能水平 or 竖直滑动 or 全局滑动
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]; 复制代码
- 仅在Debug模式下显示悬浮按钮(推荐使用)
[MNFloatBtn showDebugModeWithType:MNAssistiveTypeNone]; 复制代码
- 移除悬浮按钮在界面上显示
[MNFloatBtn hidden]; 复制代码
- 按钮点击事件
[MNFloatBtn sharedBtn].btnClick = ^(UIButton *sender) { NSLog(@" btn.btnClick ~"); }; 复制代码
进阶用法:
- 默认显示当前日期
[[MNFloatBtn sharedBtn] setBuildShowDate:YES]; 复制代码
- 配置api环境显示
#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]; 复制代码
喜欢的可以给个star,不胜感激~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- css做个波浪悬浮球?
- XFloatView 一个简易的悬浮窗实现方案
- 利用CSS变量实现炫酷的悬浮效果
- Vue学习笔记(1)——在页面右上角实现可悬浮/隐藏的系统菜单
- 全局变量,静态全局变量,局部变量,静态局部变量
- Thrift RPC 系列教程(2)——全局变量&全局常量
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法:python语言实现
迈克尔.·T·古德里奇、罗伯托·塔玛西亚、迈克尔·H·戈德瓦瑟 / 张晓、赵晓南 / 机械工业出版社 / 2018-9 / 109.00元
本书采用Python语言讨论数据结构和算法,详细讲解其设计、分析与实现过程,是一本内容全面且特色鲜明的教材。书中将面向对象视角贯穿始终,充分利用Python语言优美而简洁的特点,强调代码的健壮性和可重用性,关注各种抽象数据类型以及不同算法实现策略的权衡。一起来看看 《数据结构与算法:python语言实现》 这本书的介绍吧!