Yang Blog

「人生是稿子,脚印有如文字」

NSTextField 宽高自适应

NSTextField 宽高根据字体和内容自动调整尺寸

需求:在修改 NSTextField 的内容和字体的时候,NSTextField 的宽高自适应。开始的想法是计算它的文本宽高,然后根据计算的结果来设置 frame,这个思维习惯是从 iOS 开发来的,用的方法是 NSString 的 ,这个计算出来的结果会明显偏小,导致文本内容显示不全,不符合预期。 1 2 3 4 func boundingRect(with size: NSSize, ...

macOS 显示主窗口

macOS 多窗口程序打开主窗口

最近提交一个新的 mac 应用,程序是多窗口的,被拒了好几次,根据苹果返回的被拒原因,一直改了几次,都没改到点上。最后才意识到问题是这样的,用户打开了多个窗口,然后关闭了主窗口,需要能够返回或者打开主窗口,要不然不符合苹果的软件设计,仔细想想确实是这样的,只是有时候忽略了这个地方。 我截取了一段被拒的原因 Design Preamble The user interface ...

NSTableView 移除 Column

NSTableView 代码新建和删除列 Column

NSTableView 通过 view-based 创建,需求中列数是动态改变的,非静态的,需要通过 NSTableView 的 addTableColumn 方法手动添加。 在添加列前,先通过 removeTableColumn 移除所有的列,在移除过程中,出现了崩溃的问题,崩溃的原因如下。 NSTableCellView 和 NSTableRowView 的布局约束出现了问题。 U...

macOS SwiftUI 偏好设置

macOS 中快捷键和点击显示 SwiftUI 偏好设置两种方式

在 SwiftUI 中,可以通过新建一个 SwiftUI 文件来定义APP的入口,SwiftUI 有提供一个 Settings 的 View,可以直接导航至APP 的偏好设置,PreferencesView 是自定义的偏好设置的 SwiftUI 的 View,这个时候通过快捷键 “⌘,” 便可以进入偏好设置页面,使用这个 Settings 确实可以提供一些便利,但是也会出现一些意想不到的问...

NSTextField 快捷键

NSTextField 复制、粘贴、剪切、撤回快捷键

在 macOS 中,在 APP 中使用 ⌘C,⌘V,⌘Z,⌘X 这些基础的快捷键,这是因为菜单栏的“编辑”菜单中实现了相应的功能,但有的时候 APP 没有菜单栏,比如 menu bar 类型的APP,并没有常见的菜单栏,在开发的时候就删除了,而且一不小心还发现不了 NSTextField 的快捷功能消失了。 这种情况下 NSTextField 输入框的快捷键功能就会消失,通过添加以下...

旋转菜单栏的 NSStatusItem

NSStatusItem 设置旋转动画

NSStatusItem 有个 button 属性,可以考虑在这个 button 上实现想要的效果。 可以获取到这个 button 按钮属性 然后设置 CABasicAnimation 动画,时长,重复次数,以及旋转角度的范围 设置 button.layer 的 position 和 锚点 anchorPoint,最后 layer 加上动画 实现过程如下:...

SwiftUI-多个按钮等宽布局

SwiftUI 中多个 Button 水平等分布局

SwiftUI 中 Button 会根据其内容自动适应大小和点击范围,这样导致有时需要水平等分布局的时候,文字长度不一样,导致按钮大小不一样。 只是单纯的设置 frame 并不能像想象中解决问题,除非使用其他的 View 自定义按钮。 使用 ButtonStyle 来封装与按钮样式相关的内容。 指定 .frame(maxWidth: .infinity) 让这个按钮尽可能占据整个宽度 ...

macOS 获取当前活动的应用程序

监听当前活动的应用程序,获取图标和名称

之前有这么一个需求: 监听剪贴板的变化,记录复制的历史记录,需要知道剪贴板的复制来源,保存来源APP的名字和图标。 macOS 有提供相应的 API,NSWorkspace 获取 icon 的 NSImage -> tiffRepresentation 方法转为 Data -> 使用 NSBitmapImageRep 可以转为 png 和 jpeg 等格式,只有 .jpeg...

NSImage 平均色

获取 NSImage 图片的平均色

之前有这么一个需求: 需要获取到当前 macOS 系统活跃的应用程序,保存应用程序的相关属性到数据库中。当展示监听记录的时候,需要显示应用程序的 APP icon,列表的 cell 背景色为 APP icon 的平均色,以颜色来区分记录。 简单实现了一下,使用 CIFilter 的 “CIAreaAverage”,可以获取到平均色,但是获取到的颜色还是有点不是很满意,网上也没找到其他的解...

macOS 删除 UserDefaults 数据

删除 macOS 中使用 UserDefaults 保存的数据

UserDefaults 是保存应用首选项,设置相关,简单数据类型的工具,在开发过程中可能需要多次删除或重置它。 在 iOS 中,如果想删除应用程序 使用 UserDefaults 保存的相关设置,只需删除应用程序即可。 但 macOS 和 Catalyst 应用程序并非如此。 要在 macOS/Catalyst 上删除 UserDefaults 保存的数据,需要 default 命令。...