起因
近幾個(gè)月來(lái)偏塞,在簡(jiǎn)書上經(jīng)常有朋友會(huì)對(duì)關(guān)于macOS 開發(fā)
方面技術(shù)提出一些問題利术,在回復(fù)問題的過程,一個(gè)明顯的感覺是越來(lái)越多
的人喜歡macOS開發(fā)
例获,但關(guān)于這方面的資料汉额,網(wǎng)絡(luò)上還是比較少
,因此萌生了錄制一套基礎(chǔ)入門課程視頻
榨汤,采用Swift4.0
作為開發(fā)語(yǔ)言蠕搜,預(yù)計(jì)這個(gè)月底(8月31日)
前可以完成錄制,大概有一百二十個(gè)課時(shí)
左右收壕,主要介紹基礎(chǔ)控件
的常規(guī)應(yīng)用妓灌,主要希望對(duì)從iOSer
轉(zhuǎn)macOS開發(fā)
的朋友有所幫助,課程預(yù)發(fā)平臺(tái)選則了網(wǎng)易云課堂蜜宪,課程的價(jià)格每課時(shí)大概1.00RMB
(第一次錄制課程虫埂,才感覺原來(lái)視頻講解
也挺不容易呀,但限于水平與經(jīng)驗(yàn)
圃验,對(duì)視頻中的問題
到時(shí)候還請(qǐng)大家多多指正
)
部分目錄
課程鏈接
干貨摘錄
無(wú)技術(shù)告丢,不文章
。下面對(duì)課程
中的部分內(nèi)容
進(jìn)行簡(jiǎn)單整理
一下损谦,以問答的形式
供大家參考岖免,如果你是個(gè)macOS老手
,歡迎對(duì)本文指出不足
或?qū)δ扯芜M(jìn)行補(bǔ)充完善
照捡,共同學(xué)習(xí)颅湘,如果你是新手
,希望能幫你
解決一些問題
栗精。
-
在NSViewController中闯参,如何設(shè)置
NSView的背景色
?
答: 主要分兩種情況,在2的情況下悲立,注意語(yǔ)句的順序
不能錯(cuò)// 1. 如果是Controller的View view.layer?.backgroundColor = NSColor.red.cgColor // 2. 如果是添加到Controller的其他NSView view.addSubview(yourView) yourView.layer?.backgroundColor = NSColor.red.cgColor
-
如何讓NSImageView支持
Gif
圖片鹿寨?
答: 分代碼創(chuàng)建
的NSImageView和在Storyboard中拖拽
的NSImageView兩種情況// 1. 如果是代碼創(chuàng)建的NSImageView yourImageView.image = NSImage(named: "xxx“) // xxx為你的gif圖片 yourImageView.animates = true // 2. 如果是Storyboard中拖拽的,animates默認(rèn)值就是true薪夕,可以直接設(shè)置圖片屬性 yourImageView.image = NSImage(named: "xxx“) // xxx為你的gif圖片
如何實(shí)現(xiàn)
像iOS
中UITableView的分組樣式
脚草?
答: 相比iOS,在macOS中NSTableView
沒有分組
功能原献,而是提供了分欄(列)
的功能馏慨,如果希望實(shí)現(xiàn)UITableView的分組功能
埂淮,并且每組都有HeaderView
和FooterView
,可以使用NSCollectionView
写隶。-
怎么給一個(gè)NSButton添加
左鍵點(diǎn)擊
彈出菜單倔撞?
答: 在NSButton的點(diǎn)擊事件中,添加如下代碼NSMenu.popUpContextMenu(yourMenu, with: NSApp.currentEvent, for:yourButton )
-
如何用
代碼設(shè)置
一個(gè)NSView的右鍵菜單
慕趴?
答: 在macOS中痪蝇,NSView有一個(gè)menu的屬性,給這個(gè)屬性進(jìn)行賦值冕房,即可實(shí)現(xiàn)右鍵彈出菜單yourView.menu = yourMenu
-
如何讓NSImageView支持圖片
拖拽
霹俺?
答:設(shè)置NSImageView的isEditable
屬性為trueyourImageView.isEditable = true
-
在不使用
第三方庫(kù)
的情況下,如何快速使用代碼
添加約束毒费?
答: 在macOS中,提供了NSLayoutAnchor
幫助我們快速手動(dòng)添加控件的約束
丙唧,實(shí)現(xiàn)自動(dòng)布局
效果// 設(shè)置imageView的左邊相對(duì)view的左邊偏移10個(gè)單位的距離 imageView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10) // 設(shè)置imageView的頂部與view的頂部對(duì)齊 imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0) // 設(shè)置imageView的寬度約束等于150 imageView.widthAnchor.constraint(equalToConstant: 150) // 設(shè)置imageView的高度約束等于200 imageView.heightAnchor.constraint(equalToConstant: 200)
-
如何手動(dòng)切換NSWindow的
全屏模式
?
答: 調(diào)用NSWindow的toggleFullScreen
方法觅玻,如果當(dāng)前為全屏模式想际,則退出全屏
,否則將進(jìn)入
全屏模式// 切換全屏 yourWindow.toggleFullScreen(yourView)
-
如何設(shè)置點(diǎn)擊NSWindow內(nèi)容可以拖動(dòng)窗口溪厘?
答: 設(shè)置isMovableByWindowBackground = true
即可// 設(shè)置點(diǎn)擊內(nèi)容支持鼠標(biāo)拖動(dòng)窗口 yourWindow.isMovableByWindowBackground = true
-
如何隱藏App在Dock欄上的圖標(biāo)胡本?
答: 在macOS中,設(shè)置App的UI類型為agent
畸悬,系統(tǒng)就會(huì)隱藏
App在Dock欄上的圖標(biāo)
侧甫,實(shí)現(xiàn)方法是需要在info.plist
文件中添加如下選項(xiàng)即可
設(shè)置隱藏Dock的圖標(biāo) -
如何給App在Dock上添加右鍵菜單選項(xiàng)?
答: 在AppDelegate中實(shí)現(xiàn)applicationDockMenu(_ sender: NSApplication) -> NSMenu?
方法即可// 在Dock欄添加右鍵菜單選項(xiàng) 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 }
為什么NSAlert 設(shè)置控件
frame
時(shí)不起作用蹋宦?
答: 在對(duì)NSAlert中的系統(tǒng)部分控件進(jìn)行重新布局
時(shí)披粟,在新設(shè)置的控件的frame
時(shí),需要提前調(diào)用NSAlert 的layout
方法-
為什么我的App
關(guān)閉窗口
再點(diǎn)擊Dock上的圖標(biāo)冷冗,無(wú)法重新打開
守屉?
答: 默認(rèn)情況下,關(guān)閉了App的主窗口
蒿辙,再次點(diǎn)擊Dock欄圖標(biāo)
時(shí)拇泛,系統(tǒng)不會(huì)響應(yīng)
的。如果需要再次顯示窗口
思灌,需要實(shí)現(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 }
-
為什么在NSDocument中俺叭,print打印信息時(shí)會(huì)報(bào)錯(cuò)?
答: 在基于NSDocument
的應(yīng)用中泰偿,默認(rèn)提了打印函數(shù)print
用來(lái)實(shí)現(xiàn)將文檔內(nèi)容打印到硬件設(shè)備(打印機(jī)
熄守,如果需要打印輸出調(diào)試信息,需要顯示的調(diào)用
print方法// 在NSDocument類中,顯式的調(diào)用打印輸出 Swift.print("your message")
-
如何去除NSTextField輸入時(shí)的藍(lán)色邊框柠横?
答: 設(shè)置focusRingType
屬性為None即可,這個(gè)屬性也支持在Storyoard
中設(shè)置// 關(guān)閉輸入控件的藍(lán)色選中邊框 textField.focusRingType = .none
在Storyboard中設(shè)置
關(guān)閉輸入控件的藍(lán)色邊框效果 -
怎么修改NSMenuItem系統(tǒng)默認(rèn)的
組合快捷鍵
课兄?
答: 通過設(shè)置NSMenuItem的keyEquivalentModifierMask
屬性牍氛,可以系統(tǒng)給定的枚舉值
來(lái)生成組合的快捷鍵
// 設(shè)置菜單項(xiàng)目的快捷鍵為 option + p let viewItem = NSMenuItem(title: "first ", action: #selector(showAlert(_:)), keyEquivalent: "p") viewItem.keyEquivalentModifierMask = .option
-
如何實(shí)現(xiàn)NSView的
動(dòng)畫效果
?
答:關(guān)于動(dòng)畫的方式
有很多烟阐,通常我們用的較多的是類似UIView animate
的效果搬俊,可以通過NSAnimationContext.runAnimationGroup
方法來(lái)在macOS
中實(shí)現(xiàn)動(dòng)畫效果NSAnimationContext.runAnimationGroup({ (context) in context.duration = 2 // 設(shè)置動(dòng)畫執(zhí)行需要的時(shí)間 view.animator().frame = NSMakeRect(100, 100, 100, 100) // 設(shè)置frame動(dòng)畫新值 }) { // 動(dòng)畫執(zhí)行完畢 // insert your code view.animator().alphaValue = 1 }
-
如何設(shè)置系統(tǒng)狀態(tài)欄上的
App icon
圖標(biāo)適應(yīng)狀態(tài)欄背景色
?
答: 很多App都在系統(tǒng)狀態(tài)欄
上提供欄一個(gè)icon圖標(biāo)
供用戶使用蜒茄,需求中常常是要求
根據(jù)系統(tǒng)狀態(tài)欄
的顏色
使用不同icon來(lái)進(jìn)行適配唉擂,其實(shí)我們只需要設(shè)置image
的isTemplate
屬性為true
即可...... let statusItem = NSStatusItem() let yourImage = NSImage(named: "") // 通常這個(gè)圖片最好只有是黑色和白色兩種組成 yourImage?.isTemplate = true // 設(shè)置為true ,會(huì)自動(dòng)適配狀態(tài)背景色 statusItem.image = yourImage ......
尾聲
最近
錄制課程視頻
才體會(huì)到檀葛,很多事情看著簡(jiǎn)單
玩祟,但真正做起來(lái)真不是想象中那個(gè)樣子
,會(huì)有很多的意料之外
的情況屿聋,在最開始
錄制的階段空扎,一段三分鐘左右
的簡(jiǎn)單內(nèi)容,我常常修要反復(fù)錄制四遍润讥,五遍转锈。。
雖然很多東西自己心里清楚
楚殿,但是對(duì)著屏幕進(jìn)行講解
時(shí)撮慨,和平時(shí)狀態(tài)不一樣,很容易出錯(cuò)
脆粥,而且也會(huì)經(jīng)常有不知道
下一步要說什么
砌溺,但在錄制的過程中,也對(duì)過往知識(shí)進(jìn)行了復(fù)習(xí)
变隔,溫故而知新抚吠,心有欣欣焉