macOS 開發:NSScrollView 學習筆記

最近抽空看了些 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

clipboard.png

NSScrollView 是由 NSScrollerNSClipViewContentViewNSRulerView 構成的。這個能夠選擇用 IB 構建一個 NSScrollView 來查看,比較直觀。ui

clipboard.png

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

clipboard.png

相關文章
相關標籤/搜索