83-Swift之提醒框(RemindBox)的使用和介紹

引言

? ? ? ? ? ? 在App的開發(fā)中搔体,某些功能執(zhí)行的過程中可能會出現(xiàn)各種各樣的問題靡狞。為了用戶更好的體驗,我們需要讓用戶知道該功能發(fā)生了什么拘央,原因是什么涂屁;而不是在哪傻傻的等著。為了能夠讓用戶看到這個提醒灰伟,就設(shè)計出一個能在視圖上展示的圖框拆又,通過這個圖框來說明出現(xiàn)的問題。這個圖框我們稱之為 RemindBox 或者 Alert 等袱箱。

RemindBox的創(chuàng)建使用到的知識點

  • 類的擴展 extension 的使用。
extension  UIView {
    code.....
}
  • 枚舉的創(chuàng)建
/*!
 設(shè)置是自動關(guān)閉還是手動關(guān)閉
 */
public enum RemindBoxDeleteType:Int {
    case AutomaticityDeleteType
    case HandMovementDeleteType
}
  • 對象類型的判斷 is
if item is String {
     code....
}

if item is UILable {
     code....
}
  • 計算文本框的實際尺寸
/*!
 計算對象的真實尺寸
 
 @lable: 要計算的傳入對象
 */
private func calculateTheTrueSize(lable:UILabel? ,maxSize:CGSize) -> CGSize {
    // 判斷出入?yún)?shù)是否存在
    if lable != nil {
        // 設(shè)置段落規(guī)則
        let paragraphStyle = NSMutableParagraphStyle.init()
        paragraphStyle.lineBreakMode = lable!.lineBreakMode
        // 設(shè)置計算屬性
        let attributes = [NSAttributedStringKey.font:lable!.font , NSAttributedStringKey.foregroundColor:lable!.textColor, NSAttributedStringKey.paragraphStyle:paragraphStyle] as [NSAttributedStringKey : Any]
        // 計算真實尺寸
        let tempString = lable!.text! as NSString
        return tempString.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
    }
    return CGSize.zero
}
  • Runtime的頭文件引入
import ObjectiveC.runtime
  • 使用運行時給某個對象設(shè)置標(biāo)簽

1义矛、 設(shè)置標(biāo)簽

// 設(shè)置RemindBox標(biāo)記
objc_setAssociatedObject(self, &RemindMark, remindView, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

2发笔、 通過標(biāo)簽獲取對象

let remindBox = objc_getAssociatedObject(self, &RemindMark) as! UIView
remindBox.removeFromSuperview()
  • 定時器的使用
// 添加定時器
Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { (timer) in
    // 停止定時器
    timer.invalidate()
    // 清除RemindBox
    self.hiddenRemindBox()
})

ZSJRemindManager.swift 類的介紹

1、介紹 ZSJRemindManager

? ? ? ? ? ? ZSJRemindManager 是我根據(jù)目前App的提醒框而整理和封裝的一個 Swift 版本的RemindBox凉翻。 ZSJRemindManager 包含多種樣式了讨,還可以自定義樣式和顯示的位置等。

2制轰、 ZSJRemindManager的部分核心代碼展示

1前计、 對象的創(chuàng)建
/*!
 要創(chuàng)建一個Remind框
 
 @message: 要顯示的信息
 @title: RemindBox 的標(biāo)題
 @image: RemindBox 的要展示的圖片
 */
private func createRemind(message:String? ,title:String? , image:UIImage? , isActivityIndicatorView:Bool) -> UIView? {
    // 判斷傳入?yún)?shù)的是否有值
    if message == nil && title == nil && image == nil && isActivityIndicatorView == false {
        return nil
    }
    // 創(chuàng)建 msg/title/image對象
    var msgLable:UILabel?
    var titleLable:UILabel?
    var imageView:UIImageView?
    var activityIndicatorView:UIActivityIndicatorView?
    // 創(chuàng)建一個載體View
    let remindView = UIView.init()
    // 實現(xiàn)子控件相對父控件的布局
    remindView.autoresizingMask =  [.flexibleWidth , .flexibleHeight]
    // RemindBox的元切角
    remindView.layer.masksToBounds = true
    remindView.layer.cornerRadius = RemindBoxCornerRadius
    // RemaindBox 的背景色
    remindView.backgroundColor = UIColor.init(white: 0.5, alpha: 0.8)
    // TODO: 檢測是否有標(biāo)題
    if title != nil {
        // 創(chuàng)建標(biāo)題對象
        titleLable = UILabel.init()
        // 設(shè)置標(biāo)記
        titleLable!.tag = 1990516
        // 設(shè)置自動換行
        titleLable?.numberOfLines = 0
        // 設(shè)置顯示的字體大小
        titleLable?.font = UIFont.boldSystemFont(ofSize: TitleFont)
        // 設(shè)置標(biāo)題文字顯示的樣式
        titleLable?.lineBreakMode = .byWordWrapping
        titleLable?.textAlignment = .center
        // 設(shè)置標(biāo)題的文字
        titleLable?.text = title
        // 標(biāo)題的渲染
        remindView.addSubview(titleLable!)
    }

    // TODO: 檢測是否有圖像
    if image != nil {
        // 創(chuàng)建圖像對象
        imageView = UIImageView.init()
        // 設(shè)置圖像
        imageView!.image = image
        // 渲染視圖之上
        remindView.addSubview(imageView!)
    }
    
    // TODO: 是否含有活動指示器
    if isActivityIndicatorView {
        activityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
        activityIndicatorView!.startAnimating()
        remindView.addSubview(activityIndicatorView!)
    }
    
    // TODO:判斷消息是否存在
    if message != nil {
        // 創(chuàng)建消息對象
        msgLable = UILabel.init()
        // 設(shè)置標(biāo)記
        msgLable!.tag = 1989516
        // 設(shè)置可折疊行數(shù)
        msgLable!.numberOfLines = 0
        // 設(shè)置標(biāo)題文字顯示的樣式
        msgLable!.lineBreakMode = .byWordWrapping
        msgLable!.textAlignment = .center
        // 設(shè)置消息字體的大小
        msgLable!.font = UIFont.systemFont(ofSize: MessgaeFont)
        // 設(shè)置消息的內(nèi)容
        msgLable!.text = message
        // 消息的渲染
        remindView.addSubview(msgLable!)
    }
    // 設(shè)置位置
    self.remindBoxLayoutBox(tager: remindView)
    // 設(shè)置RemindBox標(biāo)記
    objc_setAssociatedObject(self, &RemindMark, remindView, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    // 返回對象
    return remindView
}
2、檢測視圖上是否有RemindBox的顯示和清除RemindBox
/*!
 清除RemindBox
 */
func hiddenRemindBox() -> Void {
    // 獲取視圖上的RemindBox
    let remindBox = objc_getAssociatedObject(self, &RemindMark) as! UIView
    remindBox.removeFromSuperview()
}

/*!
 檢測視圖上是否存在RemindBox
 
 @tager: 要檢測視圖
 */
private func isDetectRemindInRootView(tager:UIView) -> Void {
    let remind = objc_getAssociatedObject(tager, &RemindMark)
    if remind != nil {
        return
    }
}
3垃杖、自動計算文本的寬高
/*!
 計算對象的真實尺寸
 
 @lable: 要計算的傳入對象
 */
private func calculateTheTrueSize(lable:UILabel? ,maxSize:CGSize) -> CGSize {
    // 判斷出入?yún)?shù)是否存在
    if lable != nil {
        // 設(shè)置段落規(guī)則
        let paragraphStyle = NSMutableParagraphStyle.init()
        paragraphStyle.lineBreakMode = lable!.lineBreakMode
        // 設(shè)置計算屬性
        let attributes = [NSAttributedStringKey.font:lable!.font , NSAttributedStringKey.foregroundColor:lable!.textColor, NSAttributedStringKey.paragraphStyle:paragraphStyle] as [NSAttributedStringKey : Any]
        // 計算真實尺寸
        let tempString = lable!.text! as NSString
        return tempString.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
    }
    return CGSize.zero
}

3男杈、 ZSJRemindManager的測試使用

1、測試一
// 只顯示消息
self.view.showRemindBox(message: "你的錢掉了调俘,請注意拾取伶棒,謝謝M荨!肤无!")

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.33.29.png
2先蒋、測試二
// 消息與標(biāo)題
self.view.showRemindBox(title: "溫馨提示", message: "你的錢掉了,請注意拾取宛渐,謝謝>貉!窥翩!", image: nil, position: nil)

效果展示:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.41.14.png
3 业岁、測試三
// 圖像
self.view.showRemindBox(image: UIImage.init(named: "Image"))

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.44.57.png
4、測試四
// 圖像加信息
self.view.showRemindBox(title: nil, message: "你非常棒,繼續(xù)努力", image: UIImage.init(named: "Image"), position: nil)

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.51.22.png
5鳍烁、測試五
// 圖像叨襟,標(biāo)題,消息
self.view.showRemindBox(title: "溫馨提示", message: "你是最棒的,繼續(xù)努力哦幔荒!", image: UIImage.init(named: "Image"), position: nil)

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.53.48.png
6糊闽、測試六
// 圖像,標(biāo)題爹梁,消息右犹,位置
self.view.showRemindBox(title: "溫馨提示", message: "你是最棒的,繼續(xù)努力哦!", image: UIImage.init(named: "Image"), position: 0.3)

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.57.52.png
7姚垃、測試七
// 帶文字的活動指示器
self.view.showActivityIndicatorRemindBox(message: "正在加載中念链。。积糯。")

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.59.38.png
8掂墓、測試八
// 只是活動指示器
self.view.showActivityIndicatorRemindBox()

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 16.01.36.png
9、測試九
// 帶文字的活動指示器
self.view.showActivityIndicatorRemindBox(message: "正在加載中,請稍后看成。君编。。", position:0.3)

效果如下:

Simulator Screen Shot - iPhone 8 - 2017-11-24 at 16.03.35.png

ZSJRemindManager 的下載方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末川慌,一起剝皮案震驚了整個濱河市吃嘿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梦重,老刑警劉巖兑燥,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琴拧,居然都是意外死亡降瞳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚓胸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來力崇,“玉大人斗塘,你說我怎么就攤上這事×裂ィ” “怎么了馍盟?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茧吊。 經(jīng)常有香客問我贞岭,道長,這世上最難降的妖魔是什么搓侄? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任瞄桨,我火速辦了婚禮,結(jié)果婚禮上讶踪,老公的妹妹穿的比我還像新娘芯侥。我一直安慰自己,他們只是感情好乳讥,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布柱查。 她就那樣靜靜地躺著,像睡著了一般云石。 火紅的嫁衣襯著肌膚如雪唉工。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天汹忠,我揣著相機與錄音淋硝,去河邊找鬼。 笑死宽菜,一個胖子當(dāng)著我的面吹牛谣膳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铅乡,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼继谚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隆判?” 一聲冷哼從身側(cè)響起犬庇,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤僧界,失蹤者是張志新(化名)和其女友劉穎侨嘀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捂襟,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡咬腕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了葬荷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涨共。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡纽帖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出举反,到底是詐尸還是另有隱情懊直,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布火鼻,位于F島的核電站室囊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏魁索。R本人自食惡果不足惜融撞,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粗蔚。 院中可真熱鬧尝偎,春花似錦、人聲如沸鹏控。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牧挣。三九已至急前,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瀑构,已是汗流浹背裆针。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寺晌,地道東北人世吨。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像呻征,于是被迫代替她去往敵國和親耘婚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫陆赋、插件沐祷、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • 宋詩喬赖临,人如其名,一個柔弱的女孩灾锯,上天對她是殘酷的兢榨,在最美好的年紀(jì),青春年華,生命卻柔弱的如同一根蘆葦吵聪,在風(fēng)中飄搖...
    shuqiuyue閱讀 288評論 0 0
  • 在遇到你之前凌那,我們都還小,我還不懂得何為關(guān)心吟逝,只會任性地?zé)o理取鬧帽蝶,再有忍耐力的人內(nèi)心的小火山也會爆發(fā)的吧。果不其然...
    Sunnylemonnnn閱讀 247評論 0 0
  • 閱讀《刻意練習(xí)》時我留意到一個例子块攒,一個學(xué)生每天堅持練習(xí)演奏1小時嘲碱,但每次測試的成績卻總是C,難以突破局蚀。從老師和學(xué)...
    espada007929閱讀 568評論 0 0
  • 我在想著麦锯,但是我卻不清楚想著的、念著的究竟是什么琅绅。 閱讀著扶欣,思緒卻又漂浮著。 陳年往事千扶,不是料祠,卻也是?我在懺悔著我...
    小顏_糖閱讀 239評論 0 0