如何在 mac 上使用toast
在移动设备上 toast 是一种很常见的提醒,出现之后在很短的一段时间内消失。
在 macOS 上,我们也可以做到类似的效果。
- 首先,我们需要一个视图,我们可以用 xib 自定义一个视图,也可以直接用代码写一个视图。
我们自定义一个视图,此视图就是最终展示出来的视图模板。
- 将视图添加到需要展示的View上,可以给 NSView 写一个扩展,这样所有基于 NSView 的实例都可以调用
- 给视图属性赋值,并做适当的大小自适应
- 执行动画,让其在1s 之后移除
import Cocoa
extension NSView {
func showToast(with content:String, imageName:String?,completion:(()->Void)? = nil) {
//1. 自定义toast视图:这里使用 xib 自定义的toast 视图,也可以用代码自定义视图
let nib = NSNib.init(nibNamed: "ToastView", bundle: nil)
var array:NSArray?
nib?.instantiate(withOwner: self, topLevelObjects: &array)
var toastView:ToastView?
if let arr = array {
for obj in arr {
if obj is ToastView {
toastView = obj as? ToastView
break
}
}
}
//2. 给自定义视图赋值 自定义的 toast 中含有图标和文本
if let toast = toastView{
if let name = imageName ,let image = NSImage(named: name) {
toast.imageView.image = image
toast.imageView.isHidden = false
}else {
toast.imageView.isHidden = true
}
toast.titleLabel.stringValue = content
// 3. 自适应大小
toast.titleLabel.sizeToFit()
if toast.bounds.width <= toast.titleLabel.bounds.width + 10 {
toast.frame = NSRect(origin: CGPoint.zero, size: CGSize(width: toast.titleLabel.bounds.width + 10, height: toast.bounds.height))
}
toast.frame.origin = CGPoint(x: (bounds.width - toast.bounds.width)/2, y: (bounds.height - toast.bounds.height)/2)
addSubview(toast)
// 4. 执行 toast 动画
NSAnimationContext.runAnimationGroup({ (context) in
context.duration = 1
toast.animator().alphaValue = 1
}) {
toast.animator().alphaValue = 0
toast.removeFromSuperview()
completion?()
}
}
}
func showToast(_ string:String) {
self.showToast(with: string, imageName: nil)
}
}
网友评论