首页 > 解决方案 > 使用 UIBezierPath 可视化冒泡排序

问题描述

我试图通过按高度对一组 UIBezierPath 线进行排序来可视化冒泡排序,你能帮我制作排序过程的动画吗?我需要:

  1. 使比较为红色的线条
  2. 显示两行交换的时刻

在 ViewController 中重绘视图的代码:UPD

func sortLines() {
    DispatchQueue.global(qos: .background).async {
        for i in 0..<self.myView.lines.count {
            for j in i..<self.myView.lines.count {
                if self.myView.lines[i].bounds.height > self.myView.lines[j].bounds.height {
                    let lineI = self.self.myView.lines[i]
                    let lineJ = self.self.myView.lines[j]
                    let iX = lineI.currentPoint.x
                    let jX = lineJ.currentPoint.x

                    lineI.apply(CGAffineTransform(translationX: jX-iX, y: 0))
                    lineJ.apply(CGAffineTransform(translationX: iX-jX, y: 0))

                    self.self.myView.lines[i] = lineJ
                    self.self.myView.lines[j] = lineI

                    DispatchQueue.main.async {
                        self.myView.setNeedsDisplay()
                    }
                }
            }
        }
    }

myView.setNeedsDisplay()应该在每次迭代后更新视图,但我知道只有在整个循环完成后才会调用它,我试图将那段代码放在 DispatchQueue.main 中,但没有任何帮助。

绘制线条的视图:

    import UIKit    

    class LineView: UIView {    

    var lines: [UIBezierPath] = []

    override func draw(_ rect: CGRect) {
        for line in lines {
            line.stroke()
        }
    }
    }

也许截图可以帮助理解: 在点击排序之前

后

中间没有动画。

升级版:

错误 错误

标签: iosswiftuikit

解决方案


推荐阅读