引言
在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.pngZSJRemindManager 的下载方法
-
联系间主(m:18801210281 , q:1542100658)
-
发邮箱件 (zhoushuangjian511@163.com)
网友评论