图片来自网络
起因
近几个月来,在简书上经常有朋友会对关于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栏上的图标?
答: 在macOS中,设置App的UI类型为agent,系统就会隐藏App在Dock栏上的图标,实现方法是需要在info.plist文件中添加如下选项即可
设置隐藏Dock的图标
-
如何给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 ......
尾声
最近
录制课程视频才体会到,很多事情看着简单,但真正做起来真不是想象中那个样子,会有很多的意料之外的情况,在最开始录制的阶段,一段三分钟左右的简单内容,我常常修要反复录制四遍,五遍。。虽然很多东西自己心里清楚,但是对着屏幕进行讲解时,和平时状态不一样,很容易出错,而且也会经常有不知道下一步要说什么,但在录制的过程中,也对过往知识进行了复习,温故而知新,心有欣欣焉











网友评论