Base on macOS 10.15, Xcode 11.7. 1. 等效 暂且不看对外部视图的影响的话,withAnimation() 和 AnyTransition.animation() 对于其修饰的视图其实是相同效果的不同写法。 Button("show/hide"){ withAnimation { self.show.toggle() } } if show { Text("hello") .transition(.scale) } 等效于: Button("show/hide"){ self…
SwiftUI - 奇怪的 NSColorPanel
Base on macOS 10.15, Xcode 11.7. 1、首先,NSColorPanel 有一个静态“单例”对象:NSColorPanel.shared。我们可以直接使用这个静态对象。这个静态对象也可以被多个组件共享,但要注意如果共享的话,获得的 color 值也是共享的。 2、但 NSColorPanel 又不纯粹的“单例”模式,它允许我们手动新建 NSColorPanel 对象,而不使用 shared 静态对象。 (手动新建对象之前,最好调用一次 NSColorP…
SwiftUI Bug - PlainButtonStyle Button 触发次数异常
Base on macOS 10.15, Xcode 11.7. 异常描述 1、当程序运行在非活跃状态时,且 NSWindow 为默认样式(可关闭、缩放、有标题栏等)。 此时如果点击 NSWindow 中的按钮,一般情况下会将该 NSWindow 变成活跃状态,同时触发按钮的 action 一次。但对于 PlainButtonStyle 样式的按钮,却无法触发其事件函数! 2、当程序运行在非活跃状态时,且 NSWindow 为空样式(styleMask = []),且允许拖动(isMovableByWind…
Countdown - A countdown task App on macOS 🎉 正式发布 🎉
这两个月初学 SwiftUI,做了一个练手的项目:Countdown。 这是一个运行在 macOS 上的倒计时程序,仿照着 Moment 和 Countdown Timer Plus 这两个程序做的。你可以在列表中管理倒计时任务,可以将倒计时“便签”显示在桌面。 🎉 下载链接 🎉
SwiftUI Bug - NSWindow.setContentSize 获取到错误 size
发现这个问题的起因是我想实现一个 macOS App 的设置窗口,窗口大小自动随内部视图变化尺寸,并且是能平滑地有动画效果的变换尺寸。期望效果如下图所示: 这张 GIF 中的窗口来自 Preferences 。它的底层实现是利用点击 NSToolbar 上的 NSToolbarItem,来改变窗口内的视图,并根据新视图的大小设置窗口尺寸( NSWindow.animator().setFrame() )。但是这些都是基于 AppKit 中的类与函数,我希望能够简单的利用 SwiftUI 来实现类似的效果。 …
SwfitUI 进阶 - View 与 NSView 互相转换
开发环境: macOS 10.15.5 Xcode 11.7 我其实挺喜欢 SwiftUI 的,首先 Swift 语言代码简练,SwfitUI 可以直接用代码进行布局且方便预览,很符合现代开发的习惯。而不是像 Objective-C 那样,语句繁复,还要用 Xib 这种可视化工具进行拖拽布局。 但不幸的是,由于 SwfitUI 是2019年才正式发布的,所以还有很多欠缺的功能,以及莫名其妙的 Bug。为了弥补这些不足,我们可以将成熟的 AppKit 中的各种 NSView 控件包装成 SwfitUI.Vie…
SwiftUI 进阶 - 推送消息到通知中心
注意:不管程序是 foreground running, background running 还是 not running,只要在通知中心添加了“推送请求”,那么通知中心就可以到点触发该通知的推送。 1、本地通知 直接上代码吧 import SwiftUI import UserNotifications struct TestNotification: View { var body: some View { VStack { Text("Hello, World!") Button("推送通知"){ …
SwiftUI Bug - onHover() 导致内存泄漏(View 结构体实例不被释放)
环境: macOS 10.15.5 Xcode 11.7 现象: 如果对一个 View 视图使用了 onHover() 修饰器,那么会导致该视图,乃至包裹该视图的最外层视图都不会被释放。 这应该是 SwiftUI 的一个 Bug,但是什么时候才能被修复啊 =。=# SwiftUI 也太多 Bug 了。。。文档又差。 欸 示例代码: // // OnHoverLeak.swift // Countdown // // Created by funway on 2020/10/2. // Copyright ©…
SwiftUI 进阶 — 计时器 Timer 以及 如何在 View 中监听 NSWindow 事件
Base on macOS 10.15, Xcode 11.7. 一、计时器 Timer 与 TimerPublisher 1.1 Timer 与 TimerPublisher 的基本用法 如果我们想实现一个简单的程序用来显示当前系统时间,那么就必须得用到 Timer 计时器,来定时更新 View 中的 @State 属性。网上有很多关于 SwiftUI 计时器的用法介绍,但却都只说最最基础的用法,而忽略了可能存在的 Bug。下面我们来通过一个简单的例子来展示一下 Timer 与 TimerPublishe…
SQLite.swift 的类型扩展 — 存储 UUID 的二进制值
首先要知道 SQLite 只支持如下五种存储类型: 存储类 描述 NULL 值是一个 NULL 值。 INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 TEXT 值是一个文本字符串,使用数据库编码格式(默认为 UTF-8)存储。 BLOB 值是一个二进制数据,完全根据它的输入存储。 SQLite.swift 将这五种存储类型与 Swift 数据类型做了一一对应: Swift Type SQLit…