标签: appkit

如何在按下ESC键后在NSOutlineView内的NSTextFieldCell中结束编辑

当我按下ESC键时,我试图获得一个自定义NSTextFieldCell(在a内NSOutlineView)结束编辑,但找不到任何方法来完成此操作.我试图为NSControlTextDidChangeNotification-notification 添加一个观察者,但它没有被激活,因为ESC-key也没有被keyDown触发NSOutlineView.

cocoa objective-c appkit nstextfieldcell

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

NSNumberFormatter不允许输入十进制数字

我使用NSNumberFormatter完全不知所措.这应该是完全简单但我不能让它工作.

我想设置一个NSTextField以允许输入十进制数字,或者带小数点或不带小数点.以下是我认为可行的方法:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:4];
[formatter setAllowsFloats:YES];
[[timeFlowMultiplierTF cell] setFormatter:formatter];
Run Code Online (Sandbox Code Playgroud)

但是,在文本字段中键入时,按小数点的"句点"键不会产生一个.键入"3.14"给我"314".抛出[formatter setAlwaysShowsDecimalSeparator:YES]将最初正确格式化数字,但如果我输入它,我再次无法输入小数点.

我在这里错过了什么?你会认为这很简单

macos cocoa nstextfield appkit nsnumberformatter

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

如何在Swift中初始化NSWindowController?

我想从一个nib文件初始化一个窗口控制器对象,这很简单吗?但我根本无法让它发挥作用.

根据我之前在ObjC的经验,我写下了以下代码:

init()  {
    super.init(windowNibName: "SplitWindowController")
}
Run Code Online (Sandbox Code Playgroud)

在app委托文件中,我只需初始化并显示窗口:

var myWindowController: MyWindowController = MyWindowController()
myWindowController.showWindow(self)
myWindowController.window.makeKeyAndOrderFront(nil)
Run Code Online (Sandbox Code Playgroud)

但是编译器给了我这个错误:Must call a designated initializer of the superclass 'NSWindowController'.并根据雨燕版本NSWindowController定义,只有3个指定的初始值,即init(),init(window),init(coder).我不知道接下来该做什么.我应该NSCoder从一个nib文件构建一个,我不知道该怎么办?

cocoa appkit swift

9
推荐指数
2
解决办法
5949
查看次数

如何使用自动布局自动调整NSPopover的大小

我目前有一个NSPopover子类,它将内容视图控制器设置为一个自定义NSViewController,用于表示选项卡视图:

    self.popover.contentViewController = tabViewController;
    self.popover.animates = YES;
Run Code Online (Sandbox Code Playgroud)

我正在推出自己的"标签视图控制器",因为我听说NSTabViewController与动画效果不佳.我想使用自动布局,所以我不认为我想要使用popover的contentSize属性.当我更改标签时,弹出窗口会正确地更改其大小,但是,它不会为更改设置动画.此外,我有一个交叉淡入淡出动画,当选项卡视图切换并且弹出窗口没有调整大小直到动画结束后发生.

首先,我想弄清楚如何让popover调整为动画,然后我会担心让动画同步.

谢谢

cocoa objective-c appkit autolayout nspopover

9
推荐指数
0
解决办法
473
查看次数

匹配AppKit和SpriteKit颜色

我正在为macOS构建一个小型实用程序应用程序,它将SpriteKit与AppKit结合在一起.具体来说,我使用SKView作为应用程序窗口的"背景"(主要用于SpriteKit中更容易的特定类型的动画).我也在改变Window的background属性的颜色来调整标题栏颜色.在绿色和红色之间切换.

我遇到的问题是AppKit和SpriteKit之间的颜色匹配.简而言之,它们并不匹配.正如您在图像中看到的那样,标题栏与SKView略有不同.

在此输入图像描述

经过一段时间的游戏后,我发现SKView中的背景颜色位于"设备RGB颜色空间"中,窗口颜色位于"sRGB IEC61966-2.1颜色空间"中.我将AppKit颜色更改为设备RGB,颜色仍然不匹配.

我正在使用常规的旧NSColor初始化程序创建颜色.

我不确定你是否可以改变颜色的颜色空间.Window和SKView上的backgroundColor属性是只读的.

有任何想法吗?

macos colors appkit sprite-kit swift

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

在 AppKit 视图中嵌入 SwiftUI 视图

我有一个 SwiftUI 视图MySwiftUIView

import SwiftUI

struct MySwiftUIView: View {
    var body: some View {
        Text("Hello, World!")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将它用作 AppKit 视图的一部分。我尝试了以下代码:

import Cocoa
import SwiftUI

class MyViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview( NSHostingView(rootView: MySwiftUIView()) )
    }
}
Run Code Online (Sandbox Code Playgroud)

与相应的故事板:

故事板

代码构建后,结果是一个空窗口:

在此输入图像描述

我想要的是这样的:

在此输入图像描述

我应该如何实现这一点?

macos storyboard appkit swift swiftui

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

NSTableView 在第一行上方有不需要的空间

我有一个 NSTableView,它的第一行从顶部向下推 10 pt。标题被关闭,没有组行,单元格间距为 0,封闭滚动视图的内容插入为 0。


更新

这是一个演示该问题的示例项目


这是视图层次结构调试器的抓图:

在此处输入图片说明

这是NSTableRowView在视图层次结构调试器中暂停时第一行的垂直约束:

在此处输入图片说明

我尝试实现委托的tableView(_:didAdd:forRow:)并检查约束,首先使用约束AffectingLayout (for:)

[<NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500   (active)>]
Run Code Online (Sandbox Code Playgroud)

然后打印所有行视图的约束

  - 0 : <NSLayoutConstraint:0x60000390bcf0 'NSTableRowView_Encapsulated_Layout_Width' NSTableRowView:0x7fdb12e26eb0.width == 329 priority:500   (active)>
  - 1 : <NSLayoutConstraint:0x60000390bd40 'NSTableRowView_Encapsulated_Layout_Height' NSTableRowView:0x7fdb12e26eb0.height == 24 priority:500   (active)>
  - 2 : <NSAutoresizingMaskLayoutConstraint:0x60000390bbb0 h=--& v=-&- InlineCell.minX == 16   (active, names: InlineCell:0x7fdb12e283a0, '|':NSTableRowView:0x7fdb12e26eb0 )>
  - 3 : <NSAutoresizingMaskLayoutConstraint:0x60000390bc00 h=--& v=-&- InlineCell.width == 297   (active, names: InlineCell:0x7fdb12e283a0 )>
  - 4 …
Run Code Online (Sandbox Code Playgroud)

macos nstableview appkit macos-big-sur

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

AppKit 中的 SwiftUI 视图到 NSImage

SwiftUI 2.0 | 斯威夫特 5.4 | Xcode 12.4 | macOS 大苏尔 11.4

在 iOS 中,有一种方法可以将 SwiftUI 视图渲染为 UIImage,但该方法在 AppKit 中不起作用,仅在 UIKit 中起作用:

extension View {
    func snapshot() -> UIImage {
        let controller = UIHostingController(rootView: self)
        let view = controller.view

        let targetSize = controller.view.intrinsicContentSize
        view?.bounds = CGRect(origin: .zero, size: targetSize)
        view?.backgroundColor = .clear

        let renderer = UIGraphicsImageRenderer(size: targetSize)

        return renderer.image { _ in
            view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么解决方法可以让它在 AppKit 上运行吗?该方法UIGraphicsImageRenderer(size:)不适用于 AppKit,并且没有等效方法。

appkit swift swiftui

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

根据 SwiftUI 的变化对 NSWindow 的大小变化进行动画处理

默认情况下,NSWindow如果/当视图发生变化时,托管 SwiftUI 视图的视图将自动调整大小以适应视图的大小。但是,如果更改是动画的,则窗口会跳转到最终大小而不使用动画。有没有办法使窗口大小与内容一起动画化?

我已经尝试过使用和不使用 SwiftUI 生命周期。我也尝试过调用该toggle方法NSAnimationContext.runAnimationGroup

Gif 显示 SwiftUI 视图有动画,但窗口跳转到最终位置而没有动画

struct ContentView: View {
    @State var isExpanded = false
    
    var body: some View {
        VStack {
            Button(isExpanded ? "Close" : "Open", action: toggleExpand)
            
            if isExpanded {
                ForEach(0..<5) { count in
                    Text("\(count). Some Item")
                }
            }
        }
        .padding()
        .fixedSize()
    }
    
    func toggleExpand() {
        withAnimation(.easeInOut(duration: 1)) { isExpanded.toggle() }
    }
}
Run Code Online (Sandbox Code Playgroud)

macos appkit swift swiftui

9
推荐指数
0
解决办法
957
查看次数

如何在 SwiftUI 中以异步方式使用 Transferable?

我想将应用程序中的文件(代表网络驱动器上的文件)拖到用户的桌面或 Finder 窗口。因此,只有在拖放操作结束后才应下载该文件。

使用 AppKit 我可以使用File Promises实现此行为。但对于 SwiftUI 来说,似乎没有等价的东西。唯一的选择是使用NSItemProvideror Transferable(或两者组合)(请参阅此问题)。但既不NSItemProvider也不Transferable支持这种异步行为。

主要问题是在拖动会话开始时调用itemProvider闭包FileRepresentation,从而也开始下载文件。这使得该功能无法使用,例如,如果您一次拖动一个大文件或多个文件。

struct Item: Identifiable, Transferable {
    let id = UUID()
    let name: String
    let description: String
    let url: URL

    static var transferRepresentation: some TransferRepresentation {
        FileRepresentation(contentType: .fileURL) { (item: DragItem) in
            let urlSession = URLSession(configuration: .default)
            // This download is already started when the drag & drop session starts
            let (tempURL, response) = try! await …
Run Code Online (Sandbox Code Playgroud)

macos appkit ios swift swiftui

9
推荐指数
0
解决办法
501
查看次数