Skip to content

Instantly share code, notes, and snippets.

@kopyl
Last active April 4, 2025 06:47
Show Gist options
  • Save kopyl/c0ce73d753c7168b2cbd58d621bf471a to your computer and use it in GitHub Desktop.
Save kopyl/c0ce73d753c7168b2cbd58d621bf471a to your computer and use it in GitHub Desktop.
import Cocoa
class FlippedView: NSView {
override var isFlipped: Bool {
return true
}
}
private class Spacer: NSView {
var height: CGFloat = 0
init(height: CGFloat) {
super.init(frame: .zero)
self.height = height
translatesAutoresizingMaskIntoConstraints = false
heightAnchor.constraint(equalToConstant: height).isActive = true
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func add(on stackView: NSStackView) {
let spacer = Spacer(height: self.height)
stackView.addArrangedSubview(spacer)
}
}
class ViewController: NSViewController {
let items = Array(0..<50).map { String($0) }
override func loadView() {
self.view = NSView(frame: NSRect(x: 0, y: 0, width: 400, height: 300))
}
override func viewDidLoad() {
super.viewDidLoad()
let stackViewPadding: CGFloat = 10
let spacer = Spacer(height: stackViewPadding)
let scrollView = NSScrollView(frame: view.bounds)
scrollView.hasVerticalScroller = true
scrollView.autoresizingMask = [.width, .height]
scrollView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(scrollView)
scrollView.drawsBackground = false
let stackView = NSStackView()
stackView.orientation = .vertical
stackView.alignment = .leading
stackView.spacing = 4
stackView.translatesAutoresizingMaskIntoConstraints = false
let flippedView = FlippedView()
flippedView.addSubview(stackView)
scrollView.documentView = flippedView
spacer.add(on: stackView)
for item in items {
let textView = NSTextField(labelWithString: item)
stackView.addArrangedSubview(textView)
}
spacer.add(on: stackView)
let height = stackView.fittingSize.height
scrollView.documentView?.frame.size = CGSize(width: scrollView.contentSize.width, height: height)
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
])
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment