背景介紹 :在普通的iOS開發組中,一般測試機都不止一臺,但是我們在開發的時候,不可能每臺測試機時刻保持最新的程式碼,這就出現了一個問題,當測試測出問題的時候,(或者產品突然拿去點點看的時候出了問題)如果不知道當前的版本,可能不確定是什麼時候出的問題。
解決方案:如果當前環境是測試服的時候,展示一個全域性浮動標籤,這樣不僅看到此標誌就告訴測試(包括我們自己)當前的環境,當出現問題的時候,通過標籤,可以快速定位當前問題發生的版本號等等
思路:
- 由於要全域性顯示,所以必須加在最上層(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,不勝感激~