花落√莫相思

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

2017-11-24  本文已影响13人  NetWork小贱

引言

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

RemindBox的创建使用到的知识点

extension  UIView {
    code.....
}
/*!
 设置是自动关闭还是手动关闭
 */
public enum RemindBoxDeleteType:Int {
    case AutomaticityDeleteType
    case HandMovementDeleteType
}
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
}
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 的下载方法

上一篇下一篇

猜你喜欢

热点阅读