You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建多个UILabel并使其各自完成动画后单独删除?

解决多标签动画后独立删除的问题

你的问题核心在于全局的label变量会被每次点击覆盖——当你第二次点击按钮时,新创建的标签会替换掉旧的label引用,导致旧标签失去追踪,最终只有最后一个标签能被正确删除。

你提到的“给每个标签起不同名字”思路其实没必要,我们可以通过局部变量+闭包捕获的方式,让每个标签的动画完成后只删除自身,代码更简洁且易维护。具体修改方案如下:

步骤1:重构createLabel,让它返回创建好的标签

删掉原来的全局label变量,改成在函数内部创建局部标签并返回,这样每次调用都会生成独立的实例:

func createLabel() -> UILabel {
    // 每次调用都创建全新的UILabel实例
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    let labelWidth = label.frame.width
    let viewWidth = self.view.frame.width
    let xwidth = viewWidth - labelWidth
    let xoffset = CGFloat(arc4random_uniform(UInt32(xwidth)))
    
    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"
    
    return label
}

步骤2:修改clearLabel,让它接收具体的标签参数

把动画操作改成针对传入的标签实例,确保每个标签的动画和删除逻辑独立:

func clearLabel(_ label: UILabel) {
    UIView.animate(withDuration: 0.9, delay: 0.4, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: .curveLinear, animations: {
        label.center = CGPoint(x: 265, y: 75 )
    }, completion: { (finished: Bool) in
        // 闭包会捕获当前传入的label实例,只会删除它自己
        label.removeFromSuperview()
    })
}

步骤3:更新点击事件逻辑

在点击时,先创建标签、添加到视图,再对这个标签调用动画删除:

@IBAction func clicked(_ sender: Any) {
    let newLabel = createLabel()
    self.view.addSubview(newLabel)
    clearLabel(newLabel)
}

为什么这个方案可行?

每次点击按钮时,newLabel是一个局部变量,代表当前创建的唯一标签实例。clearLabel的闭包会捕获这个局部变量,即使后续再创建新的标签,之前的闭包依然持有旧标签的引用,动画完成后只会删除自己对应的标签,完全不会互相干扰。

这样既实现了“多个标签独立动画+删除”的需求,又不用手动给每个标签起不同名字,代码更简洁易读。

内容的提问来源于stack exchange,提问作者Nathan C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:20