标签: appkit

NSImage drawInRect 和 TemplateImages

有一个NSImage是模板图像(即[NSImage isTemplate]返回YES)。

当我在 NSImageView 中使用它时,它被正确地绘制为模板图像。

但是,如果我使用 手动绘制它,则会将其drawInRect:fromRect:operation:fraction:绘制为纯黑色图像。

如何手动绘制 NSImage 并仍然获得“模板”效果?

cocoa nsimage appkit drawrect

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

如何在 NSWindow 打开时收到通知?

如何在NSWindow即将打开或刚刚打开时注意?也就是windowWillClose:委托方法的反面(同样是 的反面NSWindowWillCloseNotification.

这与this question有关,但从另一个方向。

背景是,我希望将一个窗口与主菜单上的刻度线结合起来(除其他外)。当窗口显示时,相应的 ? 应检查菜单项,反之亦然。

cocoa appkit nswindow nswindowcontroller

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

Swift 和我的空闲计时器实现(缺少 CGEventType )

在 Objective-c 中,我曾经通过基于以下 CoreGraphics 调用来实现我的空闲计时器:

CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType);
Run Code Online (Sandbox Code Playgroud)

现在在 swift 中,使用相同的基本调用,它看起来像:

CGEventSourceSecondsSinceLastEventType(CGEventSourceStateID.CombinedSessionState, CGEventType.MouseMoved)
Run Code Online (Sandbox Code Playgroud)

在检查了头文件后,例如CGEventType的定义位置,我找不到任何常量的提及,这些常量以我能够在 ObjC 实现中执行的形式执行任何操作。

现在我可能可以通过查找常量的值并像这样处理它来解决这个问题,但我非常不想这样做。我宁愿改用IOKit重写。看起来它基本上被定义为 (~0),但就像前面提到的,我宁愿不那样硬编码。

macos cocoa objective-c appkit swift

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

如何在 Swift 中实现 NSDocument 方法 -canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: ?

在我的应用程序中,一个NSDocument子类关键任务硬件 - 用户真的不想意外关闭文档!所以,我已经实现canCloseDocumentWithDelegate…NSAlert在关闭之前显示和询问。

我现在试图在用 Swift 编写的应用程序中实现同样的事情。

由于答案是异步出现的,“应该关闭”结果将传递给委托的回调,而不是简单地返回。在 的文档中-canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:,它说:

shouldCloseSelector 回调方法应具有以下签名:

- (void)document:(NSDocument *)doc shouldClose:(BOOL)shouldClose contextInfo:(void *)contextInfo

所以,由于有 3 个不同类型的参数,我不能使用简单的performSelector:withObject:样式方法——你必须使用 NSInvocation。请注意,委托的类型是id,并且上面的签名没有出现在任何正式协议中——您不能简单地正常调用该方法。(有关如何执行此操作的示例,请参阅此邮件列表帖子

现在,问题是,Swift 中不允许使用 NSInvocation!参见 Swift 博客“NSMethodSignature 发生了什么”

将 Cocoa 框架引入 Swift 为我们提供了一个独特的机会,以全新的视角看待我们的 API。我们发现我们觉得不符合 Swift 目标的类,通常是因为我们将安全放在首位。例如,一些与动态方法调用相关的类在 Swift 中没有公开,即NSInvocationNSMethodSignature

这听起来是件好事,但是当一个简单的NSDocumentAPI 仍然需要 NSInvocation时就会失败!对整个问题的真正解决方案是让 ApplecanCloseDocument…使用块回调引入新的API。但在那之前,最好的解决方案是什么?

cocoa objective-c nsdocument appkit swift

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

NSTextList 中的复选框

如何将复选框作为 NSTextList 中的标记?我希望用户能够单击复选框,它将更改为另一个符号(复选标记或竖起大拇指或内部带有十字的复选框......)。我怎样才能做到这一点?我玩了一点 NSTextViews,我可以让 NSTextLists 工作。但我不知道如何自定义它。我正在使用 Xcode 9、swift 4,并尝试使其适用于 macOS。

macos cocoa nstextview appkit

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

突出显示鼠标光标下的 NSWindow


由于这是相当多的代码,如果有一个示例项目可以帮助您更好地理解当前问题,我制作了一个简单的示例项目,您可以在此处在 GitHub 上找到它:https : //github.com/dehlen/堆栈溢出


我想实现一些与 macOS 屏幕截图工具非常相似的功能。当鼠标悬停在窗口上时,该窗口应突出显示。但是,我遇到的问题只是突出显示用户可见的窗口部分。

这是该功能应该是什么样子的屏幕截图: 它应该是什么样子

然而,我目前的实现看起来像这样: 它看起来像什么

我当前的实现执行以下操作:

1. 获取屏幕上所有可见窗口的列表

static func all() -> [Window] {
        let options = CGWindowListOption(arrayLiteral: .excludeDesktopElements, .optionOnScreenOnly)
        let windowsListInfo = CGWindowListCopyWindowInfo(options, CGMainDisplayID()) //current window
        let infoList = windowsListInfo as! [[String: Any]]
        return infoList
            .filter { $0["kCGWindowLayer"] as! Int == 0 }
            .map { Window(
                frame: CGRect(x: ($0["kCGWindowBounds"] as! [String: Any])["X"] as! CGFloat,
                       y: ($0["kCGWindowBounds"] as! [String: Any])["Y"] as! CGFloat,
                       width: ($0["kCGWindowBounds"] as! [String: Any])["Width"] as! CGFloat,
                       height: ($0["kCGWindowBounds"] as! [String: Any])["Height"] …
Run Code Online (Sandbox Code Playgroud)

macos cocoa appkit swift

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

在 AppKit 中为 macOS SwiftUI 应用程序设置主窗口标题?

我有一个简单的 WKWebView 应用程序,它在 macOS 上打开一个网站,在 AppKit 中使用 SwiftUI。但是,应用程序窗口没有标题 - 我说的是顶行(用红色 X 关闭它,等等。

我如何在那里设置标题?我试过查看 Main.Storyboard 但没有看到任何类似于“标题段”的内容。

macos xcode appkit wkwebview swiftui

5
推荐指数
2
解决办法
3330
查看次数

macOS 11 Big Sur 中带有自定义视图的 NSMenuItem

macOS 11 Big Sur 在其当前迭代(beta 1 到 beta 6)中有一个错误/功能,这使得很难将 NSMenuItem 与自定义视图一起使用。具体来说,当菜单项突出显示时,项目的自定义视图不会调用 draw(dirtyRect:)。

我设法通过 NSMenu 委托手动调用 draw(dirtyRect:) 方法来绕过该错误:

func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) {
    if #available(OSX 11.0, *) {
        // fix for bug when an item with custom view won't be called to draw the highlighting state
        menu.items.filter{ $0.tag == 101 }.forEach{ $0.view?.needsDisplay = true }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这并不能解开绘制状态的奥秘。MacOS 11 Big Sur 具有新的 UI 外观。菜单项现在以不同的方式突出显示,其内容周围带有圆形框。

我的问题是:我应该手动模拟那个圆形框,还是在新的 App Kit 中有一些默认方式来绘制圆形的菜单项选择?

换句话说,在 macOS 11 Big Sur 中使用自定义视图的 NSmenuItem 的最佳方法是什么?

nsmenu appkit custom-view nsmenuitem macos-big-sur

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

NSAttributedString 绘制位置在 10.13 和 10.14+ 上不同

我使用NSAttributedStringsdraw(in: rect)将一个字符串绘制到一个视图中(普通的也会出现同样的问题NSString)。现在结果似乎与我在 Xcode 中设置的部署目标不同。如果部署目标是10.13,则绘制调用会像这样呈现它

在此处输入图片说明

其中红色框代表rect。如果我在10.14不接触代码的情况下将部署目标切换到或更高,则相同的绘制调用会呈现如下

在此处输入图片说明

创建一个空项目,将NSWindows内容视图类设置为TestView并创建下面的类。

class TestView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        NSAttributedString(string: "9", attributes: [
            .font: NSFont.userFixedPitchFont(ofSize: 48)!,
            .foregroundColor: NSColor.labelColor
        ]).draw(in: bounds)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在 10.13 和 10.14+ 部署目标之间切换,字符串位置将发生变化。如果您检查字符串,.size()它会68在 10.13 和5810.14+ 上返回。

我如何使平台之间保持一致?由于它在一个包内,DT 可能会有所不同,我想避免不同的代码路径。

此外,10.14+ 版本似乎更“正确”。

macos cocoa appkit swift

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

macOS 窗口叠加效果错误?

编辑:我还没有得到这个工作。有人介意下载我的简单测试项目并在他们的机器上试用吗?只有样板代码和故事板。

https://www.dropbox.com/sh/qtoqhi7pjq5w3hh/AADLCTY_7FPG18RWeSe57Jroa?dl=0

原始问题:我正在为 Big Sur 开发 macOS 应用程序。我想利用窗口栏对我的内容的模糊效果。我已经fullSizeContentView在窗口上设置了遮罩。但是,只有当我在滚动视图的前缘与其父视图的前缘之间设置了最小间距时,才能使效果起作用。这似乎是 AppKit 中的一个错误。谁能确认或告诉我我做错了什么?

请参阅下面的剪辑: 首先,我有一个简单的 Xcode 项目(没有代码,只使用 Storyboard)。滚动视图设置在视图控制器的内容视图中。滚动视图的顶部、尾部和底部边缘与其父视图没有间距。前缘与其父视图的前缘有标准间距(20pt)。 模糊按预期工作

这按预期工作,但我不想要前缘间距。所以我将前缘间距设置为 0。 将前缘间距设置为 0

模糊效果消失了。 没有模糊:(

macos appkit autolayout swift

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