macOS 开发基础教程 - 视频剧透
起因
近几个月来,在简书上经常有朋友会对关于macOS 开发
方面技术提出一些问题,在回复问题的过程,一个明显的感觉是越来越多
的人喜欢macOS开发
,但关于这方面的资料,网络上还是比较少
,因此萌生了录制一套基础入门课程视频
,采用Swift4.0
作为开发语言,预计这个月底(8月31日)
前可以完成录制,大概有一百二十个课时
左右,主要介绍基础控件
的常规应用,主要希望对从iOSer
转macOS开发
的朋友有所帮助,课程预发平台选则了网易云课堂,课程的价格每课时大概1.00RMB
(第一次录制课程,才感觉原来视频讲解
也挺不容易呀,但限于水平与经验
,对视频中的问题
到时候还请大家多多指正
)
部分目录
录制课程表1录制课程表2
课程链接
干货摘录
无技术,不文章
。下面对课程
中的部分内容
进行简单整理
一下,以问答的形式
供大家参考,如果你是个macOS老手
,欢迎对本文指出不足
或对某段进行补充完善
,共同学习,如果你是新手
,希望能帮你
解决一些问题
。
-
在NSViewController中,如何设置
NSView的背景色
?
答: 主要分两种情况,在2的情况下,注意语句的顺序
不能错// 1. 如果是Controller的View view.layer?.backgroundColor = NSColor.red.cgColor // 2. 如果是添加到Controller的其他NSView view.addSubview(yourView) yourView.layer?.backgroundColor = NSColor.red.cgColor
-
如何让NSImageView支持
Gif
图片?
答: 分代码创建
的NSImageView和在Storyboard中拖拽
的NSImageView两种情况// 1. 如果是代码创建的NSImageView yourImageView.image = NSImage(named: "xxx“) // xxx为你的gif图片 yourImageView.animates = true // 2. 如果是Storyboard中拖拽的,animates默认值就是true,可以直接设置图片属性 yourImageView.image = NSImage(named: "xxx“) // xxx为你的gif图片
-
如何实现
像iOS
中UITableView的分组样式
?
答: 相比iOS,在macOS中NSTableView
没有分组
功能,而是提供了分栏(列)
的功能,如果希望实现UITableView的分组功能
,并且每组都有HeaderView
和FooterView
,可以使用NSCollectionView
。 -
怎么给一个NSButton添加
左键点击
弹出菜单?
答: 在NSButton的点击事件中,添加如下代码NSMenu.popUpContextMenu(yourMenu, with: NSApp.currentEvent, for:yourButton )
-
如何用
代码设置
一个NSView的右键菜单
?
答: 在macOS中,NSView有一个menu的属性,给这个属性进行赋值,即可实现右键弹出菜单yourView.menu = yourMenu
-
如何让NSImageView支持图片
拖拽
?
答:设置NSImageView的isEditable
属性为trueyourImageView.isEditable = true
-
在不使用
第三方库
的情况下,如何快速使用代码
添加约束?
答: 在macOS中,提供了NSLayoutAnchor
帮助我们快速手动添加控件的约束
,实现自动布局
效果// 设置imageView的左边相对view的左边偏移10个单位的距离 imageView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10) // 设置imageView的顶部与view的顶部对齐 imageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0) // 设置imageView的宽度约束等于150 imageView.widthAnchor.constraint(equalToConstant: 150) // 设置imageView的高度约束等于200 imageView.heightAnchor.constraint(equalToConstant: 200)
-
如何手动切换NSWindow的
全屏模式
?
答: 调用NSWindow的toggleFullScreen
方法,如果当前为全屏模式,则退出全屏
,否则将进入
全屏模式// 切换全屏 yourWindow.toggleFullScreen(yourView)
-
如何设置点击NSWindow内容可以拖动窗口?
答: 设置isMovableByWindowBackground = true
即可// 设置点击内容支持鼠标拖动窗口 yourWindow.isMovableByWindowBackground = true
-
如何隐藏App在Dock栏上的图标?
设置隐藏Dock的图标
答: 在macOS中,设置App的UI类型为agent
,系统就会隐藏
App在Dock栏上的图标
,实现方法是需要在info.plist
文件中添加如下选项即可
-
如何给App在Dock上添加右键菜单选项?
答: 在AppDelegate中实现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 }
-
为什么NSAlert 设置控件
frame
时不起作用?
答: 在对NSAlert中的系统部分控件进行重新布局
时,在新设置的控件的frame
时,需要提前调用NSAlert 的layout
方法 -
为什么我的App
关闭窗口
再点击Dock上的图标,无法重新打开
?
答: 默认情况下,关闭了App的主窗口
,再次点击Dock栏图标
时,系统不会响应
的。如果需要再次显示窗口
,需要实现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打印信息时会报错?
答: 在基于NSDocument
的应用中,默认提了打印函数print
用来实现将文档内容打印到硬件设备(打印机
,如果需要打印输出调试信息,需要显示的调用
print方法// 在NSDocument类中,显式的调用打印输出 Swift.print("your message")
-
如何去除NSTextField输入时的蓝色边框?
答: 设置focusRingType
属性为None即可,这个属性也支持在Storyoard
中设置// 关闭输入控件的蓝色选中边框 textField.focusRingType = .none
关闭输入控件的蓝色边框效果在Storyboard中设置
-
怎么修改NSMenuItem系统默认的
组合快捷键
?
答: 通过设置NSMenuItem的keyEquivalentModifierMask
属性,可以系统给定的枚举值
来生成组合的快捷键
// 设置菜单项目的快捷键为 option + p let viewItem = NSMenuItem(title: "first ", action: #selector(showAlert(_:)), keyEquivalent: "p") viewItem.keyEquivalentModifierMask = .option
-
如何实现NSView的
动画效果
?
答:关于动画的方式
有很多,通常我们用的较多的是类似UIView animate
的效果,可以通过NSAnimationContext.runAnimationGroup
方法来在macOS
中实现动画效果NSAnimationContext.runAnimationGroup({ (context) in context.duration = 2 // 设置动画执行需要的时间 view.animator().frame = NSMakeRect(100, 100, 100, 100) // 设置frame动画新值 }) { // 动画执行完毕 // insert your code view.animator().alphaValue = 1 }
-
如何设置系统状态栏上的
App icon
图标适应状态栏背景色
?
答: 很多App都在系统状态栏
上提供栏一个icon图标
供用户使用,需求中常常是要求
根据系统状态栏
的颜色
使用不同icon来进行适配,其实我们只需要设置image
的isTemplate
属性为true
即可...... let statusItem = NSStatusItem() let yourImage = NSImage(named: "") // 通常这个图片最好只有是黑色和白色两种组成 yourImage?.isTemplate = true // 设置为true ,会自动适配状态背景色 statusItem.image = yourImage ......
尾声
最近
录制课程视频
才体会到,很多事情看着简单
,但真正做起来真不是想象中那个样子
,会有很多的意料之外
的情况,在最开始
录制的阶段,一段三分钟左右
的简单内容,我常常修要反复录制四遍,五遍。。
虽然很多东西自己心里清楚
,但是对着屏幕进行讲解
时,和平时状态不一样,很容易出错
,而且也会经常有不知道
下一步要说什么
,但在录制的过程中,也对过往知识进行了复习
,温故而知新,心有欣欣焉