SwiftUI:如何使用计时器在不同位置创建多个视图?

罗曼

可以很容易地以老式的速度准备以下任务:每三秒钟,一个新视图(子视图)将出现在一个新位置。这是一个代码:

import UIKit

class ViewController: UIViewController {

var someView = UIView()
var posX : CGFloat = 10
var posY : CGFloat = 10
var timer:Timer!
var loopCount = 1


override func viewDidLoad() {
    super.viewDidLoad()

    startTimer()
    view.backgroundColor = .purple

}

func setView() {
    someView = UIView(frame: CGRect(x: posX, y: posY, width: 10, height: 10))
    someView.backgroundColor = UIColor.orange
    view.addSubview(someView)
}

func startTimer() {
    if timer == nil {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(loop), userInfo: nil, repeats: true)
    }
}

@objc func loop(){
    if (loopCount % 3 == 0) {
        posX += 15
        posY += 15
        setView()
    }
    loopCount += 1
 }


 }

SwiftUI使许多事情变得容易得多,但是恐怕没有这一点。至少到目前为止,我还没有找到一种简单的方法来解决它。有人知道吗?

这是显示结果的屏幕(几秒钟后):

在此处输入图片说明

他的脾气

这是可行的方法(已通过Xcode 11.2 / iOS 13.2测试)。SwiftUI是反应性的概念,因此它不是在视图模型中添加新位置,而是在视图模型和SwiftUI视图中添加了新位置,以响应视图模型中的此更改而在新添加的位置处刷新自身并添加新视图(在本例中为Rectangle)。

演示(开始录制的时间不准确,但是会定期添加rect):

在此处输入图片说明

代码:(另请参见一些内联注释)

   // needed to use as ID in ForEach
    extension CGPoint: Hashable {
        public func hash(into hasher: inout Hasher) {
            hasher.combine(self.x)
            hasher.combine(self.y)
        }
    }

   // View model holding and generating new positions
    class DemoViewModel: ObservableObject {
        @Published var positions = [CGPoint]() // all points for view

        private var loopCount = 0
        func loop() {
            if (loopCount % 3 == 0) {
                if let last = positions.last { // generate new point
                    positions.append(CGPoint(x: last.x + 15, y: last.y + 15))
                } else {
                    positions.append(CGPoint(x: 10, y: 10))
                }
            }
            loopCount += 1
        }
    }

    struct DemoAddingView: View {
        @ObservedObject var vm = DemoViewModel()

        let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
        var body: some View {
            ZStack {
                ForEach(vm.positions, id: \.self) { position in
                    Rectangle().fill(Color.orange) // just generate a rect view for all points
                        .frame(width: 10, height: 10)
                        .position(position) // location of rect in global coordinates
                }
                .onReceive(timer) { _ in
                    self.vm.loop() // add next point
                }
            }
        }

    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用计时器更新“当前”视图中的数据

来自分类Dev

在JTextArea中获得位置并使用计时器

来自分类Dev

如果动画对象到达特定位置,如何使用计时器停止动画?

来自分类Dev

如何使用计时器和不同的线程使代码平稳运行

来自分类Dev

如何在字典中使用计时器

来自分类Dev

如何通过使用计时器提高游戏速度?

来自分类Dev

如何在Java中使用计时器

来自分类Dev

如何使用计时器监视文件大小的变化?

来自分类Dev

如何在掉落向导中使用计时器?

来自分类Dev

如何使用计时器更改图片

来自分类Dev

计时器-如何使用计时器以一定间隔显示文本?

来自分类Dev

SwiftUI:如何在SwiftUI视图中取消计时器?

来自分类Dev

在vb中使用计时器

来自分类Dev

使用计时器移动PictureBox

来自分类Dev

使用计时器的内存泄漏

来自分类Dev

使用计时器限制提问

来自分类Dev

使用计时器逐行读取

来自分类Dev

如何使用JLabel创建计时器?

来自分类Dev

如何使用计时器以一定间隔从NotifyIcon创建一个显示气球提示的UserControl?

来自分类Dev

如何使用PyGame计时器事件?如何使用计时器将时钟添加到pygame屏幕?

来自分类Dev

计时器正在创建多个计时器实例

来自分类Dev

使用计时器将UIbutton移动到随机位置

来自分类Dev

SwiftUI-如何使用按钮然后使用计时器使文本显示

来自分类Dev

使用计时器在控制台应用程序中调用单个/多个方法

来自分类Dev

使用for循环Android Kotlin创建多个倒数计时器

来自分类Dev

在TidHTTPServer.OnCommandGet内创建对象(使用计时器)失败

来自分类Dev

使用计时器在Java中创建一般任务

来自分类Dev

如何使用计时器重定向到上一个视图?

来自分类Dev

用计时器 php 创建一个函数

Related 相关文章

  1. 1

    使用计时器更新“当前”视图中的数据

  2. 2

    在JTextArea中获得位置并使用计时器

  3. 3

    如果动画对象到达特定位置,如何使用计时器停止动画?

  4. 4

    如何使用计时器和不同的线程使代码平稳运行

  5. 5

    如何在字典中使用计时器

  6. 6

    如何通过使用计时器提高游戏速度?

  7. 7

    如何在Java中使用计时器

  8. 8

    如何使用计时器监视文件大小的变化?

  9. 9

    如何在掉落向导中使用计时器?

  10. 10

    如何使用计时器更改图片

  11. 11

    计时器-如何使用计时器以一定间隔显示文本?

  12. 12

    SwiftUI:如何在SwiftUI视图中取消计时器?

  13. 13

    在vb中使用计时器

  14. 14

    使用计时器移动PictureBox

  15. 15

    使用计时器的内存泄漏

  16. 16

    使用计时器限制提问

  17. 17

    使用计时器逐行读取

  18. 18

    如何使用JLabel创建计时器?

  19. 19

    如何使用计时器以一定间隔从NotifyIcon创建一个显示气球提示的UserControl?

  20. 20

    如何使用PyGame计时器事件?如何使用计时器将时钟添加到pygame屏幕?

  21. 21

    计时器正在创建多个计时器实例

  22. 22

    使用计时器将UIbutton移动到随机位置

  23. 23

    SwiftUI-如何使用按钮然后使用计时器使文本显示

  24. 24

    使用计时器在控制台应用程序中调用单个/多个方法

  25. 25

    使用for循环Android Kotlin创建多个倒数计时器

  26. 26

    在TidHTTPServer.OnCommandGet内创建对象(使用计时器)失败

  27. 27

    使用计时器在Java中创建一般任务

  28. 28

    如何使用计时器重定向到上一个视图?

  29. 29

    用计时器 php 创建一个函数

热门标签

归档