Capture first frame of the video as an image on iOS and macOS in swift

import Foundation
import Cocoa
import AVKit
import AVFoundation

let asset: AVURLAsset = AVURLAsset.init(url: "URL OF ANY VIDEO local/remote")
let imgGenerator: AVAssetImageGenerator = AVAssetImageGenerator.init(asset: asset)
imgGenerator.appliesPreferredTrackTransform = true
            
imgGenerator.generateCGImagesAsynchronously(forTimes: [NSValue(time: CMTime.zero)]) { (_, image, _, res, error) in
                
                if error == nil {
                    DispatchQueue.main.async {
                           let imageView = NSImage.init(cgImage: image!, size: NSSize.init(width: 180.0, height: 180.0));
                    }
                } else {
                    DispatchQueue.main.async {
                        // Some other fallback image
                    }
                }
}

NSTableView custom highlight color with NSTableRowView

Getting the right color when you select NSTableView’s row was frustrating for me since I didn’t know how to do it properly. But it is really simple, all you need to do is having a class inherit from NSTableRowView and override its method drawSelection(in dirtyRect: NSRect).

import Foundation
import Cocoa

class MenuTableRowView: NSTableRowView {

    override func drawSelection(in dirtyRect: NSRect) {
        if self.selectionHighlightStyle != .none {
            let selectionRect = NSInsetRect(self.bounds, 2.5, 2.5)
            
            if let color = NSColor.init(named: NSColor.Name("menu_table_selection_color")) {
                color.setFill()
            }
            
            let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 0, yRadius: 0)
            selectionPath.fill()
        }
    }
    
}

Change menu_table_selection_color value in Assets.xcassets file.

Custom NSTableRowView

Now go to your NSTableViewDelegate’s method add your custom NSTableRowView.

 func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
        return MenuTableRowView()
}

Here you can see how my Storyboard looks like. Table view highlight value must be regular.