iOS淺談如何設計第三方框架

如何設計一個好的第三方框架給別其他開發(fā)者用?需要要考慮哪些方面?

  • 如圖:一個簡易的狀態(tài)欄的hud示例,通過這個示例了解在設計第三方框架需要注意哪些方面
demo.gif

一.框架的名字

  • DXStatusBarHUD,前綴自定義,比如自己的名字縮寫,StatusBarHUD名字中要能顯示出框架的功能

二.設計對外的接口

  • 首先考慮外界如何調(diào)用方便
  • 其次要考慮性能最好,優(yōu)先考慮類方法,如--> 類名 + 方法

1.外界調(diào)用的方法

- (IBAction)success {
    [DXStatusBarHUD showSuccess:@"加載數(shù)據(jù)成功!"];
}

- (IBAction)error {
    [DXStatusBarHUD showError:@"登錄失旈稀!"];
}

- (IBAction)loading {
    [DXStatusBarHUD showLoading:@"正在登錄中..."];
}

- (IBAction)hide {
    [DXStatusBarHUD hide];
}

- (IBAction)normal {
    [DXStatusBarHUD showText:@"隨便顯示的文字!!P裱省浅乔!"];
}

2.對外提供的方法

  • 注意:
  • 盡量用文檔注釋,這樣書寫有提示
  • 用戶不傳圖片,默認提供圖片
  • 要考慮到外界更改提示框圖片的情況
  • 注意對外提供的接口和參數(shù)應該盡量少
  • 要考慮到用戶不停的點擊或者亂點擊等各種情況,需多作判斷
/*此方法設計缺點:只能加載本地圖片,不能加載網(wǎng)絡圖片,例如用SD_webImage下載保存到沙盒的圖片
 * 顯示圖片+文字信息
 */
+ (void)showImageName:(NSString *)imageName text:(NSString *)text;

/**
 * 顯示圖片+文字信息
 */
+ (void)showImage:(UIImage *)image text:(NSString *)text;

/**
 * 顯示成功信息
 */
+ (void)showSuccess:(NSString *)text;

/**
 * 顯示失敗信息
 */
+ (void)showError:(NSString *)text;

/**
 * 顯示正在處理的信息
 */
+ (void)showLoading:(NSString *)text;

/**
 * 顯示普通信息
 */
+ (void)showText:(NSString *)text;

/**
 * 隱藏
 */
+ (void)hide;

3.方法的實現(xiàn)

  • 注意:
    • 在類方法中不能調(diào)用對象的屬性,如果想要保住一個對象的命,可以用全局變量;
    • 一些常量推薦使用static修飾的全局常量,而不使用宏
    • 注釋要簡明扼要,減少不必要的注釋
    • 注意代碼的封裝,重構
    • 注意代碼的可擴展性,方便其他開發(fā)者可以給這個框架添加新功能
    • 注意定時器的使用,不用的時候要清空
static UIWindow *window_;
static NSTimer *timer_;
/** HUD控件的高度 */
static CGFloat const DXWindowH = 20;
/** HUD控件的動畫持續(xù)時間(出現(xiàn)\隱藏) */
static CGFloat const DXAnimationDuration = 0.25;
/** HUD控件默認會停留多長時間 */
static CGFloat const DXHUDStayDuration = 1.5;

+ (void)showImage:(UIImage *)image text:(NSString *)text
{
    // 停止之前的定時器
    [timer_ invalidate];
    
    // 創(chuàng)建窗口
    window_.hidden = YES; // 先隱藏之前的window
    window_ = [[UIWindow alloc] init];
    window_.backgroundColor = [UIColor blackColor];
    window_.windowLevel = UIWindowLevelAlert;
    window_.frame = CGRectMake(0, - DXWindowH, [UIScreen mainScreen].bounds.size.width, DXWindowH);
    window_.hidden = NO;
    
    // 添加按鈕
    UIButton *button = [[UIButton alloc] init];
    button.frame = window_.bounds;
    // 文字
    [button setTitle:text forState:UIControlStateNormal];
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize:13];
    // 圖片
    if (image) {
        [button setImage:image forState:UIControlStateNormal];
        button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
        button.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
    }
    [window_ addSubview:button];
    
    // 動畫
    [UIView animateWithDuration:DXAnimationDuration animations:^{
        CGRect frame = window_.frame;
        frame.origin.y = 0;
        window_.frame = frame;
    }];
    
    // 開啟一個新的定時器
    timer_ = [NSTimer scheduledTimerWithTimeInterval:DXHUDStayDuration target:self selector:@selector(hide) userInfo:nil repeats:NO];
}

+ (void)showImageName:(NSString *)imageName text:(NSString *)text
{
    [self showImage:[UIImage imageNamed:imageName] text:text];
}

+ (void)showSuccess:(NSString *)text
{
    [self showImageName:@"DXStatusBarHUD.bundle/success" text:text];
}

+ (void)showError:(NSString *)text
{
    [self showImageName:@"DXStatusBarHUD.bundle/error" text:text];
}

+ (void)showText:(NSString *)text
{
    [self showImage:nil text:text];
}

+ (void)showLoading:(NSString *)text
{
    // 停止之前的定時器
    [timer_ invalidate];
    timer_ = nil;
    
    // 創(chuàng)建窗口
    window_.hidden = YES; // 先隱藏之前的window
    window_ = [[UIWindow alloc] init];
    window_.backgroundColor = [UIColor blackColor];
    window_.windowLevel = UIWindowLevelAlert;
    window_.frame = CGRectMake(0, - DXWindowH, [UIScreen mainScreen].bounds.size.width, DXWindowH);
    window_.hidden = NO;
    
    // 添加按鈕
    UIButton *button = [[UIButton alloc] init];
    button.frame = window_.bounds;
    // 文字
    [button setTitle:text forState:UIControlStateNormal];
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont systemFontOfSize:13];
    [window_ addSubview:button];
    
    // 圈圈
    UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    [loadingView startAnimating];
    loadingView.center = CGPointMake(button.titleLabel.frame.origin.x - 60, DXWindowH * 0.5);
    [window_ addSubview:loadingView];
    
    // 動畫
    [UIView animateWithDuration:DXAnimationDuration animations:^{
        CGRect frame = window_.frame;
        frame.origin.y = 0;
        window_.frame = frame;
    }];
}

+ (void)hide
{
    // 清空定時器
    [timer_ invalidate];
    timer_ = nil;
    
    // 退出動畫
    [UIView animateWithDuration:DXAnimationDuration animations:^{
        CGRect frame = window_.frame;
        frame.origin.y =  - DXWindowH;
        window_.frame = frame;
    } completion:^(BOOL finished) {
        window_ = nil;
    }];
}

三.關于圖片資源處理

  • 對應圖片資源,應該注意框架內(nèi)部圖片名稱不能出現(xiàn)與使用者圖片名稱一樣,為解決可能出現(xiàn)圖片名稱一樣,可以對圖片文件夾打包成bundle文件,如圖
pic.png

四.簡單易用

  • 要減少開發(fā)者的項目的侵入性,比如不需要開發(fā)者的類繼承框架內(nèi)部的類
  • 提供一個demo供開發(fā)者快速上手
  • 開發(fā)者使用:
    1.把框架文件拽入自己項目中
    2.導入頭文件
    3.查看頭文件的方法,直接調(diào)用
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雏蛮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阱州,老刑警劉巖挑秉,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苔货,居然都是意外死亡犀概,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門夜惭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姻灶,“玉大人,你說我怎么就攤上這事滥嘴∧镜牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镊叁。 經(jīng)常有香客問我尘颓,道長,這世上最難降的妖魔是什么晦譬? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任疤苹,我火速辦了婚禮,結果婚禮上敛腌,老公的妹妹穿的比我還像新娘卧土。我一直安慰自己,他們只是感情好像樊,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布尤莺。 她就那樣靜靜地躺著,像睡著了一般生棍。 火紅的嫁衣襯著肌膚如雪颤霎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天涂滴,我揣著相機與錄音友酱,去河邊找鬼。 笑死柔纵,一個胖子當著我的面吹牛缔杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搁料,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼或详,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郭计?” 一聲冷哼從身側響起鸭叙,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拣宏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杠人,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡勋乾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗡善。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辑莫。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罩引,靈堂內(nèi)的尸體忽然破棺而出各吨,到底是詐尸還是另有隱情,我是刑警寧澤袁铐,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布揭蜒,位于F島的核電站横浑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屉更。R本人自食惡果不足惜徙融,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瑰谜。 院中可真熱鬧欺冀,春花似錦、人聲如沸萨脑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渤早。三九已至职车,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛛芥,已是汗流浹背提鸟。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仅淑,地道東北人称勋。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像涯竟,于是被迫代替她去往敵國和親赡鲜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理庐船,服務發(fā)現(xiàn)银酬,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫筐钟、插件揩瞪、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,109評論 4 62
  • Vim有三種基本工作模式: + 命令模式 + 文本輸入模式 + 末行模式。 vim基礎操作 vim是從 vi 發(fā)展...
    MambaMentality閱讀 304評論 0 0
  • 觀音在她身后道:“你看到他的樣子篓冲,你就會明白你不能讓他活著李破。”“去吧壹将∴凸ィ”玉帝說。紫霞一步步向前走著诽俯,她不敢抬頭妇菱,只...
    鈴兒襄叮當閱讀 389評論 0 0