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

引言

            在App的开发中,某些功能执行的过程中可能会出现各种各样的问题。为了用户更好的体验,我们需要让用户知道该功能发生了什么,原因是什么;而不是在哪傻傻的等着。为了能够让用户看到这个提醒,就设计出一个能在视图上展示的图框,通过这个图框来说明出现的问题。这个图框我们称之为 RemindBox 或者 Alert 等。

RemindBox的创建使用到的知识点

  • 类的扩展 extension 的使用。
extension  UIView {
    code.....
}
  • 枚举的创建
/*!
 设置是自动关闭还是手动关闭
 */
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 {
    // 判断出入参数是否存在
    if lable != nil {
        // 设置段落规则
        let paragraphStyle = NSMutableParagraphStyle.init()
        paragraphStyle.lineBreakMode = lable!.lineBreakMode
        // 设置计算属性
        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
  • 使用运行时给某个对象设置标签

1、 设置标签

// 设置RemindBox标记
objc_setAssociatedObject(self, &RemindMark, remindView, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

2、 通过标签获取对象

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 是我根据目前App的提醒框而整理和封装的一个 Swift 版本的RemindBox。 ZSJRemindManager 包含多种样式,还可以自定义样式和显示的位置等。

2、 ZSJRemindManager的部分核心代码展示

1、 对象的创建
/*!
 要创建一个Remind框
 
 @message: 要显示的信息
 @title: RemindBox 的标题
 @image: RemindBox 的要展示的图片
 */
private func createRemind(message:String? ,title:String? , image:UIImage? , isActivityIndicatorView:Bool) -> UIView? {
    // 判断传入参数的是否有值
    if message == nil && title == nil && image == nil && isActivityIndicatorView == false {
        return nil
    }
    // 创建 msg/title/image对象
    var msgLable:UILabel?
    var titleLable:UILabel?
    var imageView:UIImageView?
    var activityIndicatorView:UIActivityIndicatorView?
    // 创建一个载体View
    let remindView = UIView.init()
    // 实现子控件相对父控件的布局
    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: 检测是否有标题
    if title != nil {
        // 创建标题对象
        titleLable = UILabel.init()
        // 设置标记
        titleLable!.tag = 1990516
        // 设置自动换行
        titleLable?.numberOfLines = 0
        // 设置显示的字体大小
        titleLable?.font = UIFont.boldSystemFont(ofSize: TitleFont)
        // 设置标题文字显示的样式
        titleLable?.lineBreakMode = .byWordWrapping
        titleLable?.textAlignment = .center
        // 设置标题的文字
        titleLable?.text = title
        // 标题的渲染
        remindView.addSubview(titleLable!)
    }

    // TODO: 检测是否有图像
    if image != nil {
        // 创建图像对象
        imageView = UIImageView.init()
        // 设置图像
        imageView!.image = image
        // 渲染视图之上
        remindView.addSubview(imageView!)
    }
    
    // TODO: 是否含有活动指示器
    if isActivityIndicatorView {
        activityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
        activityIndicatorView!.startAnimating()
        remindView.addSubview(activityIndicatorView!)
    }
    
    // TODO:判断消息是否存在
    if message != nil {
        // 创建消息对象
        msgLable = UILabel.init()
        // 设置标记
        msgLable!.tag = 1989516
        // 设置可折叠行数
        msgLable!.numberOfLines = 0
        // 设置标题文字显示的样式
        msgLable!.lineBreakMode = .byWordWrapping
        msgLable!.textAlignment = .center
        // 设置消息字体的大小
        msgLable!.font = UIFont.systemFont(ofSize: MessgaeFont)
        // 设置消息的内容
        msgLable!.text = message
        // 消息的渲染
        remindView.addSubview(msgLable!)
    }
    // 设置位置
    self.remindBoxLayoutBox(tager: remindView)
    // 设置RemindBox标记
    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 {
    // 判断出入参数是否存在
    if lable != nil {
        // 设置段落规则
        let paragraphStyle = NSMutableParagraphStyle.init()
        paragraphStyle.lineBreakMode = lable!.lineBreakMode
        // 设置计算属性
        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: "你的钱掉了,请注意拾取,谢谢!!!")

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.33.29.png
2、测试二
// 消息与标题
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: "你非常棒,继续努力", image: UIImage.init(named: "Image"), position: nil)

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.51.22.png
5、测试五
// 图像,标题,消息
self.view.showRemindBox(title: "温馨提示", message: "你是最棒的,继续努力哦!", image: UIImage.init(named: "Image"), position: nil)

效果如下:


Simulator Screen Shot - iPhone 8 - 2017-11-24 at 15.53.48.png
6、测试六
// 图像,标题,消息,位置
self.view.showRemindBox(title: "温馨提示", message: "你是最棒的,继续努力哦!", 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 的下载方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,090评论 4 62
  • 宋诗乔,人如其名,一个柔弱的女孩,上天对她是残酷的,在最美好的年纪,青春年华,生命却柔弱的如同一根芦苇,在风中飘摇...
    shuqiuyue阅读 285评论 0 0
  • 在遇到你之前,我们都还小,我还不懂得何为关心,只会任性地无理取闹,再有忍耐力的人内心的小火山也会爆发的吧。果不其然...
    Sunnylemonnnn阅读 243评论 0 0
  • 阅读《刻意练习》时我留意到一个例子,一个学生每天坚持练习演奏1小时,但每次测试的成绩却总是C,难以突破。从老师和学...
    espada007929阅读 564评论 0 0
  • 我在想着,但是我却不清楚想着的、念着的究竟是什么。 阅读着,思绪却又漂浮着。 陈年往事,不是,却也是?我在忏悔着我...
    小颜_糖阅读 239评论 0 0