标签: mac-catalyst

如何在 MacOS Catalyst 应用程序中获取触控板/鼠标滚轮滚动事件?

我们使用 Catalyst 为 MacOS 构建了我们的 iPad 应用程序,但我无法弄清楚如何让两指触控板滚动手势在自定义 UIView 中工作。标准的 UIKit 组件(例如 UITableView)使用标准的两指触控板滚动手势滚动。但是如何在自定义 UIView 中处理它们?

自定义 UIViewViewController 添加了一个典型的 UIPanGestureRecognizer,它在按下触控板并移动手指时调用手势处理程序方法。但它不会只用两个手指刷触控板来调用处理程序。

macos ios mac-catalyst

7
推荐指数
2
解决办法
1071
查看次数

如何检测 Mac Catalyst 中的窗口大小调整?

如何在用户调整窗口大小时收到通知:

 NotificationCenter.default.addObserver(self, selector: #selector(function), name: NSWindowDidResizeNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

在 Mac Catalyst 中不可用

uiwindow swift mac-catalyst

7
推荐指数
1
解决办法
1416
查看次数

如何在 Catalyst 应用程序中将搜索栏放入 NSToolbar?

我已经看到一些 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)

macos swift uikitformac mac-catalyst

7
推荐指数
1
解决办法
1800
查看次数

催化剂“ SwiftUI.AccessibilityNode”不是已知的可序列化元素

我使用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

有人知道如何解决吗?

accessibility swiftui mac-catalyst

7
推荐指数
1
解决办法
450
查看次数

UISearchController/UISearchBar 在 macOS 下的行为与 iOS 不同

我有一个带有标准 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 及其图标在 …

uisearchbar ios uisearchcontroller mac-catalyst

7
推荐指数
0
解决办法
296
查看次数

Catalyst - 以编程方式打开上下文菜单

我正在使用我的催化剂应用程序中的上下文菜单

let interaction = UIContextMenuInteraction(delegate: self)
editButton.addInteraction(interaction)
Run Code Online (Sandbox Code Playgroud)

这在 Mac 上工作正常,并且当用户使用鼠标右键单击时会打开菜单。

另一方面,在某些情况下,我需要在普通按钮上打开相同的菜单,尤其是当用户在 iPad 上使用该应用程序时。有没有办法在普通按钮单击/点击事件上打开相同的上下文菜单?

swift mac-catalyst

7
推荐指数
1
解决办法
1033
查看次数

macOS 催化剂上钥匙串项的 PersistentRef

背景

我正在尝试构建一个使用本机 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)

macos keychain swift nevpnmanager mac-catalyst

7
推荐指数
1
解决办法
184
查看次数

SwiftUI - 在 iPadOS 和 Catalyst 上使用 onTapGesture 和鼠标/触控板出现意外行为

我在我的应用程序中有一个显示矩形卡片列表的布局 - 每个卡片都应该可以点击(一次)以显示一组操作按钮和更多信息等。

我已经实现了这一点,.onTapGesture()并且我还.contentShape(Rectangle()强制执行了可点击区域。然而,虽然我的实现适用于触摸屏界面,但当我将它与 iPadOS 鼠标支持一起使用时,以及在 Catalyst 上,我看到了一些非常意外的行为。

我在下面制作了一个最小的可重现示例,您可以复制该示例以重现问题。

使用鼠标/触控板输入时出现的问题:

  • 并非每次单击鼠标都记录为点击手势。除了少数情况外,这几乎是任意发生的:
  • 它似乎只在非常特定的区域单击,或者在同一位置多次单击时单击。
  • 看来,在很多情况下,只有每一个其他的点击记录。所以我双击只得到一个点击手势。
  • 在此示例代码中并不明显,但在我的主应用程序中,可点击区域似乎是任意的 - 您通常可以单击靠近文本或与其对齐以记录点击手势,但并非总是如此

如果您正在运行示例代码,您应该能够通过反复移动鼠标并尝试单击来查看问题。除非您在同一位置多次单击,否则它不起作用。

什么按预期工作

  • 所有输入都使用触摸而不是鼠标;无论您在哪里点击它都会记录点击手势。
  • 作为本机 Mac 目标运行时的鼠标输入。上述问题仅针对在 iPadOS 和 Mac 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)

ios swift swiftui ipados mac-catalyst

7
推荐指数
1
解决办法
350
查看次数

AVAudioEngine 在 macOS/iOS 上协调/同步输入/输出时间戳

我正在尝试将录制的音频(从AVAudioEngine inputNode)同步到录制过程中正在播放的音频文件。结果应该类似于多轨录音,其中每个后续新音轨都与录制时正在播放的先前音轨同步。

因为sampleTime在不同之间AVAudioEngine的输出和输入节点,我使用hostTime确定偏移原始音频和输入缓冲器。

在 iOS 上,我会假设我必须使用AVAudioSession的各种延迟属性 ( inputLatency, outputLatency, ioBufferDuration) 来协调轨道以及主机时间偏移,但我还没有想出使它们工作的神奇组合。这同样适用于各种AVAudioEngineNode属性,如latencypresentationLatency.

在 macOS 上,AVAudioSession不存在(在 Catalyst 之外),这意味着我无法访问这些数字。同时,latency/presentationLatency属性在大多数情况下会AVAudioNodes报告0.0。在 macOS 上,我确实可以访问AudioObjectGetPropertyData并且可以向系统询问kAudioDevicePropertyLatency, kAudioDevicePropertyBufferSizekAudioDevicePropertySafetyOffset等,但是对于协调所有这些的公式又有点不知所措。

我在https://github.com/jnpdx/AudioEngineLoopbackLatencyTest上有一个示例项目,它运行一个简单的环回测试(在 macOS、iOS 或 Mac Catalyst 上)并显示结果。在我的 Mac 上,轨道之间的偏移量约为 720 个样本。在其他人的 Mac 上,我看到多达 1500 个样本偏移。

在我的 iPhone 上,我可以通过使用AVAudioSession's outputLatency+使它接近完美的样本 …

core-audio ios swift avaudioengine mac-catalyst

7
推荐指数
2
解决办法
437
查看次数

SIGABRT 在 macCatalyst 中随机显示“以下金属对象正在被销毁,但命令缓冲区仍要求其处于活动状态”

我的 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)

macos sigabrt swift mac-catalyst

7
推荐指数
1
解决办法
1629
查看次数