标签: appkit

在Mac OS X(Lion)上创建全屏叠加层的最优雅方式是什么?

我正在寻找在Mac OS X下创建全屏叠加层的"最佳"方式.我想创建一个透明或半透明的叠加层,它关注鼠标事件并显示其他输入/输出元素.

此叠加层应高于所有其他GUI项(如CMD-Tab叠加层).

你知道如何有效地做到这一点吗?目前我正在玩这种代码:

int windowLevel = CGShieldingWindowLevel();
NSRect windowRect = [[NSScreen mainScreen] frame];
NSWindow *overlayWindow = [[NSWindow alloc] initWithContentRect:windowRect
                                          styleMask:NSBorderlessWindowMask
                                            backing:NSBackingStoreBuffered
                                              defer:NO
                                             screen:[NSScreen mainScreen]];

[overlayWindow setReleasedWhenClosed:YES];
[overlayWindow setLevel:windowLevel];
[overlayWindow setBackgroundColor:[NSColor colorWithCalibratedRed:0.0
                                                          green:0.0
                                                           blue:0.0
                                                          alpha:0.5]];
[overlayWindow setAlphaValue:1.0];
[overlayWindow setOpaque:NO];
[overlayWindow setIgnoresMouseEvents:NO];
[overlayWindow makeKeyAndOrderFront:nil];
Run Code Online (Sandbox Code Playgroud)

...它工作正常,但我没有选择启动任何类型的动画,如缓慢增加透明度(慢慢调暗屏幕)等.

虽然我不明白如何将此窗口置于后台,但不释放它并让它不时弹出.

那么有更好或"标准"的方法吗?

cocoa overlay appkit nswindow

10
推荐指数
1
解决办法
4230
查看次数

来自.xib的可重用NSView

在我的应用程序的几个部分中,我需要一个用户可以输入密码的控件.密码字段是安全的,但我希望用户能够将字段切换为纯文本并检查拼写错误等.

密码字段本身没问题.我将NSSecureTextField子类化以获得我想要的行为.我使它可绑定,所以我可以从另一个控件(比如一个Checkbox)切换显示.

在此输入图像描述 在此输入图像描述

现在,我想在我的应用程序中的多个位置重用它.我可以在我需要的任何地方使用我的自定义安全文本字段旁边的复选框.但我更愿意将这些部分组合成一个可重用的组件.

所以我使用界面构建器创建一个:

在此输入图像描述

现在,我如何在不同的窗口中使用它?我在窗口中添加了"自定义视图"组件,并正确设置了它的类型:

在此输入图像描述

但在运行时,我只是得到一个空的空间.

1 - 大概是因为我的视图是在.xib中定义的 - 我需要在代码中做一些事情来从.xib加载我的PasswordView实例; 但究竟我需要做什么?我无法解决这个问题.

特别:

  • 从.xib加载我的视图实例的进程/ API是什么?我很难找到关于此的文档.

  • 一旦我加载了我的视图实例,如何将其插入到我的自定义视图'占位符'的位置?据推测,我需要一个出口到我的自定义视图,但那么呢?我只是将加载的实例分配给插座吗?我是否应该将其添加为插座的子视图?

  • 这个逻辑应该在哪里发生?在init里面,在AwakeFromNib里面?

2 - 我知道我可以使用NSViewController作为我的自定义视图(示例),并以这种方式加载它.但我真的需要一个视图控制器吗?看来我应该能够创建独立的视图并轻松实例化它们......但也许这不是Cocoa的"方式"?在我看来,应该有一种直接的方法来组合来自多个.xibs的视图,而不需要每个子视图的控制器(可能只是一个文本字段或按钮),但我只是找不到它. ..

先感谢您.

cocoa interface-builder nsview appkit nsviewcontroller

10
推荐指数
1
解决办法
3136
查看次数

NSPopupButton中的分隔项与绑定

a的内容NSPopupButton绑定到一个NSArray字符串.

我们如何通过绑定插入分隔项?

" -"字符串(如旧版/经典日)不起作用,即字面上显示为" -"菜单项.

有没有标准的Cocoa类和绑定的开箱即用的解决方案?

这应该是一个很重要的问题,但我找不到任何解决办法,不涉及傻黑客就像子类的问题NSMenu,NSPopupButton或者其他非直观的变通.

cocoa objective-c appkit cocoa-bindings nspopupbutton

10
推荐指数
2
解决办法
2757
查看次数

透明背景WKWebView(NSView)

我正在使用Swift构建Mac应用程序.因此,我想让WKWebView透明,因此它显示了加载的HTML的文本,但我的底层NSWindow的背景是可见的.我试过了

webView.layer?.backgroundColor = NSColor.clearColor().CGColor;
Run Code Online (Sandbox Code Playgroud)

没有任何影响.WKWebView继承自NSView,但我不知道这是否有帮助.

另一个解决方案是插入一个NSVisualEffectView作为WebView的背景,但我不知道如何实现它!

macos appkit swift

10
推荐指数
4
解决办法
3455
查看次数

NSWindow:改变窗口按钮的位置

我想伪造一个标题栏(更大,颜色不同),所以到目前为止我的方法如下:

我在标题栏的正下方添加了一个NSView,然后使用以下代码将标题栏设置为透明:

self.window.titlebarAppearsTransparent = true
self.window.styleMask |= NSFullSizeContentViewWindowMask    
Run Code Online (Sandbox Code Playgroud)

下一步是,我将NSView子类化添加一些绘图方法(背景等),特别是代码,以便我可以使用完整的NSView来移动窗口(因此我使用此代码:https:// stackoverflow. com/a/4564630/2062613)

这是结果:

窗纱

现在我要做的下一件事就是在这个新标题栏中垂直居中交通灯按钮.我知道,我可以使用self.window.standardWindowButton(NSWindowButton.CloseButton)(例如)访问按钮.但更改frame.origin其中一个按钮没有任何影响.

如何更改按钮的origin.y值?

UPDATE

我发现,窗口调整大小会重新排列按钮.现在我决定将按钮作为子视图添加到我的假标题栏中,因为移动标题栏中的原点会切断按钮(显然它仅限于标题栏rect).

这有效,但奇怪的是按钮的鼠标悬停效果仍然保留在标题栏中.看看这个屏幕:

第二个屏幕

这实际上是我的代码:

func moveButtons() {
    self.moveButtonDownFirst(self.window.standardWindowButton(NSWindowButton.CloseButton)!)
    self.moveButtonDownFirst(self.window.standardWindowButton(NSWindowButton.MiniaturizeButton)!)
    self.moveButtonDownFirst(self.window.standardWindowButton(NSWindowButton.ZoomButton)!)
}

func moveButtonDownFirst(button: NSView) {
    button.setFrameOrigin(NSMakePoint(button.frame.origin.x, button.frame.origin.y+10.0))
    self.fakeTitleBar.addSubview(button)
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa appkit swift

10
推荐指数
1
解决办法
2780
查看次数

使用Swift在NSTextField中垂直对齐文本

我一直在阅读有关如何在NSTextField上设置垂直对齐的各种选项.我希望文本显示在中心,并在Swift中以编程方式进行.以下是我目前看到的事情:

我在Swift中尝试过的一件事是设置以下属性:

textField.usesSingleLineMode = true
Run Code Online (Sandbox Code Playgroud)

有关垂直居中文本的最佳方法的任何提示将非常感谢!

cocoa appkit swift

10
推荐指数
1
解决办法
7365
查看次数

找不到符号:High Sierra中的_OBJC_IVAR _ $ _ NSScroller._action

在以前版本的MacOS上运行的应用程序在High Sierra上失败,并显示以下消息:

dyld:未找到符号:_OBJC_IVAR _ $ _ NSScroller._action参考自:/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit

可能导致此问题的变化是什么?(我不是MacOS开发方面的专家)我怀疑otool命令可能有助于识别与此问题相关的更改,但还没有找到正确的参数.

检查AppKit文档https://developer.apple.com/documentation/appkit/deprecated_symbols它说NSDrawer已被弃用,这是否相关?

NSDrawer [不建议使用]除了其他视图子类之外,还包含并显示文本,滚动和浏览器视图的用户界面元素.

macos appkit macos-high-sierra

10
推荐指数
3
解决办法
7018
查看次数

UIKit for Mac中不存在“ NSApp”:如何在macOS的iOS应用中嵌入仅Mac框架?

Mac版UIKit

我正在探索Xcode 11和macOS Catalina的新可能性,以使用UIKit创建Mac版本的iPad应用程序。通常按预期工作。

什么是最好的方式定制NSWindow在在MacOS iOS应用程序?


超越复选框

https://developer.apple.com/documentation/uikit/creating_a_mac_version_of_your_ipad_app

您可以使用相同的方法来包含仅在macOS中可用的框架和代码。对于框架,请选择macOS作为平台设置,并使用#if targetEnvironment(UIKitForMac)语句将代码括起来。

首先,我创建了一个基本的macOS框架(例如MacMan.framework)来配置Mac特定的行为。

尽管尽了最大的努力,但我还是遇到了错误:

  • Mac版的UIKit中无法使用“ NSApp”
  • Mac OS的UIKit中没有'NSWindow'
  • 为Mac构建UIKit,但为macOS构建链接框架“ MacMan.framework”。您可能需要配置“ MacMan.framework”以针对Mac的UIKit进行构建,或者限制在目标编辑器中应链接此框架的平台。

相反似乎正确(易于排除代码)

#if !targetEnvironment(UIKitForMac)

override var prefersHomeIndicatorAutoHidden: Bool {
    return true
}

#endif
Run Code Online (Sandbox Code Playgroud)

参考文献:

https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit

macos cocoa uikit appkit ios

10
推荐指数
1
解决办法
731
查看次数

在 Mac Catalyst 中打开一个新窗口

我正在使用 Mac Catalyst 移植 iPad 应用程序。我正在尝试在新窗口中打开一个视图控制器。

如果我严格使用 AppKit,我可以像这篇文章中描述的那样做一些事情。但是,由于我使用的是 UIKit,因此没有showWindow()可用的方法。

这篇文章指出,这可以通过在项目的新包中添加 AppKit 来实现(我这样做了),但是它没有解释如何实际呈现新窗口的具体细节。它读...

你不能完全做的另一件事是NSWindow用 UIKit 视图层次结构生成一个新的。然而,你的 UIKit 代码有能力产生一个新的窗口场景,你的 AppKit 代码有能力获取它所呈现的结果 NSWindow 并劫持它来做任何你想做的事情,所以从这个意义上说你可以产生 UIKit 窗口用于辅助调色板和各种其他功能。

任何人都知道如何实现本文中解释的内容?

TL;DR:如何使用 Mac Catalyst打开UIViewController一个新的单独文件NSWindow

macos uikit appkit ios mac-catalyst

10
推荐指数
2
解决办法
3131
查看次数

MacOS 上的 SwiftUI。- 打开一个新窗口

在我的 MacOS SwiftUI 应用程序中,我想在新 Windows 中显示一些视图。可以从代码的几个部分进行调用,因此我决定将其实现为像这样的特殊结构的静态函数。
效果很好——有什么可反对的吗?

struct Appwindows {
  
  static func newWindow(forSpecialView view: SpecialView, title: String = "new Window")
 { let newWindow = newWindowInternal(title: title)!
   
    newWindow.contentView = NSHostingView(rootView: view)
 }
  
  private static func newWindowInternal(title: String = "new Window") -> NSWindow!
 { var newWindow: NSWindow!
   newWindow = NSWindow(
     contentRect: NSRect(x: 20, y: 20, width: 680, height: 600),
     styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
     backing: .buffered,
     defer: false)
     newWindow.center()
     newWindow.isReleasedWhenClosed = false
     newWindow.title = title
     newWindow.makeKeyAndOrderFront(nil)
     return newWindow
 }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让它更通用,以便任何类型的视图都可以传递给 …

macos appkit swift swiftui

10
推荐指数
1
解决办法
2574
查看次数