美文网首页花落√莫相思
83-Swift之提醒框(RemindBox)的使用和介绍

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

作者: NetWork小贱 | 来源:发表于2017-11-24 16:06 被阅读13次

    引言

                在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 的下载方法

    相关文章

      网友评论

        本文标题:83-Swift之提醒框(RemindBox)的使用和介绍

        本文链接:https://www.haomeiwen.com/subject/leqfbxtx.html