带 SwiftUI 的旋钮

2024-03-17

因此,我尝试使用旋钮复制正常的 SwiftUI 滑块功能。我已经对 UI 进行了编码,并且当前已连接到标准 SwiftUI 滑块以便旋转它。

现在我需要添加其余的滑块功能(即 $value、range、stride)和触摸功能(即上下左右拖动时旋钮旋转)。老实说,我不知道做到这一点的最佳方法。任何帮助是极大的赞赏。

以下是主文件,该项目可以在此处找到Github 滑块项目 https://github.com/brentbrinkley/CustomSlider/blob/main/Slider/FKKnob.swift

//
//  FKKnob.swift
//
//  Created by Brent Brinkley on 3/7/21.
//

import SwiftUI

struct FKKnob: View {
    // Set the color for outer ring and inner dash
    let color: Color
    
    // Minimum appearance value:
    let circleMin: CGFloat = 0.0
    
    // Maximum appearance value
    let circleMax: CGFloat = 0.9
    
    // Because our circle is missing a chunk of degrees we have to account
    // for this adjustment
    let circOffsetAmnt: CGFloat = 1 / 0.09
    
    // Offset needed to align knob properly
    let knobOffset: Angle = .degrees(110)
    
    // calculate the our circle's mid point
    var cirMidPoint: CGFloat {
        0.4 * circOffsetAmnt
    }
    
    // User modfiable control value
    @State var value: CGFloat = 0.0
    
    var body: some View {
        
        VStack {
            ZStack {
                
                // MARK: - Knob with dashline
                
                Knob(color: color)
                    .rotationEffect(
                        // Currently controlled by slider
                        .degrees(max(0, Double(360 * value )))
                    )
                    .gesture(DragGesture(minimumDistance: 0)
                                .onChanged({ value  in
                                    
                                    // Need help here setting amount based on x and y touch drag
                                    
                                }))
                
                // MARK: - Greyed Out Ring
                
                Circle()
                    .trim(from: circleMin, to: circleMax)
                    .stroke(Color.gray ,style: StrokeStyle(lineWidth: 6, lineCap: .round, dash: [0.5,8], dashPhase: 20))
                    .frame(width: 100, height: 100)
                
                // MARK: - Colored ring inidicating change
                
                Circle()
                    .trim(from: circleMin, to: value)
                    .stroke(color ,style: StrokeStyle(lineWidth: 6, lineCap: .round, dash: [0.5,8], dashPhase: 20))
                    .frame(width: 100, height: 100)
                
            }
            .rotationEffect(knobOffset)
            
            Text("\(value * circOffsetAmnt, specifier: "%.0f")")
            
            Slider(value: $value, in: circleMin...circleMax)
                .frame(width: 300)
                .accentColor(.orange)
        }
    }
}

struct DashedCircle_Previews: PreviewProvider {
    static var previews: some View {
        FKKnob(color: Color.orange)
    }
}

这是我在我的一个项目中使用的版本。

当拖动开始时,它会设置一个初始值(存储在startDragValue)。这是因为您总是希望该值的修改基于您开始时的旋钮值。

然后,我决定仅根据 y 轴更改值。道理是这样的:一could根据从 x1, y1 到 x2, y2 的绝对距离进行更改,但是在尝试获取负值时会遇到问题。例如,右上象限整体增加可能是有意义的——但是左上象限呢——它会导致正变化(因为 y 轴变化)还是负变化(因为 x 轴变化)?轴)?

如果您决定走 x,y 更改的路线,此方法仍然可以帮助您进行设置。

struct ContentView: View {
    @State var value : Double = 0.0
    @State private var startDragValue : Double = -1.0
    var body: some View {
        Text("Knob \(value)")
            .gesture(DragGesture(minimumDistance: 0)
            .onEnded({ _ in
                startDragValue = -1.0
            })
            .onChanged { dragValue in
                let diff =  dragValue.startLocation.y - dragValue.location.y
                if startDragValue == -1 {
                    startDragValue = value
                }
                let newValue = startDragValue + Double(diff)
                value = newValue < 0 ? 0 : newValue > 100 ? 100 : newValue
            })
    }
}

我的滑块将值设置为距控件向上或向下 100 pt,但您显然也可以根据自己的喜好更改这些值。

就范围而言,我建议始终将旋钮从 0.0 转到 1.0,然后对值进行插值。

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

带 SwiftUI 的旋钮 的相关文章

随机推荐

  • 在 OpenGL-ES 2.0 中渲染多个 2D 图像

    我是 OpenGL 新手 正在尝试学习 ES 2 0 首先 我正在开发一款纸牌游戏 需要渲染多个纸牌图像 我跟着这个http www learnopengles com android lesson four introducing bas
  • Redux 框架在插件中使用时不工作

    我将使用 redux 框架作为我的插件选项 它显示在管理面板中 我可以保存设置 我使用了选项面板的示例配置文件 所以问题是我没有通过打印全局来获取选项值opt name多变的 如果我将 redux 框架配置文件添加到主题functions
  • CSS/HTML:在输入字段周围创建发光边框

    我想为我的表单创建一些像样的输入 并且我真的很想知道 TWITTER 如何在输入周围制作发光边框 Twitter 边框示例 图片 我也不太知道如何创建圆角 干得好 glowing border border 2px solid dadada
  • Eclipse:如何有选择地禁用某些注释中的拼写检查

    我使用的是 Eclipse Kepler 版本 如何禁用评论内的拼写检查 我确实看到 窗口 首选项 常规 编辑器 文本编辑器 拼写 但此表没有关于禁用注释内拼写检查的选项 理想情况下 我想禁用特定评论的拼写检查 在其他地方 拼写检查注释可能
  • 如何在 pygame 中进行二段跳?

    有人可以帮我调试我的代码吗 因为我不明白为什么我不能让我的角色用多个空格键进行双跳 当我运行脚本时 我可以向上 向下 向左 向右移动 但是一旦我按一次空格键 对象就会飞出窗口 问题出在这个 if 语句上 所以我猜测这个 if 语句会继续运行
  • 绑定 UserControl 依赖属性和 MVVM

    我有一个包含 UserControl 的 MainWindow 两者都以 MVVM 模式实现 MainWindowVM 具有我想要绑定到 UserControl1VM 中的属性的属性 但这行不通 这是一些代码 视图模型使用某种 mvvm 框
  • 将异步获取的数据传递给子 props

    我正在制作一个应用程序 它从远程源获取一系列新闻项目并将其显示在页面上 我有端点 并且可以使用控制台日志证明可以进行成功的调用 getJSON 我将此调用放入父组件中 因为子组件需要使用数据 但是 当我将此数据传递给子组件时 会出现控制台错
  • DataStorage 和查询未实现将 indexed=False 更改为 True

    在我的模型中 我有一个属性设置为indexed False 要在投影中使用它 我必须将其更改为indexed True 但令人惊讶的是 现在执行查询不会给出任何结果 始终为空 任何重新索引表的提示或为什么结果集为空 https develo
  • 如何正确配置QDockWidget使其显示/隐藏?

    我是 Qt GUI 的新手 最初想配置一个 Qt Dock 小部件 该小部件在按下某个键 假设为 A 时显示 并在按下另一个键 假设为 B 时隐藏 但经过一番研究 我没有找到任何相关的解决方案 我尝试创建一个切换按钮 第一次按下时将显示停靠
  • Postgres 中的 NOCYCLE

    我有一个 Oracle 查询NOCYCLE我必须将其翻译为 Postgres 的条款 SELECT FG ID CONNECT BY ROOT FG ID as Parent ID FROM FG t START WITH t Parent
  • Networkx:可视化 MultiGraph 时重叠边缘

    以下多重图使用 graphviz neato 正确绘制 即平行边不重叠 生成 png 如图所示 这个答案 https stackoverflow com questions 14943439 how to draw multigraph i
  • npm install 上出现 ENOTDIR 错误(节点 4 上的 npm 3。我知道:旧版。抱歉 :( )

    首先 我很抱歉在这里报告 npm3 的问题 但看起来旧的存储库当前处于只读模式 我们有一个又大又旧的 AngularJS 前端应用程序 它需要 Node4 并使用 npm3 几天前 有人执行 npm install 时出现了一个问题 err
  • Python doctest:跳过整个块?

    我有一个在类方法中包含文档字符串的 Python 模块 以及模块文档字符串中的一个真实示例 区别在于方法文档字符串经过精心设计 成为完全可重复的测试 而现实世界的示例只是 Linux shell 历史记录的复制粘贴 它碰巧调用了 pytho
  • Apache JMeter 的 Cookie 管理器未将 cookie 添加到 POST 请求

    我制定了非常简单的测试计划 登录 POST 返回会话cookie 获取状态 GET 返回用户状态 创建资源 POST 为资源提供 JSON 正文 所以我的 测试计划 如下所示 Test Plan Thread Group HTTP 请求默认
  • $_SESSION 设置为有效登录后 isset() 不起作用

    我有这个 loginform php 和这部分代码 这是从带有登录表单的 index php 调用的 include config php if isset POST submit username POST username passwo
  • UIViewControllerHierarchyInconsistency 仅在 iOS 8 和 Xcode 6 中导致应用程序崩溃

    我有一个在 iOS 7 和 Xcode 5 中运行良好的应用程序 当我将其更新到 iOS 8 和 Xcode 6 时 当点击文本字段时应用程序尝试在视图中向上滑动 UIDatePicker 时 它会崩溃 我正在使用故事板 有人知道为什么吗
  • C++ 中的等效 LinkedHashmap?

    我有一个 Java 程序 我想将其转换为 C 所以 有一个LinkedhashmapJava代码中使用的数据结构 我想将其转换为C 是否有等效的数据类型LinkedHashmap in C 我尝试使用std unordered map但是
  • 使用 NumPy reduceat 计算基于组的平均值

    import numpy as np import pandas as pd dummies np array pd get dummies list abdccadab categorical IV groupIDs np array 1
  • Protractor 和 Cucumber:使用 async/await 函数超时

    我正在使用 Angular 5 Protractor 和 Cucumber 进行 e2e 和 bdd 测试 当我在终端上运行时ng e2e我收到以下错误 当我打开页面 e2e steps home steps ts 15 错误 函数超时 确
  • 带 SwiftUI 的旋钮

    因此 我尝试使用旋钮复制正常的 SwiftUI 滑块功能 我已经对 UI 进行了编码 并且当前已连接到标准 SwiftUI 滑块以便旋转它 现在我需要添加其余的滑块功能 即 value range stride 和触摸功能 即上下左右拖动时