背景介紹 :在普通的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];