AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-14840926

Curious Jorge's questions

Martin Hope
Curious Jorge
Asked: 2025-03-08 04:02:14 +0800 CST

我们如何使 Swift Charts 中的 chartXAxis 区域注册 chartXSelection 的点击?

  • 6

我很好奇,有没有办法告诉chartXSelection(value:)修饰符在响应用户手势时包含 x 轴区域?我知道在图表区域中开始点击并向下拖动是可行的,但我希望用户只需点击 x 轴上他们喜欢的值,然后通过 注册即可chartXSelection。

请参阅下面的示例代码(经过编辑,包含高 axisMarks 来演示一个建议解决方案的问题):

private struct PlotPoint {
    let x: Double
    let y: Double
}

private struct PlotSeries: Identifiable {
    let id: Int
    let name: String
    let points: [PlotPoint]
}

private let data: [PlotSeries] = [
    PlotSeries(id: 0, name: "Series A", points: stride(from: 0.0, through: 1.0, by: 0.05).map { y in PlotPoint(x: y*y, y: y) }),
    PlotSeries(id: 1, name: "Series B", points: stride(from: 0.0, through: 1.0, by: 0.05).map { y in PlotPoint(x: y*y, y: y/2) })
]

struct AxisTap: View {
    @State private var selectedX: Double?
    var body: some View {
        VStack {
            Chart {
                if let selectedX {
                    BarMark(xStart: .value("x", selectedX), xEnd: .value("x", selectedX + 0.05))
                        .foregroundStyle(.yellow.opacity(0.5))
                }

                ForEach(data) { series in
                    let plot = LinePlot( series.points, x: .value("x", \.x), y: .value("y", \.y))
                    
                    plot
                        .symbol(by: .value("Series", series.name))
                        .foregroundStyle(by: .value("Series", series.name))
                }
            }
            .chartXAxis {
                AxisMarks() { value in
                    AxisGridLine()
                    AxisTick()
                    AxisValueLabel() {
                        if let axisValue = value.as(Double.self) {
                            VStack {
                                Text("|")
                                Text("v")
                                Text("\(axisValue.formatted())")
                            }
                        }
                    }
                }
            }
            .chartXSelection(value: $selectedX)
            .padding()
            Text("selectedX is: \(selectedX ?? 0.0)")
        }
    }
}

我希望用户能够点击 x 轴上的“0.5”并获得如下所示的结果(下面显示“selectedX 是:~0.5”)。

选定值接近 0.5 的图表

swiftui
  • 1 个回答
  • 38 Views
Martin Hope
Curious Jorge
Asked: 2024-11-25 12:27:46 +0800 CST

在 ViewThatFits 中并设置了 maxWidth 时,如何防止文本截断?

  • 5

我很好奇,有人遇到过这种情况吗?我遇到过这样一种情况:宽度受限的视图内的长文本被不必要地截断,以便垂直适合父级。有没有办法关闭这种截断?

以下代码演示了这个问题:

struct TextTruncator: View {
    @State private var longText = false
    var body: some View {
        Toggle("Long Text", isOn: $longText).padding()
        essay
    }
    
    var essay: some View {
        VStack {
            paragraph
            if longText {
                paragraph
                paragraph
                paragraph
            }
        }
        .frame(maxWidth: 200)
    }
    
    var paragraph: some View {
        Text("+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
    }
}

我们如何才能禁用使用长文本时发生的截断?当然,人们自然会想到将文本放在 ScrollView 中,如下所示:

    var body: some View {
        Toggle("Long Text", isOn: $longText).padding()
        ScrollView {
            essay
        }
    }

但这不符合我的需求,因为在我的实际上下文中,我的 Text 等效项后面跟着一些其他控件,我希望这些控件紧跟在 Text 后面。如果我像上面一样使用 ScrollView,即使 Text 很短,scrollView 也会扩展以填满屏幕,我的控件会离 Text 太远。

因此,我尝试使用 ViewThatFits 来解决这个问题,让 SwiftUI 自动从原始文本切换到嵌入在 ScrollView 中的版本。所以我们最终得到了这样的结果:

    var body: some View {
        Toggle("Long Text", isOn: $longText).padding()
        ViewThatFits {
            essay
            ScrollView {
                essay
            }
        }
        Button("My Controls") {}
        Spacer()
    }

这就是截断真正成为问题的地方。它阻止了 Text 部分足够大,从而触发 ViewThatFits 切换到 ScrollView 版本,而这正是我想要的。

哦,顺便说一下,这.frame(maxWidth:)是必要的,因为否则,即使是单个文本也会太宽,以至于总是会触发切换到 ScrollView 版本。

因此,理想情况下,我希望有一种方法可以防止文本截断,但如果有人可以建议另一种方法来实现我需要的布局,那就太好了!

swiftui
  • 1 个回答
  • 31 Views
Martin Hope
Curious Jorge
Asked: 2024-07-27 09:46:54 +0800 CST

使用 SwiftData 和 @Observable 时如何避免死锁/挂起?

  • 7

我很好奇是否有人能轻易发现我的错误。我遇到了一个问题,我的应用程序在调用 sleep 时挂起。我最好的猜测是,这是使用 SwiftData 和 @Observable 导致的死锁。我已将代码精简为一个最小的 SwiftUI 应用程序,该应用程序在按下“开始”按钮几秒钟后始终挂起(Xcode 15.4)。我可能做错了什么,但我无法发现它。

代码如下:

import SwiftUI
import SwiftData
import os

private let logger = Logger(subsystem: "TestApp", category: "General")


@Observable
class AppState {
    var queue: [Item] = []
}

@Model
final class Item {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var items: [Item]
    @State private var state = AppState()
//    @State private var queue = [Item]()
    
    @State private var testsRunning = false
    @State private var remoteTask: Task<(), Never>?
    @State private var syncTask: Task<(), Never>?

    
    var body: some View {
        VStack {
            Button ("Begin") {
                Task { await runTests() }
                testsRunning = true
            }.disabled(testsRunning)
            Text("Remote Queue: \(state.queue.count)")
            List (items) {
                Text($0.name)
            }
        }
    }
}

extension ContentView {
    @MainActor func runTests() async {
        for item in items {
            modelContext.delete(item)
        }
        state.queue.removeAll()
        
        startRemoteWork()
        startSync()
    }
    
    @MainActor func startRemoteWork() {
        // Adds non-inserted SwiftData items in an array to simulate data in cloud
        remoteTask = Task.detached {
            while true {
                await sleep(duration: .random(in: 0.2...0.5))
                let newItem = Item(name: "Item \(items.count + state.queue.count + 1)")
                state.queue.append(newItem)
                logger.info("\(Date.now): \(newItem.name) added to remote queue")
            }
        }
    }
    
    @MainActor func syncQueuedItems() async {
        // removes items from remote queue and inserts them into local SwiftData context.
        while !state.queue.isEmpty
        {
            let item = state.queue.removeFirst()
            
            modelContext.insert(item)
            let delay = Double.random(in: 0.01...0.05)
            logger.info("    \(Date.now): syncing \(item.name) (will take \(delay) seconds)...")
            await sleep(duration: delay)    // simulating work
            logger.info("    \(Date.now): Done")
        }
    }
    
    @MainActor func startSync() {
        syncTask = Task.detached {
            logger.info("  \(Date.now): Sync Task Started")
            while true {
                await syncQueuedItems()
                logger.info("  \(Date.now): Sync Task sleeping for 3 seconds till next sync")
                await sleep(duration: 3)
            }
        }
    }
    
    func sleep(duration: Double) async {
        do {
            try await Task.sleep(nanoseconds: UInt64(duration * 1_000_000_000))
        } catch { fatalError("Sleep failed") }
    }
}

#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}

我知道如果我将代码更改为不使用 SwiftData(用将保存在本地状态存储中的普通结构替换 Item),那么就不会出现问题。此外,如果我将队列数组从 AppState @Observable 移动到本地状态存储,那么就不会出现问题。因此,我有些不确定地得出结论,问题与两者的结合有关。有人能指出我做错了什么吗?

swiftui
  • 1 个回答
  • 60 Views
Martin Hope
Curious Jorge
Asked: 2023-11-15 05:51:52 +0800 CST

如何在不使用 .XXX(by:) API 的情况下显式指定 Swift Charts 中绘制数据点的系列?

  • 6

.symbol(by:)我很好奇,如果您不能使用像and这样的 API foregroundStyle(by:)(即 Apple 文档中标题“将数据编码为标记特征”下列出的任何 API),有没有办法指定 Swift 图表数据所属的系列。

我遇到的情况是,我在图表中覆盖了符号和 foregroundStyle,因此我无法使用上述提供自动符号和样式的选项,但也无法指定数据的系列。因此,我正在寻找另一个函数,它可以直接向 Swift Charts 指示该系列是什么,而不是作为其他操作的副作用。

这是一些显示问题的代码(为简单起见,我省略了符号):

import Charts

struct ExplicitSeries: View {
    func chartPoint(x: Double, y: Double, series: Int) -> some ChartContent {
        LineMark(
            x: .value("Day", x),
            y: .value("Total", y)
        )
//        .foregroundStyle(by: .value("Count", "Series \(series)"))
        .foregroundStyle( series == 0 ? Color.blue : Color.green)
    }
    
    var body: some View {
        Chart {
            chartPoint(x: 0, y: 0, series: 0)
            chartPoint(x: 1, y: 1, series: 0)
            chartPoint(x: 0, y: 0.5, series: 1)
            chartPoint(x: 1, y: 0, series: 1)
        }
        .padding()
    }
}

结果如下:

不知道系列的图表

我们没有两个不同的系列(一个蓝色和一个绿色),而是一个蓝色系列。取消注释该.foregroundStyle(by:)行将给出我正在寻找的结果(但无法覆盖颜色):

在此输入图像描述

swiftui
  • 1 个回答
  • 18 Views
Martin Hope
Curious Jorge
Asked: 2023-10-16 01:53:10 +0800 CST

如何在 SwiftUI 中裁剪文本而不是省略号(“...”)

  • 5

我很好奇,有人知道如何防止 SwiftUI 用省略号替换不适合视图的文本吗?我正在尝试重现 iOS 提醒应用中滑动删除控件的确切外观和感觉,如果你看看它的行为方式,你会发现它只是在没有足够的文本时裁剪文本充分展示它们的空间。当我尝试重现此内容时,文本被替换为省略号(“...”)。有没有办法改变这种行为?

这是它在“提醒”中的外观:

在此输入图像描述

这是我的版本的样子:

在此输入图像描述

这是我的版本的代码:

struct CroppedText: View {
    var text: String
    var color: Color
    var body: some View {
        Text(text)  // How to avoid the "..."?
            .lineLimit(1)
            .foregroundStyle(.white)
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(color)
    }
}

struct TripleText: View {
    @State private var totalWidth = 120.0
    
    var body: some View {
        VStack {
            HStack(spacing: 0) {
                CroppedText(text: "Details", color: .secondary)
                CroppedText(text: "Flag", color: .orange)
                CroppedText(text: "Delete", color: .red)
            }
            .frame(width: totalWidth, height: 50)
            
            HStack {
                Text("Width: ")
                Slider(value: $totalWidth, in: 1...300)
            }
        }
        .padding()
    }
}

想一想,解决方案似乎必须包括一种机制,以防止文本在可用空间中居中(如果空间太小)。这似乎指向一个涉及复杂ZStack而不是直接的解决方案HStack。.clipped()也许我们不会裁剪文本,而是主要对它们进行分层(尽管仍然需要顶层)。有什么建议么?

swiftui
  • 1 个回答
  • 24 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve