每次按下按钮时,我都使用下面的代码创建标签,然后将标签移动到特定位置,然后将其删除。
我的问题是它无法创建多个标签,因为它过早地删除了标签,因为它删除了名为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()
}
答案 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
实例变量,用于在createLabel
和clearLabel
之间共享标签。因此,在动画期间不能出现另一个标签。
但您实际上 任何实例变量。所以完全摆脱你的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)
}
}
(修改createLabel
和clearLabel
以使其发挥作用的其余细节留给读者练习。)
现在,按下按钮会创建并动画并删除新标签,而不管以前发生的其他事情。