如何创建多个标签而不让它们同时消失?

How to create multiple labels without them all disappearing at once?

我使用下面的代码在每次按下按钮时创建一个标签,然后将标签移动到特定位置,然后将其删除。

我的问题是它无法创建多个标签,因为它删除标签的方式太快了,因为它删除了所有名为 label.

的内容

我该如何解决这个问题,以便它创建多个标签,这些标签仅在标签单独完成其动画时才被删除?

我想到了一个解决方案,但无法弄清楚是在哪里创建一个具有不同名称的标签,例如 label1、label2 等,这样它就可以删除特定的标签当它完成它的动画时,而不是删除所有它们。

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

func createLabel() {

    // Find the button's width and height
    let labelWidth = label.frame.width

    // Find the width and height of the enclosing view
    let viewWidth = self.view.frame.width

    // Compute width and height of the area to contain the button's center
    let xwidth = viewWidth - labelWidth

    // Generate a random x and y offset
    let xoffset = CGFloat(arc4random_uniform(UInt32(xwidth)))

    // Offset the button's center by the random offsets.
    label.center.x = xoffset + labelWidth / 2
    label.center.y = 300

    label.font = UIFont(name:"Riffic Free", size: 18.0)
    label.textColor = UIColor.white
    label.textAlignment = .center
    label.text = "+1"
    self.view.addSubview(label)
}

func clearLabel() {
    UIView.animate(withDuration: 0.9, delay: 0.4, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: .curveLinear, animations: {

        self.label.center = CGPoint(x: 265, y: 75 )

    }, completion: { (finished: Bool) in
        self.label.removeFromSuperview()
    })
}

@IBAction func clicked(_ sender: Any) {
    createLabel()
    clearLabel()
}

问题在于这段代码:

@IBAction func clicked(_ sender: Any) {
    createLabel()
    clearLabel()
}

有两个问题。第一个是你在给标签一个机会成为界面的一部分之前就开始制作动画和移除。您需要引入延迟(您可以使用我的 delay 实用程序,):

@IBAction func clicked(_ sender: Any) {
    createLabel()
    delay(0.1) {
        clearLabel()
    }
}

第二个问题,正如您所说的那样,是您有一个 label 实例变量,用于在 createLabelclearLabel 之间共享标签。因此,在动画期间不能出现另一个标签。

但您实际上不需要任何实例变量。所以完全摆脱你的 label 声明!相反,修改 createLabel 使其实际上 创建 标签(即调用 UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100)))作为 local 变量,并且然后 returns 对其创建的标签的引用,如下所示:

func createLabel() -> UILabel {
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    // ...
    return label
}

... 然后让 clearLabel 相同的 标签作为 参数 以便移动该标签并在动画结束时将其删除,如下所示:

func clearLabel(_ label : UILabel) {
    // ...
}

您的 clicked 实现将如下所示,将标签从 createLabel 传递到 clearLabel:

@IBAction func clicked(_ sender: Any) {
    let label = self.createLabel()
    delay(0.1) {
        self.clearLabel(label)
    }
}

(修改 createLabelclearLabel 的其余细节留作 reader 的练习。)

现在,每次点击按钮都会创建一个新标签并为其添加动画和删除一个新标签,而与之前可能发生的任何其他事情无关。