小编Dan*_*iel的帖子

macOS菜单栏应用程序:主菜单未显示

我有一个状态栏应用程序,它在菜单栏中运行.因此,我设置Application is agent (UIElement)trueinfo.plst.这导致我的应用程序没有停靠图标和菜单栏.

但是,我还有一个用户可以从状态栏菜单打开的首选项窗口.这是我打开它的方式:

if (!NSApp.setActivationPolicy(.regular)) {
    print("unable to set regular activation policy")
}
NSApp.activate(ignoringOtherApps: true)
if let window = preferencesWindowController.window {
    window.makeKeyAndOrderFront(nil)
}
Run Code Online (Sandbox Code Playgroud)

该窗口按预期显示,但应用程序的主菜单栏包含文件,编辑等,但未显示.只有当我点击另一个应用程序并返回我的应用程序时,才会显示菜单栏.

我注意到,如果我更改info.plstto中的值false并使用NSApp.setActivationPolicy(.accessory)in applicationDidFinishLaunching(),则它具有相同的结果.但是,如果我在调用NSApp.setActivationPolicy(.accessory)后几毫秒调用一个计时器applicationDidFinishLaunching(),它就可以工作,并且主菜单正在按预期显示.然而,这有副作用,即应用程序图标在停靠栏中弹出几秒钟(直到计时器被触发),这不是一个很好的用户体验.

有谁知道我还能尝试什么?切换活动应用时发生了什么,我在代码中没做什么?

我在macOS 10.12.2(16C67)上使用版本8.2.1(8C1002)

谢谢!

macos cocoa menubar background-process swift

9
推荐指数
1
解决办法
822
查看次数

macOS 10.15 Catalina 的安全系统首选项中的隐私功能“输入监控”背后是哪个 API?

在 macOS 10.15 Catalina 中,安全系统首选项中有一个名为Input Monitoring的新部分。

它说:

即使在使用其他应用程序时,也允许以下应用程序监控来自键盘的输入。

我想知道这背后是哪个 API 将应用程序引入本节。

我知道AXIsProcessTrustedWithOptions(),它向输入监控上方的辅助功能部分添加了一个应用程序。然后我可以用来观看来自其他应用程序的按键。但是输入监控有什么用呢?NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: self.keyDown(event:))

看起来手动将应用程序添加到输入监控不允许您使用NSEvent.addGlobalMonitorForEvents(...).

像 Steam 这样的应用程序在更新到 Catalina 后已被放入该部分,所以必须有一些东西告诉系统将它们放在那里......

在此处输入图片说明

macos accessibility keyboard-events

9
推荐指数
1
解决办法
1153
查看次数

如何计算PDF文档中嵌入的图像的分辨率(DPI)?

我有一个PDF文档,也包含图像.

现在我想知道这些图像的分辨率.

第一步是以某种方式从PDF文档中获取图像.但是怎么样?

使用Cocoa提供的东西甚至可以实现吗?

pdf cocoa poppler objective-c quartz-graphics

8
推荐指数
2
解决办法
6162
查看次数

SwiftUI-搜索列表头

我试图用SwiftUI重新创建每个人从UITableView知道的东西:tableview标题中的一个简单搜索字段:

tableview标题中的一个简单搜索字段

但是,SwiftUI中的列表视图似乎甚至没有添加页眉或页脚的方法。您可以将带有TextField的标题设置为以下部分:

@State private var searchQuery: String = ""

var body: some View {

List {
    Section(header:
        Group{
            TextField($searchQuery, placeholder: Text("Search"))
                                .background(Color.white)
            }) {
                  ListCell()
                  ListCell()
                  ListCell()
                }

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否是最佳方法,因为:

  1. 从UITableView知道向下滚动时,标题不会隐藏。
  2. SearchField看起来不像我们知道和喜欢的搜索字段。

有没有人找到好的方法?我不想依靠UITableView。

search textfield uitableview swiftui

8
推荐指数
2
解决办法
4084
查看次数

新 NSSearchToolbarItem 的向后兼容性

在 macOS 11 中,Apple 引入了一个名为 NSToolbarItem 的新 NSToolbarItem NSSearchToolbarItem,当焦点切换到工具栏项时,它会自动调整大小以适应输入。

在此处输入图片说明 在此处输入图片说明

Apple 在此表示这与旧版本的 macOS 向后兼容:https : //developer.apple.com/wwdc20/10104(11:50 分钟)

但是,NSSearchToolbarItem在 macOS 10.13 (High Sierra) 上使用from interface builder启动我的应用程序时,我的应用程序会因以下应用程序特定信息而崩溃:

*** 由于未捕获的异常“NSInvalidUnarchiveOperationException”而终止应用程序,原因:“*** -[NSKeyedUnarchiver decodeObjectForKey:]:无法为密钥(NS.objects)解码类(NSSearchToolbarItem)的对象;该类可以在源代码或未链接的库中定义,并以 NSException 类型的未捕获异常终止

在 10.15 上启动它可以正常工作。我还没有能够测试 10.14。

Thomas Tempelmann 于 7 月 21 日更新

事实证明,这是旧 Xcode 12 版本的错误,现在已在 Xcode 12.5.1 中修复。

我已经开了一个赏金,因为我有一个看似相关的问题与高塞拉利昂运行时工具栏里面NSSegmentedControls的规格选择不当,但事实证明,这是一个单独的问题(这可以通过手动重置工具栏的固定minSize,并maxSize以控件frame.size)。

因此,解决方案是使用 Xcode 12.5.1 或更高版本。

macos cocoa nstoolbar nstoolbaritem

8
推荐指数
1
解决办法
344
查看次数

SwiftUI:在菜单中呈现多个 ShareLink

我想展示具有多个选项的共享菜单。我创建了一个菜单并添加了所有 ShareLink 视图。我可以点击共享按钮,但如果我选择共享链接,则不会发生任何情况。没有错误消息。

这是我能想到的创建这样一个“共享菜单”的唯一方法:

ToolbarItemGroup(placement: SwiftUI.ToolbarItemPlacement.navigationBarTrailing) {

    Menu {
          ShareLink(
               item: URL(string: "https://www.apple.com")!,
               preview: SharePreview(
                   "Test 123",
                    image: Image(systemName: "plus")
                    )
                )
               ShareLink(
                    item: URL(string: "https://www.microsoft.com")!,
                    preview: SharePreview(
                        "Tests 321",
                         image: Image(systemName: "minus")
                    )
                )

        } label: {
               Image(systemName: "square.and.arrow.up")
        }
}
Run Code Online (Sandbox Code Playgroud)

截屏

menu ios swift swiftui

8
推荐指数
1
解决办法
1966
查看次数

带有 SF 符号的 HStack 图像未居中对齐

我有这个简单的 SwiftUI 代码。我希望所有符号都居中对齐,就像云符号一样。

struct ContentView : View {
var body: some View {
    HStack(alignment: .center, spacing: 10.0) {
        Image(systemName: "cloud.sun")
        Image(systemName: "cloud")
        Image(systemName: "cloud.bolt")
        Text("Text")
        }.font(.title)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是正如您在下面看到的,第一个和最后一个符号没有居中。我错过了什么,还是这是一个错误?

居中 HStack

干杯!

swift swiftui sf-symbols

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

SwiftUI:如何更改细节 NavigationSplitView 的可见性?

我想NavigationSplitView在 macOS 上隐藏/显示 a 的详细信息拆分视图。

不过NavigationSplitViewVisibility似乎没有这样的选择。更改.navigationSplitViewColumnWidth().frame()对详细信息视图没有影响,尽管它适用于内容和列表视图。

 NavigationSplitView {
            List(selection: $selection)
        } content: {
            content(for: selection)
        } detail: {
            Text("Detail")

 }
Run Code Online (Sandbox Code Playgroud)

苹果是否忘记实现这样的功能?:/

macos swiftui

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

PDFDocument + Quartz Filter的内存泄漏

我的应用程序使用石英过滤器将PDF文档中的图像转换为黑白图像:

PDF Document *pdfDocument = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/dan/Desktop/test.pdf"]];

QuartzFilter *quartzFilter = [QuartzFilter quartzFilterWithURL:[[NSBundle mainBundle] URLForResource:@"Black & White" withExtension:@"qfilter"]];

NSDictionary *options = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:quartzFilter, nil] forKeys:[NSArray arrayWithObjects:@"QuartzFilter", nil]];

[pdfDocument writeToFile:@"/Users/dan/Desktop/testResault.pdf" withOptions:options];
Run Code Online (Sandbox Code Playgroud)

不幸的是,在应用过滤器的情况下将文件写入磁盘会导致许多内存泄漏,如下所示: 在此输入图像描述

这是Quartz Framework中的一个错误,还是我在上面的代码中做错了什么?

如果你想,你可以在这里下载我的测试项目:http://www.file-upload.net/download-7293644/PDF---Quartz-Memory-Leak.zip.html

我正在使用ARC.

pdf macos cocoa quartz-graphics ios5

5
推荐指数
0
解决办法
474
查看次数

暂时禁用通用剪贴板

iOS和macOS具有称为“通用剪贴板”的内置功能,该功能可使用iCloud在设备之间同步剪贴板的内容。

NSPasteboard.general.clearContents()
NSPasteboard.general.writeObjects("Test 123") 
Run Code Online (Sandbox Code Playgroud)

我想在Cocoa应用程序的通用粘贴板上写一些东西,以便在不与其他iCloud设备同步的情况下在应用程序之间共享它。我找不到解决方法。实际上,我认为如果没有用户在设置中手动禁用它,这是不可能的。

文档说:

通用粘贴板(通过通用类方法提供)可自动参与macOS 10.12和更高版本以及iOS 10.0和更高版本中的通用剪贴板功能。没有用于与此功能交互的macOS API。 https://developer.apple.com/documentation/appkit/nspasteboard

但是,也许有一种解决方法,私有API(我知道没有App Store)或其他人可能知道的东西。:)

干杯

macos clipboard nspasteboard ios

5
推荐指数
1
解决办法
95
查看次数