如何在 mac 上使用toast

2019-07-06  本文已影响0人  _我和你一样

如何在 mac 上使用toast

在移动设备上 toast 是一种很常见的提醒,出现之后在很短的一段时间内消失。

在 macOS 上,我们也可以做到类似的效果。

  1. 首先,我们需要一个视图,我们可以用 xib 自定义一个视图,也可以直接用代码写一个视图。

我们自定义一个视图,此视图就是最终展示出来的视图模板。

  1. 将视图添加到需要展示的View上,可以给 NSView 写一个扩展,这样所有基于 NSView 的实例都可以调用
  2. 给视图属性赋值,并做适当的大小自适应
  3. 执行动画,让其在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)
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读