macOS 開發(fā)基礎(chǔ)教程 - 視頻劇透

圖片來自網(wǎng)絡(luò)

起因

近幾個月來,在簡書上經(jīng)常有朋友會對關(guān)于macOS 開發(fā)方面技術(shù)提出一些問題,在回復(fù)問題的過程,一個明顯的感覺是越來越多的人喜歡macOS開發(fā),但關(guān)于這方面的資料,網(wǎng)絡(luò)上還是比較少,因此萌生了錄制一套基礎(chǔ)入門課程視頻,采用Swift4.0作為開發(fā)語言,預(yù)計這個月底(8月31日)前可以完成錄制,大概有一百二十個課時左右,主要介紹基礎(chǔ)控件的常規(guī)應(yīng)用,主要希望對從iOSer轉(zhuǎn)macOS開發(fā)的朋友有所幫助,課程預(yù)發(fā)平臺選則了網(wǎng)易云課堂,課程的價格每課時大概1.00RMB(第一次錄制課程,才感覺原來視頻講解也挺不容易呀,但限于水平與經(jīng)驗,對視頻中的問題到時候還請大家多多指正

部分目錄

錄制課程表1

錄制課程表2

課程鏈接

最新課程觀傳送門

干貨摘錄

無技術(shù),不文章。下面對課程中的部分內(nèi)容進行簡單整理一下,以問答的形式供大家參考,如果你是個macOS老手,歡迎對本文指出不足或?qū)δ扯芜M行補充完善,共同學(xué)習(xí),如果你是新手,希望能幫你解決一些問題。

  1. NSViewController中,如何設(shè)置NSView的背景色?
    答: 主要分兩種情況,在2的情況下,注意語句的順序不能錯

      // 1. 如果是Controller的View
        view.layer?.backgroundColor = NSColor.red.cgColor
     // 2. 如果是添加到Controller的其他NSView
          view.addSubview(yourView)
          yourView.layer?.backgroundColor = NSColor.red.cgColor
    
  2. 如何讓NSImageView支持Gif圖片?
    答: 分代碼創(chuàng)建的NSImageView和在Storyboard中拖拽的NSImageView兩種情況

     // 1. 如果是代碼創(chuàng)建的NSImageView
          yourImageView.image =  NSImage(named: "xxx“) // xxx為你的gif圖片
          yourImageView.animates = true
     // 2. 如果是Storyboard中拖拽的,animates默認值就是true,可以直接設(shè)置圖片屬性
          yourImageView.image =  NSImage(named: "xxx“) // xxx為你的gif圖片
    
  3. 如何實現(xiàn)像iOSUITableView分組樣式?
    答: 相比iOS,在macOS中NSTableView沒有分組功能,而是提供了分欄(列)的功能,如果希望實現(xiàn)UITableView的分組功能,并且每組都有HeaderViewFooterView,可以使用NSCollectionView。

  4. 怎么給一個NSButton添加左鍵點擊彈出菜單?
    答: 在NSButton的點擊事件中,添加如下代碼

     NSMenu.popUpContextMenu(yourMenu, with: NSApp.currentEvent, for:yourButton )
    
  5. 如何用代碼設(shè)置一個NSView右鍵菜單?
    答: 在macOS中,NSView有一個menu的屬性,給這個屬性進行賦值,即可實現(xiàn)右鍵彈出菜單

    yourView.menu = yourMenu
    
  6. 如何讓NSImageView支持圖片拖拽?
    答:設(shè)置NSImageView的isEditable 屬性為true

     yourImageView.isEditable = true
    
  7. 在不使用第三方庫的情況下,如何快速使用代碼添加約束?
    答: 在macOS中,提供了NSLayoutAnchor幫助我們快速手動添加控件的約束,實現(xiàn)自動布局效果

     // 設(shè)置imageView的左邊相對view的左邊偏移10個單位的距離
     imageView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10)
     // 設(shè)置imageView的頂部與view的頂部對齊
     imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0)
     // 設(shè)置imageView的寬度約束等于150
     imageView.widthAnchor.constraint(equalToConstant: 150)
    // 設(shè)置imageView的高度約束等于200
     imageView.heightAnchor.constraint(equalToConstant: 200)
    
  8. 如何手動切換NSWindow全屏模式
    答: 調(diào)用NSWindow的toggleFullScreen方法,如果當前為全屏模式,則退出全屏,否則將進入全屏模式

    // 切換全屏
     yourWindow.toggleFullScreen(yourView)
    
  9. 如何設(shè)置點擊NSWindow內(nèi)容可以拖動窗口?
    答: 設(shè)置isMovableByWindowBackground = true即可

      // 設(shè)置點擊內(nèi)容支持鼠標拖動窗口
      yourWindow.isMovableByWindowBackground = true
    
  10. 如何隱藏App在Dock欄上的圖標?
    答: 在macOS中,設(shè)置App的UI類型為agent,系統(tǒng)就會隱藏App在Dock欄上的圖標,實現(xiàn)方法是需要在info.plist文件中添加如下選項即可

    設(shè)置隱藏Dock的圖標

  11. 如何給App在Dock上添加右鍵菜單選項?
    答: 在AppDelegate中實現(xiàn)applicationDockMenu(_ sender: NSApplication) -> NSMenu?方法即可

     // 在Dock欄添加右鍵菜單選項
     func applicationDockMenu(_ sender: NSApplication) -> NSMenu? {
       let viewMenu = NSMenu(title: "ViewMenu")
       let viewItem = NSMenuItem(title: "first ", action:#selector(showAlert), keyEquivalent: "p")
       viewMenu.addItem(viewItem)
       return viewMenu
    }
    
  12. 為什么NSAlert 設(shè)置控件frame時不起作用?
    答: 在對NSAlert中的系統(tǒng)部分控件進行重新布局時,在新設(shè)置的控件的frame時,需要提前調(diào)用NSAlert 的layout方法

  13. 為什么我的App關(guān)閉窗口再點擊Dock上的圖標,無法重新打開?
    答: 默認情況下,關(guān)閉了App的主窗口,再次點擊Dock欄圖標時,系統(tǒng)不會響應(yīng)的。如果需要再次顯示窗口,需要實現(xiàn)applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool方法

     func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
        if flag == false {
            yourMainWindow.makeKeyAndOrderFront(nil)
            return true
        }
        return !flag    
    }
    
  14. 為什么在NSDocument中,print打印信息時會報錯?
    答: 在基于NSDocument的應(yīng)用中,默認提了打印函數(shù)print用來實現(xiàn)將文檔內(nèi)容打印到硬件設(shè)備(打印機,如果需要打印輸出調(diào)試信息,需要顯示的調(diào)用print方法

     // 在NSDocument類中,顯式的調(diào)用打印輸出
       Swift.print("your message")
    
  15. 如何去除NSTextField輸入時的藍色邊框?
    答: 設(shè)置 focusRingType 屬性為None即可,這個屬性也支持在Storyoard中設(shè)置

      // 關(guān)閉輸入控件的藍色選中邊框
        textField.focusRingType = .none
    

    在Storyboard中設(shè)置

    關(guān)閉輸入控件的藍色邊框效果

  16. 怎么修改NSMenuItem系統(tǒng)默認的組合快捷鍵?
    答: 通過設(shè)置NSMenuItem的keyEquivalentModifierMask屬性,可以系統(tǒng)給定的枚舉值來生成組合的快捷鍵

       // 設(shè)置菜單項目的快捷鍵為 option + p
      let viewItem = NSMenuItem(title: "first ", action: #selector(showAlert(_:)), keyEquivalent: "p")
      viewItem.keyEquivalentModifierMask = .option
    
  17. 如何實現(xiàn)NSView動畫效果?
    答:關(guān)于動畫的方式有很多,通常我們用的較多的是類似UIView animate的效果,可以通過 NSAnimationContext.runAnimationGroup方法來在macOS中實現(xiàn)動畫效果

     NSAnimationContext.runAnimationGroup({ (context) in
            context.duration = 2    // 設(shè)置動畫執(zhí)行需要的時間
            view.animator().frame = NSMakeRect(100, 100, 100, 100)  // 設(shè)置frame動畫新值
        }) {
            // 動畫執(zhí)行完畢
            // insert your code
            view.animator().alphaValue = 1  
        }
    
  18. 如何設(shè)置系統(tǒng)狀態(tài)欄上的App icon圖標適應(yīng)狀態(tài)欄背景色?
    答: 很多App都在系統(tǒng)狀態(tài)欄上提供欄一個icon圖標供用戶使用,需求中常常是要求根據(jù)系統(tǒng)狀態(tài)欄顏色使用不同icon來進行適配,其實我們只需要設(shè)置imageisTemplate屬性為true即可

     ......
     let statusItem = NSStatusItem()         
     let yourImage = NSImage(named: "")   // 通常這個圖片最好只有是黑色和白色兩種組成
     yourImage?.isTemplate = true   // 設(shè)置為true ,會自動適配狀態(tài)背景色
     statusItem.image = yourImage
     ......
    
    

尾聲

最近錄制課程視頻才體會到,很多事情看著簡單,但真正做起來真不是想象中那個樣子,會有很多的意料之外的情況,在最開始錄制的階段,一段三分鐘左右的簡單內(nèi)容,我常常修要反復(fù)錄制四遍,五遍。。雖然很多東西自己心里清楚,但是對著屏幕進行講解時,和平時狀態(tài)不一樣,很容易出錯,而且也會經(jīng)常有不知道下一步要說什么,但在錄制的過程中,也對過往知識進行了復(fù)習(xí),溫故而知新,心有欣欣焉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容