在 macOS 上的 SwiftUI 中将颜色从源拖放到目标

2024-06-23

如何将颜色从源拖放到目的地并保留它?我目前的代码可以临时执行此操作(从源拖动时更改目标的颜色),但在鼠标松开时它会很快变回原样。那么,如何才能使颜色更改保持在鼠标悬停在特定单元格上的状态,并且能够在将来将鼠标悬停在该特定单元格上拖动时再次更改该单元格呢?我当前的代码基于here https://stackoverflow.com/questions/58900316/draggesture-on-a-vstack-with-lot-of-buttons-how-to-detect-when-the-drag-is-insi.

import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack {
            ColorSource(color: .purple, color2: .orange)
            Spacer()
            ColorSource(color: .blue, color2: .pink)
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct DestinationDataKey: PreferenceKey {
    typealias Value = [DestinationData]

    static var defaultValue: [DestinationData] = []

    static func reduce(value: inout [DestinationData], nextValue: () -> [DestinationData]) {
        value.append(contentsOf: nextValue())
    }
}

struct DestinationData: Equatable {
    let destination: Int
    let frame: CGRect
}

struct DestinationDataSetter: View {
    let destination: Int

    var body: some View {
        GeometryReader { geometry in
            Rectangle()
                .fill(Color.clear)
                .preference(key: DestinationDataKey.self,
                            value: [DestinationData(destination: self.destination, frame: geometry.frame(in: .global))])
        }
    }
}

struct DestinationView: View {
    @Binding var active: Int
    let label: String
    let id: Int
    let color: Color

    var body: some View {
            Text(label).padding(10).background(self.active == id ? color : Color.green)
                .background(DestinationDataSetter(destination: id))
    }
}

struct ColorSource: View {
    @State var active = 0
    @State var destinations: [Int: CGRect] = [:]
    @State var color:Color
    @State var color2:Color
    @State var draggingFirstColor:Bool = false
    @State var draggingSecondColor:Bool = false

    var body: some View {
        VStack {

            Text("Drag From Here").padding().background(color)
                .gesture(DragGesture(minimumDistance: 0.1, coordinateSpace: .global)
                    .onChanged { value in
                        self.draggingFirstColor = true
                        self.active = 0
                        for (id, frame) in self.destinations {
                            if frame.contains(value.location) {
                                self.active = id
                            }
                        }
                    }
                    .onEnded { value in
                        // do something on drop
                        self.active = 0
                        self.draggingFirstColor = false

                    }
            )

            Text("Drag From Here").padding().background(color2)
                .gesture(DragGesture(minimumDistance: 0.1, coordinateSpace: .global)
                    .onChanged { value in
                        self.draggingSecondColor = true
                        self.active = 0
                        for (id, frame) in self.destinations {
                            if frame.contains(value.location) {
                                self.active = id
                            }
                        }
                    }
                    .onEnded { value in
                        // do something on drop
                        self.active = 0
                         self.draggingSecondColor = false
                    }
            )

            Divider()
            DestinationView(active: $active, label: "Drag Over Me", id: 1, color: (draggingFirstColor ? color : (draggingSecondColor ? color2 : Color.green)))
            DestinationView(active: $active, label: "Drag Over Me", id: 2, color: (draggingFirstColor ? color : (draggingSecondColor ? color2 : Color.green)))
            DestinationView(active: $active, label: "Drag Over Me", id: 3, color: (draggingFirstColor ? color : (draggingSecondColor ? color2 : Color.green)))
            DestinationView(active: $active, label: "Drag Over Me", id: 4, color: (draggingFirstColor ? color : (draggingSecondColor ? color2 : Color.green)))
        }.onPreferenceChange(DestinationDataKey.self) { preferences in
            for p in preferences {
                self.destinations[p.destination] = p.frame
            }
        }
    }
}

只是不要重置拖动颜色结束......或将其存储在某个地方(比如在模型中并在目的地中使用)

.onEnded { value in
    // do something on drop
    // self.active = 0
    // self.draggingFirstColor = false // same for second

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 macOS 上的 SwiftUI 中将颜色从源拖放到目标 的相关文章

  • Core Data + CloudKit 无法在其他设备上自动刷新?

    我的 SwiftUI 应用程序与 Core Data CloudKit 一起使用 我可以从 Mac 或 iPhone 将新条目保存到数据库中 该应用程序对所有设备使用完全相同的项目 代码库 唯一的问题是我需要关闭应用程序并重新打开它才能查看
  • 在 HStack 中以正确的方式对齐两个 SwiftUI 文本视图

    我有一个包含两行的简单列表视图 每行包含两个文本视图 查看一和查看二 我想对齐每行中的最后一个标签 查看两个 以便名称标签领先对齐并保持对齐 无论字体大小如何 第一个标签 查看一个 也需要前导对齐 我尝试在第一个标签 查看一个 上设置最小框
  • SwiftUI NavigationView 从其内部开始

    因此 我在页面视图样式的 TabView 中嵌入了一个 NavigationView 首次加载时 NavigationView 将在其内部启动 然后重新加载后即可正常显示 我不确定是什么原因造成的 我制作了一个 GIF 来更好地说明问题 这
  • 如何修复TabView中NavigationView中List下的灰色条?

    所以我遇到一个问题 在我的列表下方出现一个灰色条 当我单击一个单元格转到另一个视图时 会出现一个更大的灰色条 这是列表视图的代码 VStack NavigationView VStack List ForEach answersArray
  • 如何为PDFView设置PDFPageOverlayViewProvider?

    更新 我正在尝试设置pageOverlayViewProvider for a PDFView并且它没有按预期工作 PDFPageOverlayViewProvider方法没有被调用 PDFViewDelegate方法运行良好 struct
  • 更改 RealityKit 中 AnchorEntity 的旋转

    我在放置对象 3 秒后将 3d 对象放置到 ARViewController 中 然后我想将对象旋转 90 度 arView scene addAnchor anchorEntity DispatchQueue main asyncAfte
  • SwiftUI - ForEach 与 Stride

    我试图创建一个 Hstack d 卡列表 也就是说 我想创建一系列行的滚动视图 每行将包含一个 HStack 其中两个视图并排显示 并由某种列表数据结构初始化 struct MyHStackView View var myArray Som
  • SwiftUI 动画滑入和滑出

    我有一个视图将显示在另一个视图上 视图动画完美地从右侧滑入 但是当我单击 关闭 按钮时 视图消失 而没有在消失之前滑回右侧的所需动画 我尝试过使用 opacity self isShowing 1 0 但随后视图淡入和淡出 我需要它滑入和滑
  • 等高的 SwiftUI HStack

    我想要Text 111 具有相同的高度VStack包含 2222 和 333 struct Test7 View var body some View HStack alignment top Text 111 Shall have equ
  • 在其他数组中使用 ForEach 的索引

    为什么我不能使用 FromEach 的索引作为其他数组的索引 这个索引是Int 那么有什么问题呢 var word String return slova selector var symbols Array
  • 处理 SwiftUI 视图中的可选值/nil 值 - 在 SwiftUI 中使用 if let [重复]

    这个问题在这里已经有答案了 视图通常不允许可选参数值 从而导致类似的错误Initializer init requires that String conform to StringProtocol struct Person var na
  • 设备旋转时的 SwiftUI 重绘视图组件

    如何在 SwiftUI 中检测设备旋转并重新绘制视图组件 当第一个出现时 我有一个 State 变量初始化为 UIScreen main bounds width 的值 但当设备方向改变时 该值不会改变 当用户更改设备方向时 我需要重新绘制
  • 如何更改 SwiftUI 列表中分隔符的颜色?

    我在 SwiftUI 中创建了一个列表 我想更改颜色或删除分隔符 因为在 UIKit 中 我们可以轻松更改 TableView 中分隔符的颜色 下面是 SwiftUI 中列表的代码和 UI 图片 State private var user
  • SwiftUI 自动调整底部工作表的大小

    SwiftUI 有很多底部工作表的示例 但是它们都指定了使用 GeometryReader 工作表可以增长到的某种类型的最大高度 我想要的是创建一个底部工作表 其高度仅与其中的内容一样高 我使用首选项键提出了下面的解决方案 但必须有更好的解
  • 在 macOS 上的 SwiftUI 中将颜色从源拖放到目标

    如何将颜色从源拖放到目的地并保留它 我目前的代码可以临时执行此操作 从源拖动时更改目标的颜色 但在鼠标松开时它会很快变回原样 那么 如何才能使颜色更改保持在鼠标悬停在特定单元格上的状态 并且能够在将来将鼠标悬停在该特定单元格上拖动时再次更改
  • 如何定义可以接受不同实体的分段获取结果的通用 SwiftUI 视图

    我需要定义一个通用 SwiftUI 视图 它可以接受不同 CoreData 实体的分段获取结果 但我不确定如何定义通用视图 在下面的示例中 我定义了两个分段的获取结果Patient and Doctor实体 我需要能够将它们传递到通用视图
  • 文本字段中的 SwiftUI 颜色输入

    我遇到了 SwiftUI 的问题 当用户输入文本字段时 我需要将文本字段中的所有字母设置为红色 将所有数字设置为黑色 假设我有这个代码 TextField A99 text viewModel code padding trailing m
  • 如何将 UserDefaults 与 SwiftUI 结合使用?

    struct ContentView View State var settingsConfiguration Settings struct Settings var passwordLength Double 20 var moreSp
  • 从 SwiftUI 视图转至 UIViewController

    我正在努力将一些 SwiftUI 内容实现到我现有的应用程序中 我目前有一个 UIViewController 它托管一个用于相机预览的 MTKView 我创建了一个新的 SwiftUI 视图 它现在是我的root视图 如我的设置Scene
  • SwiftUI 显示带有绑定变量的工作表在首次显示时不起作用

    我试图在工作表中呈现一个带有 Binding String 变量的视图 该变量仅在 TextField 中显示 绑定该变量 在我的主 ContentView 中 我有一个字符串数组 我用 ForEach 循环遍历数组的索引来显示它 并显示一

随机推荐

  • 如何使用curl根据返回的etag缓存api响应?

    这是一个简短的问题 也可能对其他人有帮助 我有一个休息服务 它将为其端点上的每个 GET 查询返回正确的 ETAG 标头 现在 我还需要创建一个curl http 客户端来查询这些端点并使用etag 根据我的理解 在使用curl发出第一个请
  • Python:使用图像文件发布请求

    我有一台服务器 我正在尝试构建一个发布请求来取回数据 我认为实现此目的的一种方法是在标头中添加参数并发出请求 但我遇到了一些错误 我不太理解这些错误 无法继续 网页表单
  • opengl:向纹理添加更高分辨率的 mipmap

    每当我想在 opengl 中使用 mipmap 时 我需要上传最高分辨率位图作为 mipmap 级别 0 然后上传较高 mipmap 级别的较低分辨率位图 我希望能够添加更高分辨率的 mipmap 以及更低分辨率的 mipmap 目前我知道
  • 处理可变长度输入/输出数组,满足条件时终止计算(边界层计算)

    我正在尝试编写代码来计算机翼上的边界层发展 我从一组点开始 S 描述机翼的形状 我在这些点上运行无粘解算器并提取停滞点 这将是S The set of points S is now divided by the stagnation po
  • jquery 获取某个元素的第 n 个子元素的编号

    我有一类多个 DIV 元素 其中包含 p 元素列表 见下文 div class container p This is content 1 p p This is content 2 p p This is content 3 p div
  • 我正在为 cmd 编写包装器,但在重定向标准输入时遇到问题

    好的 这就是我正在做的 我想编写一个 net 应用程序 将标准输出 输入重定向到 Richtextbox 我已经让它工作得很好 但是一旦我将标准输入添加到混合中 我的读取命令就会冻结 这是我的表单中的相关代码 Shell new Proce
  • 导入 Cython 生成的 .so 文件时,此 ImportError 的含义是什么?

    我正在浏览 Cython 文档并构建每个示例应用程序 我在使用 C 库方面有点困难 成功构建 so 文件并尝试将其导入名为 test py 的 python 文件后 会引发以下错误 python3 2 test py Traceback m
  • .NET 安装项目期间的 COM 组件注册

    我有一个项目使用 Microsoft 的 COM 组件 该组件不是系统附带的 并且该 COM 组件的默认设置仅安装示例 它不运行regsvr32在组件上使其可用添加参考或者就此而言 帮助 CLR 找到 DLL 我正在发布的应用程序使用这个D
  • 如何将巨大的pandas数据帧保存到hdfs?

    我正在使用 pandas 和 Spark 数据框 数据帧总是非常大 gt 20 GB 标准 Spark 函数不足以满足这些大小 目前 我将 pandas 数据框转换为 Spark 数据框 如下所示 dataframe spark creat
  • Scala“对象”的继承

    我有这个Java代码 class Super public static void foo bar public static void bar out println BAR public static void main String
  • 为什么`UseAuthentication`必须放在`UseRouting`之后而不是之前?

    根据文档 https learn microsoft com aspnet core fundamentals middleware view aspnetcore 3 0 order 中间件的顺序应该是这样的 app UseStaticF
  • Android设置缩放动画的枢轴点

    我正在尝试将视图缩放到一定大小 但不太明白旋转是如何工作的 假设我只想向上缩放视图 pivotY 应该保持什么值 在 XML 中 它是一个百分比 以编程方式应用枢轴点时情况如何 Example ObjectAnimator scaleY O
  • 计算 torrent 文件的信息哈希

    我正在使用 C 解析 torrent 文件的信息哈希 与此站点相比 我无法获得 正确 的哈希值 http i tools org torrent http i tools org torrent 我构建了一个非常简单的玩具示例 只是为了确保
  • 为什么 kotlin 放弃了“new”关键字? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么 kotlin 放弃了new关键字 它使得更难看出函数调用和对象分配之间的区别 The Kotlin 编码约定 https kotlinl
  • Spring JUnit:如何在自动装配组件中模拟自动装配组件

    我有一个想要测试的 Spring 组件 该组件有一个自动装配属性 我需要更改该属性以进行单元测试 问题是 该类在构造后方法中使用自动装配组件 因此我无法在实际使用它之前替换它 即通过 ReflectionTestUtils 我该怎么做呢 这
  • Apple 搜索 API:从 iTunes 获取应用程序支持的最低操作系统

    在苹果论坛上发布了此消息 但没有得到回复 我一直在使用苹果提供的查找API从iTunes获取应用程序元数据 然而 我注意到我正在构建的应用程序需要一条重要信息 兼容性信息不会作为响应的一部分显式返回 我们确实获得了支持的设备列表等 但没有获
  • css按钮活动状态导致文本移动?

    我正在为我正在开发的新网站制作一些粗略的示例 由于某种原因 firefox 最新 中的后两个按钮将稍微移动文本 就像在进入活动状态时实现单击动画一样 为什么第一个按钮不会也遇到这个问题 下面的代码 fieldset style width
  • Haskell 如何将整数文字转换为不同类型?

    我有以下匿名函数 Exercises gt g Sum n gt Sum n 1 我这样使用它 Exercises gt g Sum 56 Sum getSum 55 Exercises gt g 56 Sum getSum 55 第二个例
  • PHP 方法链接:PSR 是否指定箭头对齐?

    如果链应该仅从类与方法开始对齐 是否有任何严格的要求 仅使用对齐的方法进行链接 this gt fooService gt doBar gt doBaz 上面的示例显示了方法内的对齐 链接所有东西都对齐 this gt fooService
  • 在 macOS 上的 SwiftUI 中将颜色从源拖放到目标

    如何将颜色从源拖放到目的地并保留它 我目前的代码可以临时执行此操作 从源拖动时更改目标的颜色 但在鼠标松开时它会很快变回原样 那么 如何才能使颜色更改保持在鼠标悬停在特定单元格上的状态 并且能够在将来将鼠标悬停在该特定单元格上拖动时再次更改