如何在没有它们的情况下创建多个标签一次全部消失?

时间:2018-05-19 18:07:59

标签: ios swift uilabel uiviewanimation

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

我的问题是它无法创建多个标签,因为它过早地删除了标签,因为它删除了名为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()
}

1 个答案:

答案 0 :(得分:1)

问题在于此代码:

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

有两个问题。首先是你在进行动画和删除之前,甚至让标签有机会成为界面的一部分。您需要引入延迟(您可以使用我的delay实用程序https://stackoverflow.com/a/24318861/341994):

@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)))作为本地变量,然后返回< / em>对它创建的标签的引用,如下所示:

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以使其发挥作用的其余细节留给读者练习。)

现在,按下按钮会创建并动画并删除新标签,而不管以前发生的其他事情。

enter image description here