最近抽空看了些 macOS 開發的資料。(自嘲下:iOS 開發都不是很會,就開始搞 macOS 開發。。)
一開始以爲 macOS 和 iOS 估計差很少。可是呢,習慣 UIKit,再去碰 Appkit 這個古老的框架。只能說二者真不是一碼事。。。html
官方有份 NSScrollView 的教程。寫的挺詳細。能夠看下。git
Xcode 裏面的文檔沒有不少的解釋。有些連默認值都不知道有沒有。使用 UIKit 時,遇到問題,跳到文檔裏面,不少狀況下會有相應解釋等。可是 AppKit 的話,大部分都沒有多少解釋。估計又是一個歷史包袱吧~github
那麼如何去建立一個 NSScrollView?swift
let scrollView = NSScrollView() let scrollView = NSScrollView(frame: NSRect())
這個和 UIScrollView 幾乎一致。app
UIKit 中,咱們能夠經過設置 UIScrollView 的 contentSize 來進行可滑動的操做。可是呢,在 NSScrollView
裏,並無 contentSize 供咱們設置,取而代之的是 documentView。當咱們要使用一個 NSScrollView 的時候,須要把 conentView 指向 scrollView 的 documentView。框架
let contentView = NSView(frame: NSRect(x: 0, y: 0, width: 1000, height: 1000)) contentView.backgroundColor = .yellow bgScrollView.documentView = contentView
在官方的教程中,解釋的很清楚。ide
NSScrollView 是由 NSScrollerNSClipViewContentViewNSRulerView 構成的。這個能夠選擇用 IB 構建一個 NSScrollView 來查看,比較直觀。ui
Clip View ,是一個 NSClipView。也就是 scrollView 的一個 contentView
的屬性。官方的說法,負責剪切 documentView 的內容等。從 IB 的 圖看到的層級,猜想 documentView 有可能就是這個 NSClipView 層級下的 view。spa
NSScrollView 給人的感受,更像一個迷你窗口,而後經過滾動 documentView 來使的內容出如今窗口裏面。設計
在使用上,一些屬性配置能夠見如下代碼。
let scrollView = NSScrollView() // scrollerStyle。overlay / legacy。 overlay 的效果,則是 scroller 背景透明,而 legacy 則是 獨立出 scroller 的區域,看起來比較醜~~我的以爲? scrollView.scrollerStyle = .overlay // 滾動條的顯示。用 IB 建立 scrollview 時,如下兩個參數均爲 true。可是 code 建立 scrollview 時,如下兩個參數默認均爲 false。很奇怪的設計。 scrollView.hasVerticalScroller = true scrollView.hasHorizontalScroller = true // 滾動條的樣式:light、 dark、default。default 的話,其實就是 dark scrollView.scrollerKnobStyle = .dark // bounce 的效果。elasticity 是彈性的含義。automatic\allowed\none。 scrollView.horizontalScrollElasticity = .automatic scrollView.verticalScrollElasticity = .automatic
因爲 macOS 的座標起點是在屏幕左下角。所以,在設置好 documentView 後,最好讓 scrollView 滾到最上方的位置。爲了方便,直接用 extension 增長了一個 scrollToTop 的方法。
extension NSScrollView { /// Scroll to the ducument view top. public func scrollToTop() { if let documentView = self.documentView { if documentView.isFlipped { documentView.scroll(.zero) } else { let maxHeight = max(bounds.height, documentView.bounds.height) documentView.scroll(NSPoint(x: 0, y: maxHeight)) } } } } // 滾動到最上方 scrollView.scrollToTop()
其中,isFlipped 是座標系翻轉。是 NSView 的一個屬性。
固然,NSScrollView 並不是只有這麼簡簡單單幾行代碼。還有一些設置。好比 scrollerInsets 是設置 NSScroller 的邊距等。另外,還有一些通知,能夠進行一些事件的監聽。
最後上個demo。