我们使用 Catalyst 为 MacOS 构建了我们的 iPad 应用程序,但我无法弄清楚如何让两指触控板滚动手势在自定义 UIView 中工作。标准的 UIKit 组件(例如 UITableView)使用标准的两指触控板滚动手势滚动。但是如何在自定义 UIView 中处理它们?
自定义 UIViewViewController 添加了一个典型的 UIPanGestureRecognizer,它在按下触控板并移动手指时调用手势处理程序方法。但它不会只用两个手指刷触控板来调用处理程序。
如何在用户调整窗口大小时收到通知:
NotificationCenter.default.addObserver(self, selector: #selector(function), name: NSWindowDidResizeNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)
在 Mac Catalyst 中不可用
我已经看到一些 Catalyst 应用程序向 NSToolbar 添加了一个搜索栏,我想知道我如何才能做到这一点。我是否必须导入 AppKit/Cocoa 才能获得 NSSearchField 和实际的 NSToolbar?或者我没有看到 UISearchBars 有什么方法吗?任何帮助都会很棒,谢谢。
我曾尝试导入 AppKit 和 Cocoa(使用捆绑加载器),但我认为我做得不对。如果有人有关于如何执行此操作的可靠指南,请链接它。
我还尝试使用 UISearchBar 的自定义视图创建 UIBarButtonItem,它最终不会呈现任何内容。(可以在下面找到)
这是在 itemIdentifier.rawValue 的 switch case 中找到的(在工具栏 itemForIdentifier 函数中)
let search = UISearchBar()
search.sizeToFit()
let button = UIBarButtonItem(customView: search)
button.width = 100
let toolbarItem = NSToolbarItem(itemIdentifier: itemIdentifier, barButtonItem: button)
toolbarItem.isBordered = true
toolbarItem.isEnabled = true
return toolbarItem
Run Code Online (Sandbox Code Playgroud) 我使用Xcode 11.1创建了一个新的iOS单页应用程序(包括SwiftUI),并启用了Mac Catalyst。在Mac(当然是macOS 10.15)上运行新的Project之后,在窗口上点击一次后,出现以下错误。
2019-10-18 12:59:48.479186+0200 test[3130:122148] Metal API Validation Enabled
2019-10-18 12:59:50.960734+0200 test[3130:122148] [AXRuntimeCommon] Unknown client: test
2019-10-18 12:59:50.962261+0200 test[3130:122148] [AXRuntimeCommon] This class 'SwiftUI.AccessibilityNode' is not a known serializable element and returning it as an accessibility element may lead to crashes
2019-10-18 12:59:51.313 test[3130:122148] **************_____________**************AXError: AVPlayerView is not a kind of NSView
1 AccessibilityBundles 0x00007fff42ee3b69 _AXBValidationCheckIsKindOfClass + 201
2019-10-18 12:59:51.386 test[3130:122148] **************_____________**************AXError: MKStarRatingView is not a kind of NSView
1 AccessibilityBundles 0x00007fff42ee3b69 _AXBValidationCheckIsKindOfClass + 201
Run Code Online (Sandbox Code Playgroud)
注意:我还删除了沙盒功能,否则我收到有关无法编写的错误 ApplicationAccessibilityEnabled
有人知道如何解决吗?
我有一个带有标准 UISearchBar 的标准 UISearchController。搜索栏显示在导航栏中。在 iOS/iPadOS 上一切正常。但是搜索栏在 macOS 下的行为有所不同。
在 iOS 下,当您点击搜索栏时,该图标仅在搜索栏中出现文本时才会出现。没有文字时不显示。如果您点击该图标,则会删除搜索栏中的文本。到目前为止一切都很好。
但是在 macOS 下,无论搜索栏是否有文字,图标都会立即出现并保持可见。更糟糕的是,当您单击该图标时,不仅会从搜索栏中删除文本,还会取消整个搜索控制器。就像单击了取消按钮一样。实际上,该UISearchBarDelegate方法searchBarCancelButtonClicked是在单击图标时调用的(但在 iOS 中不会)。
作为参考,这里是viewDidLoad演示问题的简单视图控制器的方法中的相关代码:
navigationItem.rightBarButtonItem = editButtonItem
let results = UITableViewController(style: .plain)
let sc = UISearchController(searchResultsController: results)
sc.delegate = self
sc.obscuresBackgroundDuringPresentation = true
sc.automaticallyShowsCancelButton = true
sc.hidesNavigationBarDuringPresentation = true // Setting to false causes other problems unrelated to this question
sc.searchBar.delegate = self
navigationItem.searchController = sc
Run Code Online (Sandbox Code Playgroud)
在真正的 macOS 应用程序(例如标准邮件应用程序)上,搜索栏的行为与UISearchBariOS 上的一样,而不是UISearchBarmacOS 上的。
这是 Mac Catalyst 中的错误,还是我遗漏了某些属性或委托,可以让 UISearchBar 及其图标在 …
我正在使用我的催化剂应用程序中的上下文菜单
let interaction = UIContextMenuInteraction(delegate: self)
editButton.addInteraction(interaction)
Run Code Online (Sandbox Code Playgroud)
这在 Mac 上工作正常,并且当用户使用鼠标右键单击时会打开菜单。
另一方面,在某些情况下,我需要在普通按钮上打开相同的菜单,尤其是当用户在 iPad 上使用该应用程序时。有没有办法在普通按钮单击/点击事件上打开相同的上下文菜单?
背景
我正在尝试构建一个使用本机 IKEv2 实现连接到 VPN 的应用程序。该应用程序应为 iOS 构建,但也应使用 Catalyst 平台在 macOS 上运行。
情况
在 iOS/macOS 中使用本机 IKEv2 实现连接到 VPN 时 - 要使用用户名和密码身份验证,应用程序必须将持久的钥匙串引用传递给包含密码的钥匙串项目。(参考)
问题
在 iOS 上它工作得很好,但是在 Catalyst 平台上启动 VPN 连接时,VPN 服务无法使用给定的持久引用检索密码。控制台打印:
[] (null): Failed to copy content, SecKeychainItemCopyContent returned The contents of this item cannot be retrieved.
Run Code Online (Sandbox Code Playgroud)
钥匙串项存储在钥匙串中,持久引用不是nil,但由于某种原因,操作系统的 VPN 服务无法检索密码。
如果我尝试使用相同的持久引用检索密码 - 一切都按预期工作,并检索密码。
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrPersistentReference as String: persistentRef,
kSecReturnData as String: true
]
var item: CFTypeRef?
let …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中有一个显示矩形卡片列表的布局 - 每个卡片都应该可以点击(一次)以显示一组操作按钮和更多信息等。
我已经实现了这一点,.onTapGesture()并且我还.contentShape(Rectangle()强制执行了可点击区域。然而,虽然我的实现适用于触摸屏界面,但当我将它与 iPadOS 鼠标支持一起使用时,以及在 Catalyst 上,我看到了一些非常意外的行为。
我在下面制作了一个最小的可重现示例,您可以复制该示例以重现问题。
使用鼠标/触控板输入时出现的问题:
如果您正在运行示例代码,您应该能够通过反复移动鼠标并尝试单击来查看问题。除非您在同一位置多次单击,否则它不起作用。
什么按预期工作:
我用来重现这个问题的代码(每次记录点击手势时都有一个计数器来计数):
struct WidgetCompactTaskItemView: View {
let title: String
let description: String
var body: some View {
HStack {
Rectangle()
.fill(Color.purple)
.frame(maxWidth: 14, maxHeight: .infinity)
VStack(alignment: .leading) {
Text(title).font(.system(size: 14, weight: .bold, design: .rounded))
Text(description).font(.system(.footnote, design: .rounded))
.frame(maxHeight: .infinity)
.fixedSize(horizontal: false, vertical: true)
.lineLimit(1)
.padding(.vertical, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将录制的音频(从AVAudioEngine inputNode)同步到录制过程中正在播放的音频文件。结果应该类似于多轨录音,其中每个后续新音轨都与录制时正在播放的先前音轨同步。
因为sampleTime在不同之间AVAudioEngine的输出和输入节点,我使用hostTime确定偏移原始音频和输入缓冲器。
在 iOS 上,我会假设我必须使用AVAudioSession的各种延迟属性 ( inputLatency, outputLatency, ioBufferDuration) 来协调轨道以及主机时间偏移,但我还没有想出使它们工作的神奇组合。这同样适用于各种AVAudioEngine和Node属性,如latency和presentationLatency.
在 macOS 上,AVAudioSession不存在(在 Catalyst 之外),这意味着我无法访问这些数字。同时,latency/presentationLatency属性在大多数情况下会AVAudioNodes报告0.0。在 macOS 上,我确实可以访问AudioObjectGetPropertyData并且可以向系统询问kAudioDevicePropertyLatency, kAudioDevicePropertyBufferSize、kAudioDevicePropertySafetyOffset等,但是对于协调所有这些的公式又有点不知所措。
我在https://github.com/jnpdx/AudioEngineLoopbackLatencyTest上有一个示例项目,它运行一个简单的环回测试(在 macOS、iOS 或 Mac Catalyst 上)并显示结果。在我的 Mac 上,轨道之间的偏移量约为 720 个样本。在其他人的 Mac 上,我看到多达 1500 个样本偏移。
在我的 iPhone 上,我可以通过使用AVAudioSession's outputLatency+使它接近完美的样本 …
我的 macCatalyst 应用程序最近发生了一些随机崩溃。到处寻找但没有找到任何好的线索。我的猜测是,这与内存或屏幕上可见的视图太多有关。我没有得到很好的堆栈跟踪,但这就是日志中显示的内容:
-[MTLDebugDevice notifyExternalReferencesNonZeroOnDealloc:]:2951: failed assertion `The following Metal object is being destroyed while still required to be alive by the command buffer 0x7f8cd811c600 (label: <no label set>):
<MTLToolsObject: 0x7f8b0f9e3d60> -> <MTLIGAccelTexture: 0x7f8cd8566a00>
label = CAMetalLayer Drawable
textureType = MTLTextureType2D
pixelFormat = MTLPixelFormatBGRA8Unorm_sRGB
width = 772
height = 1372
depth = 1
arrayLength = 1
mipmapLevelCount = 1
sampleCount = 1
cpuCacheMode = MTLCPUCacheModeDefaultCache
storageMode = MTLStorageModeManaged
hazardTrackingMode = MTLHazardTrackingModeTracked
resourceOptions = MTLResourceCPUCacheModeDefaultCache MTLResourceStorageModeManaged MTLResourceHazardTrackingModeTracked
usage = MTLTextureUsageShaderRead MTLTextureUsageShaderWrite …Run Code Online (Sandbox Code Playgroud) mac-catalyst ×10
swift ×7
ios ×4
macos ×4
swiftui ×2
core-audio ×1
ipados ×1
keychain ×1
nevpnmanager ×1
sigabrt ×1
uikitformac ×1
uisearchbar ×1
uiwindow ×1