我有一个NSWindow
。使用NSWindowDelegate
,我可以处理windowWillMove()
和windowDidMove()
事件。windowWillMove()
被调用一次,就在窗口开始拖动时,这对于识别拖动的开始非常理想。
但是,windowDidMove()
即使用户仍在拖动窗口,只要窗口移动,它就会启动。如何识别用户已结束拖动,并且窗口现在处于最终位置?
我有一个NSWindow
。使用NSWindowDelegate
,我可以处理windowWillMove()
和windowDidMove()
事件。windowWillMove()
被调用一次,就在窗口开始拖动时,这对于识别拖动的开始非常理想。
但是,windowDidMove()
即使用户仍在拖动窗口,只要窗口移动,它就会启动。如何识别用户已结束拖动,并且窗口现在处于最终位置?
我可能忽略了一些显而易见的问题,但我找不到解决办法。我希望 List() 的高度有限,这样我就可以在里面滚动了。以下是示例代码:
struct TestView: View {
var items: [String] = [
"Item 1", "Item 2", "Item 3",
"Item 4", "Item 5", "Item 6",
"Item 7", "Item 8", "Item 9",
"Item 10"
]
@State var selected: String = "one"
var body: some View {
Form {
Section(header: Text("A section")) {
List(selection: $selected) {
ForEach(items, id: \.self) { item in
Text(item)
}
}
.frame(height: 100)
}
}
.formStyle(.grouped)
}
}
我原本以为 List 允许我在 100pt 高度内滚动,结果却直接被截断了,根本无法滚动。如果我把整个 List 包裹在 ScrollView 里,所有内容都会消失。
如何在明确限定的空间内实现列表的滚动?
我正在制作一个基于 Section() 的自定义 SwiftUI 视图。我的基本代码如下所示,其工作原理如下:
struct SettingsSection<Header: View, Content: View>: View {
var header: () -> Header
var content: () -> Content
init(@ViewBuilder header: @escaping () -> Header, @ViewBuilder content: @escaping () -> Content)
{
self.header = header
self.content = content
}
var body: some View {
Section(content: {
content()
}, header: {
header()
})
}
}
但是我想添加一个更简单的 init,它只接受字符串作为标头。我尝试执行以下操作:
init(_ headerStr: String, @ViewBuilder content: @escaping () -> Content) {
self.init(header: {
Text(headerStr)
}, content: content )
}
但是如果像这样使用 SettingsSection,我会收到错误“无法推断通用参数‘Header’”,这正是我想要的:
SettingsSection("Actions") {
// ... content of the section
}
我可以理解使用这个新的 init() 没有指定 Header 类型,但肯定有一种方法可以创建这种简化的构造函数......我是对的吗?
我正在尝试使用 swift 高效地计算 macOS/iOS 上图像的香农熵(-sum(pi * log pi) 公式)。我找到了 Accelerate 框架和 vImage 函数,它们看起来像我正在寻找的,但是文档很少,我迷失了方向。
我正在像这样创建 vImage 缓冲区
var format = vImage_CGImageFormat(
bitsPerComponent: 8,
bitsPerPixel: 8 * 4,
colorSpace: CGColorSpace(name: CGColorSpace.displayP3)!,
bitmapInfo: .init(rawValue: CGImageAlphaInfo.noneSkipFirst.rawValue))!
let buf = try vImage.PixelBuffer(
cgImage: cg,
cgImageFormat: &format,
pixelFormat: vImage.Interleaved8x4.self)
我的想法是,根据此页面,通过 将其转换为 1 通道灰度缓冲区 ( vImage.PixelBuffer<vImage.Planar8>
) :https: //developer.apple.com/documentation/accelerate/converting_color_images_to_grayscale。然后从中创建直方图,然后手动迭代其 256 个值并计算总和。但是,似乎根本没有方法……while有。buf.multiply()
vImage.PixelBuffer<vImage.Planar8>
histogram()
vImage.PixelBuffer<vImage.Interleaved8x4>
你能指导我正确的做法吗?