【问题标题】:SwiftUI - Button action draws on an imageSwiftUI - 按钮动作在图像上绘制
【发布时间】:2021-01-26 05:28:36
【问题描述】:

这里是 ios 编码爱好者...

我有一个旧的 Objective C 项目,我想在 swiftui 中重新创建。

当我点击一个按钮时,它会绘制一个 CGRect 并从我写的 IBAction 中填充图像源的范围,然后我可以在屏幕上拖动。

Old way I used to do it

我如何在 SwiftUI 中做到这一点?

My empty SwiftUI Button Code

我目前有一个在 VStack 中绘制的图像,我可以移动它并调整其大小,但我希望它在应用程序加载时不存在,而是让它和其他图像在用户请求时绘制。 IE按钮按下。

我不知道我应该搜索什么来找到这个答案,因为搜索按钮和图像会立即为我提供有关如何将图像添加到按钮的教程,而不是在视图上绘制新的可交互元素的按钮.

感谢任何可以对此提供更多信息的人。

编辑 - 第二次按下按钮时,我需要再次生成图像,因此会有多个实例。

【问题讨论】:

    标签: ios image button swiftui action


    【解决方案1】:

    我不能 100% 确定我是否理解正确,但这只是在单击按钮时显示图像的问题?

    您已经说过您获得了具有所需行为的图像,但您不希望它从一开始就存在。我认为您正在为addSubview 在 SwiftUI 中寻找替代方案,但没有直接的替代方案。

    您可能正在寻找 SwiftUI 中的 @State。更改 @State 变量将强制您的视图重绘自身。 (除此之外还有更多 @State 变量)

    您可以根据条件绘制图像。在您的按钮单击上,您可以更改您的条件所基于的状态变量以重绘您的视图并显示您的图像。我在示例中使用了 toggle() 函数,因此再次单击 Button 将导致删除图像。

    import SwiftUI
    
    struct ContentView: View {
        @State private var showImage = false
        
        var body: some View {
            VStack {
                if showImage {
                    Image(systemName: "gear") // Your working image
                }
                Button(action: {
                    self.showImage.toggle()
                }, label: {
                    Text("draw image")
                })
            }
        }
    }
    

    这是一个示例,当您一次又一次地单击按钮时,您可以如何添加越来越多的图像。我将@State 变量的类型更改为一个数组,然后通过ForEach 遍历该数组。

    import SwiftUI
    
    struct ContentView: View {
        @State private var images: [UUID] = []
        
        var body: some View {
            VStack {
                ForEach(images, id: \.self) { _ in
                    Image(systemName: "gear") // Your working image
                }
                Button(action: {
                    self.images.append(UUID())
                }, label: {
                    Text("draw image")
                })
            }
        }
    }
    

    【讨论】:

    • 非常感谢您的回复。这将按照我的需要进行,除了复杂的部分是,当再次触摸按钮时,我希望也生成相同图像的第二个实例。我很抱歉没有在原始帖子中提及这一点。
    • 它的工作原理是一样的。您可以将 State 类型从 bool 更改为数组,将 if 条件更改为 ForEach(state array),然后在单击按钮时向数组中添加一个新元素:)
    • 非常感谢。你已经超越了。所以我可以进一步理解你能写出来吗?如果不是那没关系,你的帮助超出了我的预期! :)
    • 你的传奇。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多