当我按下ESC键时,我试图获得一个自定义NSTextFieldCell(在a内NSOutlineView)结束编辑,但找不到任何方法来完成此操作.我试图为NSControlTextDidChangeNotification-notification 添加一个观察者,但它没有被激活,因为ESC-key也没有被keyDown触发NSOutlineView.
我使用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]将最初正确格式化数字,但如果我输入它,我再次无法输入小数点.
我在这里错过了什么?你会认为这很简单
我想从一个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文件构建一个,我不知道该怎么办?
我目前有一个NSPopover子类,它将内容视图控制器设置为一个自定义NSViewController,用于表示选项卡视图:
self.popover.contentViewController = tabViewController;
self.popover.animates = YES;
Run Code Online (Sandbox Code Playgroud)
我正在推出自己的"标签视图控制器",因为我听说NSTabViewController与动画效果不佳.我想使用自动布局,所以我不认为我想要使用popover的contentSize属性.当我更改标签时,弹出窗口会正确地更改其大小,但是,它不会为更改设置动画.此外,我有一个交叉淡入淡出动画,当选项卡视图切换并且弹出窗口没有调整大小直到动画结束后发生.
首先,我想弄清楚如何让popover调整为动画,然后我会担心让动画同步.
谢谢
我正在为macOS构建一个小型实用程序应用程序,它将SpriteKit与AppKit结合在一起.具体来说,我使用SKView作为应用程序窗口的"背景"(主要用于SpriteKit中更容易的特定类型的动画).我也在改变Window的background属性的颜色来调整标题栏颜色.在绿色和红色之间切换.
我遇到的问题是AppKit和SpriteKit之间的颜色匹配.简而言之,它们并不匹配.正如您在图像中看到的那样,标题栏与SKView略有不同.
经过一段时间的游戏后,我发现SKView中的背景颜色位于"设备RGB颜色空间"中,窗口颜色位于"sRGB IEC61966-2.1颜色空间"中.我将AppKit颜色更改为设备RGB,颜色仍然不匹配.
我正在使用常规的旧NSColor初始化程序创建颜色.
我不确定你是否可以改变颜色的颜色空间.Window和SKView上的backgroundColor属性是只读的.
有任何想法吗?
我有一个 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)
与相应的故事板:
代码构建后,结果是一个空窗口:
我想要的是这样的:
我应该如何实现这一点?
我有一个 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) 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,并且没有等效方法。
默认情况下,NSWindow如果/当视图发生变化时,托管 SwiftUI 视图的视图将自动调整大小以适应视图的大小。但是,如果更改是动画的,则窗口会跳转到最终大小而不使用动画。有没有办法使窗口大小与内容一起动画化?
我已经尝试过使用和不使用 SwiftUI 生命周期。我也尝试过调用该toggle方法NSAnimationContext.runAnimationGroup
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) 我想将应用程序中的文件(代表网络驱动器上的文件)拖到用户的桌面或 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) appkit ×10
macos ×6
swift ×6
cocoa ×4
swiftui ×4
objective-c ×2
autolayout ×1
colors ×1
ios ×1
nspopover ×1
nstableview ×1
nstextfield ×1
sprite-kit ×1
storyboard ×1