标签: appkit

使用CoreAnimation"折叠"NSWindow

所以我对AppKit和Cocoa(来自UIKit和CocoaTouch)相当新,我正在实现一个折叠NSWindow的界面.在iOS上,这将是相当容易的,但看看OS XI选择提出的许多细微差别.

您将如何实施以下过渡?

窗口折叠

注意:底栏是我的contentView的一部分,而不是OS X提供的底栏.即我的窗口(顺便说一下INAppStoreWindow)由titleBar和contentView组成.

我想我可以只是折叠contentView并同步调整窗口的大小,但如果我能够在折叠时保留透明度,这是因为透视转换所致.即向内弯曲的侧面(在过渡期间)应该是透明的.还是我在思考这个?

macos core-animation transformation appkit nswindow

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

像OS X的自定义控件那样的选择器?

是否有OSS自定义控件或源代码示例用于执行类似Mac OS X上的iOS Picker控件(旋转桶事件)?

在此输入图像描述

对网站和http://www.cocoacontrols.com这样的网站进行的一些研究没有发现任何事情.

我意识到这种范例对于许多场景来说都很尴尬,但对于我正在研究的休闲应用程序而言,它在屏幕属性(和设计)方面都是理想的.

任何提示赞赏.

macos cocoa appkit

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

在Interface Builder中的NSWindowController的nib中引用NSViewController的视图

如果您正在使用NSViewController,每个都有自己的XIB文件,有没有办法在NSWindowController的XIB文件中引用这些视图?我希望能够在我的NSWindowController中删除一个视图,并让Interface Builder了解该视图实际上是它可以从嵌入式NSViewController获取的视图.

MyWindowController.xib

[Objects]
-- MyViewController (Loaded from MyViewController.xib)
-- OtherViewController (Loaded from OtherViewController.xib)

[Window]
-- View
---- My View
---- Other View
Run Code Online (Sandbox Code Playgroud)

我希望Interface Builder知道它My View真的是来自的视图MyViewController.目前,我不得不手动将这些视图添加到窗口的内容视图中windowDidLoad.

- (void)windowDidLoad {
  ... snip ...

  [self.window.contentView addSubview:self.myViewController.view];
  [self.window.contentView addSubview:self.otherViewController.view];

  ... Configure constraints ...
}
Run Code Online (Sandbox Code Playgroud)

这是一个简化的示例,但在较大的情况下,可能有许多视图控制器在起作用,每个视图控制器都有自己的视图.我更喜欢在Interface Builder中设置他们的初始约束和布局,但我不确定如何.

macos cocoa interface-builder appkit

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

自动终止MacOS XPC服务的正确方法是什么?

我已经成功地遵循了守护进程和服务指南 - 创建XPC服务教程,以及SandboxedFetch示例代码,并且使用了新NSXPCConnection类的工作客户端/服务设置.

我还不完全清楚的是如何在服务应用程序完成其工作后正确地自行终止服务应用程序.我认识到,在许多情况下,服务预计仍然存在,但在我想到的用例中,该服务将仅用于进行一些我在主应用程序中不执行的处理.完成该处理后,没有理由保留服务应用程序.如果客户端稍后需要其他服务,则可以重新创建一个新服务.

由于服务是轻量级的,非nibbed,NSApplication我试图通过invalidate从内部调用来自我终止它applicationWillTerminate,但几乎每次都会触发EXC_BAD_ACCESS异常.调用invalidate该服务可以[NSXPCListener serviceListener]产生稍微不那么可靠的崩溃,但它仍然会崩溃.

invalidate从客户端应用程序内部调用NSXPCConnection也几乎每次都会生成一个EXC_BAD_ACCESS异常.

所以我很好奇正确的步骤顺序是干净地关闭XPC服务然后退出服务应用程序.理想情况下,服务在向客户端发出最后一次XPC调用后会自行终止.

附件是一个例外的堆栈跟踪之一的小屏幕截图.(是的,这是在服务中加载的webview.一旦webview完成加载,我希望服务自行终止)

在此输入图像描述

cocoa xpc foundation appkit nsxpcconnection

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

Cocoa预定义调整鼠标光标?

是否使用预览(例如调整形状大小时)系统光标时调整大小的鼠标光标?

在此输入图像描述

它不能直接作为方法使用,NSCursor但它看起来不像预览应用程序包中的光标有私有资源.

除了NSCursor类定义的方法之外还有更多的系统游标吗?

cocoa objective-c appkit nscursor

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

NSSearchField偶尔会导致NSInternalInconsistencyException

例外情况是"NSWindow:-_oldFirstResponderBeforeBecoming不是响应者执行-becomeFirstResponder之外的有效消息." 然而,根据堆栈跟踪信息从所谓的becomeFirstResponder,所以我不知道我做错了.这是间歇性错误.

用户按下键命令序列,该键命令序列触发菜单项,该菜单项向键窗口控制器发送消息,该键控窗口控制器告知窗口上的搜索字段成为第一响应者.

这是一个汇总的堆栈跟踪::

[NSException raise:format:]
[NSWindow _oldFirstResponderBeforeBecoming]
[NSSearchField becomeFirstResponder]
[MyWindowController focusSearchField]
[NSApplication sendAction:to:from:]
[NSMenu performKeyEquivalent:]
Run Code Online (Sandbox Code Playgroud)

窗口控制器的动作实现非常简单:

public var searchField: NSSearchField?
@IBAction public func focusSearchField(sender: AnyObject) {
    searchField?.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

macos cocoa appkit

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

如何以编程方式关闭全屏模式NSWindow?

我的应用程序有两个窗口(主窗口和视频窗口),都可以独立进入全屏模式。并且主窗口有一个按钮可以切换视频窗口的可见性。当视频窗口可见时,该按钮仅发送关闭消息,如下所示:

[theVideoWindow close];
Run Code Online (Sandbox Code Playgroud)

当视频窗口未处于全屏模式时,它可以完美工作。

但是,当视频窗口以“全屏”模式运行时,该窗口看起来像被淘汰(关闭),但它仍然处于活动状态(就像一个不可见的窗口)并接受鼠标事件。用户无法与其他应用程序进行交互,因为不可见的窗口耗尽了所有鼠标事件,并且由于标题栏和菜单消失了而无法将其关闭。

除了首先退出全屏模式然后在NSWindowDidExitFullScreenNotification通知处理程序中将其关闭之外,是否有任何最佳实践以编程方式关闭全屏模式窗口?

提前致谢。


这似乎是我的错误。另一个开发人员在NSWindowDidExitFullScreenNotification通知处理程序中显式发送orderFront :,以使该窗口在退出全屏模式后才可见,并且该窗口仍然处于活动状态。

macos cocoa fullscreen appkit nswindow

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

在同一个NSPredicateEditorRowTemplate中合并多个本地化左键路径?

我正在尝试在应用程序中复制Finder的基于NSPredicateEditor的元数据搜索.

我更愿意免费获得Finder的确切NSPredicateEditor,但除非有人对这个问题有更好的答案,否则看起来我将不得不尽可能地复制Finder的搜索.

在镜像Kind选项时,我遇到了问题.我开始使用所有可用Kind选项保存Finder Spotlight搜索.

Finder搜索中的每个<code>Get Info</code>在结果保存的搜索文件夹上时,查询列为:</p>

<pre><code>(kMDItemContentTypeTree=com.apple.application) && 
(kMDItemContentTypeTree=public.archive) && 
(kMDItemContentTypeTree = public.content) && 
(_kMDItemGroupId = 8) && 
(_kMDItemGroupId = 9) && 
(_kMDItemGroupId = 13) && 
(_kMDItemGroupId = 7) && 
(_kMDItemGroupId = 10) && 
(_kMDItemGroupId = 11) && 
(_kMDItemGroupId = 12) && 
(kMDItemContentTypeTree = public.text) && 
(kMDItemKind = Run Code Online (Sandbox Code Playgroud)

我看到的问题是,单个"Kind"用户显示的文本包含多个键路径,这些路径在结果NSPredicate中使用,基于选择的正确值.

"类"可表示(至少)kMDItemContentTypeTree,_kMDItemGroupIdkMDItemKind.

当我创建一个NSPredicateEditorRowTemplate时,我传递一个左表达式,运算符和右表达式的数组.然后创建包含Left/Operator/Right的所有可能排列的行模板.

(注意:我是以编程方式而不是在Interface Builder中创建所有NSPredicateEditorRowTemplate的).

Finder 没有创建3个左键路径和12个右键值的所有可能排列.它根据右侧拾取的值有选择地分配某个左键路径.

我正在使用NSRuleEditor的 …

cocoa nspredicateeditor appkit nspredicate nspredicateeditorrow

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

如何在Interface Builder中使用自定义NSView?

我已经看过很多关于如何在Interface Builder中创建自定义视图的教程.一切都适用于iOS,但MacOS应该相似,不是吗?我尝试了一些方法但没有一个完全成功.该init(coder:)呼叫的NIB实例化(通过Bundle.main.loadNibNamedNSNib,反过来,调用init(coder:)与无限递归结束了,如果我类我笔尖的主要观点为我的自定义类

如果我使用标准类,那么使文件的所有者我的自定义类工作得更好,但仍然是不对的.

是否有一个使用AppKit创建自定义控件的示例?我最接近的是显示自定义控件但没有自动布局设置有效.

它必须相当简单,但我还没想出来.

这是我到目前为止:

  1. 一个新类MyControl


import Cocoa

@IBDesignable class MyControl: NSView {

@IBOutlet var customView: NSView!  // The top level NSView
@IBOutlet weak var insideButton: NSButton!  // The button inside the view

let myName: String

required init?(coder: NSCoder) {
    super.init(coder: coder)

    if Bundle.main.loadNibNamed("MyControl", owner: self, topLevelObjects: nil) {
        addSubview(customView)
    }
}
Run Code Online (Sandbox Code Playgroud)

}

  1. 基于NSView的nib包含一个居中的NSButton.的File's Owner类设置为MyControl,顶层视图保持为NSView

  2. Main.storyboard已定制视图归类为MyControl具有的高度和宽度设定为中心.

当我查看Main.storyboard它有自定义视图的框架但它是空白.

当我运行应用程序时,显示的窗口是空白的.

macos appkit swift3 macos-sierra xcode8

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

如何有效地将图像数据从XPC服务移动到主应用程序

TL/DR:在XPC服务中解码图像的最有效方法是什么,将数据移动到主应用程序然后显示它?

在几个处理macOS上的XPC服务的WWDC视频中,作为使用XPC服务的良好候选者的一个例子是图像和视频的解码.我有一个应用程序,它做了很多图像解码,我想进入XPC服务,但我想更好地了解如何有效地将解码图像数据从XPC服务移动到主应用程序.在处理图像时可以使用许多API,而且我不清楚在XPC服务中使用哪种API是最有效的(和高性能的).

图像阅读:

  • 使用Apple的Image I/O框架和 CGImage
  • 使用核心图像和 CIImage
  • 使用第三方库 OpenImage IO

所有这三个API都可以采用文件路径并返回"图像数据".Apple的API倾向于进行"延迟解码",只在需要绘制图像时解压缩图像数据.第三方库往往只返回一个解码数据的缓冲区,然后可以CGImage在以后用它包装.

当你使用苹果的API在XPC服务进行解码的图像,你需要一种方式来获得结果返回到主应用程序既不CGImageCIImage可以在一个XPC连接进行本地传输.但是,Apple确实提供了两个API,用于通过XPC连接有效地传输通用数据:

  • IOSurface
  • dispatch_data

但是,使用其中任何一个都需要XPC服务完全解压缩映像.在CGImage需要被渲染为位图上下文或数据的消费者,而CIImage需要使用被渲染到目的地CIContext.这样做是否会否定在主应用程序中进行拆包时本来可以实现的任何好处?

(请注意,每个渲染图像的最终目标都是contentsa 的属性CALayer.)

使用a IOSurface而不是dispatch_data对象似乎是更好的解决方案,因为IOSurface可以使用(显然)作为contentsa CALayer.CIContext有一个用于渲染的API IOSurface,但CGImage / CGImageDestination没有.

(有一种迂回的使用方法,vImage从a CGImage到a CVPixelBuffer再到a IOSurface,但看起来......错了吗?)

当我想要做的就是显示每个图像的缩略图时,使用Core Image对我来说似乎有些过分.Image IO提供CGImageSourceCreateThumbnailAtIndex了完美的功能,并且运行良好.(特别是在RAW文件中,它将使用嵌入的JPEG缩略图,如果存在,而Core Image将解码RAW内容.)

最后,金属在哪里适合所有这些?通过在XPC服务中渲染到金属纹理然后​​发送它来获取任何东西吗?

通过使用XPC服务,我如何影响Image IO或Core Image在适当的时候有效使用GPU的能力?如何最小化复制的数据量(在进程之间以及CPU和GPU之间)?这些缩略图在滚动网格视图中呈现,因此性能优先.

macos cocoa xpc objective-c appkit

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