无法在圆中创建 108 个点

Unable to create 108 dots in a circle

我试图在一个圆圈中创建 108 个点,但出现索引超出范围错误。这些点是使用 UILabel 数组创建的。

我有以下代码:

func createMala() {
        let malaFrame = UIView()
        malaFrame.frame = CGRect(x: 0, y: 0, width: view.frame.width - 20, height: view.frame.width - 20)
        malaFrame.center = CGPoint(x: view.frame.width / 2.0, y: (malaFrame.frame.height / 2.0) + 20)

        var malaBeadLabel = [RoundLabel]()
        let malaRadius : Double = 100.0
        let angleInRadians : Double = 3.3333 * .pi / 180.0

        for i in 1...108 {
            malaBeadLabel[i].frame = CGRect(x: (malaRadius * sin(angleInRadians) * Double(i)),
                                            y: (malaRadius * cos(angleInRadians) * Double(i)),
                                            width: 2.0, height: 2.0)

            malaBeadLabel[i].layer.cornerRadius = 1.0
            malaBeadLabel[i].layer.borderWidth = 0.25
            malaBeadLabel.append(malaBeadLabel[i])

            malaFrame.addSubview(malaBeadLabel[i])
        }
    }

我搞不懂索引是怎么超出范围的。

您从一个名为 malaBeadLabel 的空数组开始。

然后在循环的第一次迭代中,当 i 为 1 时,您尝试 malaBeadLabel[i]。这当然会导致错误,因为 malaBeadLabel 是空的并且索引 1(或 0,或任何其他索引)没有任何内容。

最重要的是,您实际上从未尝试创建 RoundLabel.

的任何实例

更改您的循环代码,这样您就不会尝试访问数组中的任何内容,只需添加到数组中即可。并创建实际的标签实例。

for i in 1...108 {
    let label = RoundLabel(frame: CGRect(x: (malaRadius * cos(angleInRadians * Double(i))),
                                    y: (malaRadius * sin(angleInRadians * Double(i))),
                                    width: 2.0, height: 2.0))

    label.layer.cornerRadius = 1.0
    label.layer.borderWidth = 0.25
    malaBeadLabel.append(label)

    malaFrame.addSubview(label)
}

顺便说一句 - 为什么不在 RoundLabel class 中设置标签的角半径和边框宽度的代码?

我想通了。我将 UIBezier 路径半径添加到围绕圆的 UILabels 的 x 和 y 坐标并且它有效