iOS - 添加一個全局懸浮按鈕(集成pods版)

背景介紹 :在普通的iOS開發組中,通常測試機都不止一臺,可是咱們在開發的時候,不可能每臺測試機時刻保持最新的代碼,這就出現了一個問題,當測試測出問題的時候,(或者產品忽然拿去點點看的時候出了問題)若是不知道當前的版本,可能不肯定是何時出的問題。
在這裏插入圖片描述git

解決方案:若是當前環境是測試服的時候,展現一個全局浮動標籤,這樣不只看到此標誌就告訴測試(包括咱們本身)當前的環境,當出現問題的時候,經過標籤,能夠快速定位當前問題發生的版本號等等

在這裏插入圖片描述
思路:
github

  • 因爲要全局顯示,因此必須加在最上層(window層)
  • 因爲需求圖中有文字和背景圖片,優先考慮UIButton(固然,若是有勇士非要用UIView,裏面放imageView 和 label也o98k)
  • 因爲此圖片不是半透明,會擋住後面的內容,因此這個標籤必須能夠拖動 - 考慮添加拖拽手勢
  • 本質上能夠理解爲,建立一個UIButton,爲其添加拖拽手勢,而後將其添加到UIWindow顯示

知識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];

最終樣式展現~
https://user-gold-cdn.xitu.io/2019/1/31/168a2d80147f8435?imageslim學習


集成方法

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]; 

推薦👇:

  • 020 持續更新,精品小圈子每日都有新內容,乾貨濃度極高。
  • 結實人脈、討論技術 你想要的這裏都有!
  • 搶先入羣,跑贏同齡人!(入羣無需任何費用)
  • (直接搜索羣號:789143298,快速入羣)
  • 點擊此處,與iOS開發大牛一塊兒交流學習

申請即送:

  • BAT大廠面試題、獨家面試工具包,
  • 資料免費領取,包括 數據結構、底層進階、圖形視覺、音視頻、架構設計、逆向安防、RxSwift、flutter,

相關文章
相關標籤/搜索