Swift 3 - CGAffineTransform 不起作用
Swift 3 - CGAffineTransform does not work
我正在以编程方式创建按钮,但在 addTarget
中添加时 CGAffineTransform
在我的项目中不起作用,为什么?
编辑:
func createButtonPuzzle(id: Int) {
for i in 1...14 {
let btnButton = UIButton(type: .roundedRect)
btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100)
btnButton.backgroundColor = .blue
btnButton.setTitle("iButton", for: .normal)
btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside)
view.addSubview(btnButton)
}
}
func moveButton(sender: UIButton) {
if sender.tag == 1 {
if sender.transform == CGAffineTransform.identity {
UIView.animate(withDuration: 0.5, animations:
sender.transform = CGAffineTransform(translationX: 50, y: 100)
})
}
}
}
在函数中,没有使用sender.transform,而是使用btnButton.transform,这是因为你超出了作用域,sender可能会被dismiss,导致动画dismiss。
另一种选择是强力持有对象:
let tappedButton : UIButton = sender
然后使用 tappedButton
编辑
我的意思是这样的:
func moveButton(sender: UIButton) {
if ((sender.tag == 1) && (sender == self.btnButton)) {
if self.btnButton.transform == CGAffineTransform.identity {
UIView.animate(withDuration: 0.5, animations:
self.btnButton.transform = CGAffineTransform(translationX: 50, y: 100)
})
}
}
}
编辑 - 2
根据你的代码有两个问题:
- 所有 14 个按钮都堆叠 1 个在另一个顶部,这意味着按钮 14 将成为最上面的按钮,而不是按钮 1。
您没有设置标签,然后在您检查 moveButton 时失败:
func createButtonPuzzle(id: Int) {
for i in 1...14 {
let btnButton = UIButton(type: .roundedRect)
btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100)
btnButton.backgroundColor = .blue
btnButton.setTitle("iButton", for: .normal)
btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside)
**btnButton.tag = i // This is missing **
view.addSubview(btnButton)
}
}
然后这失败了:
如果sender.tag == 1 {
因此,要测试它并查看它是否正常工作,首先您需要从 14 到 1,然后从 1..<2 或将按钮重新定位在不同的位置,以便它真正起作用。
然后将设置标签,当点击带有标签 1 的按钮时它将起作用
我正在以编程方式创建按钮,但在 addTarget
中添加时 CGAffineTransform
在我的项目中不起作用,为什么?
编辑:
func createButtonPuzzle(id: Int) {
for i in 1...14 {
let btnButton = UIButton(type: .roundedRect)
btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100)
btnButton.backgroundColor = .blue
btnButton.setTitle("iButton", for: .normal)
btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside)
view.addSubview(btnButton)
}
}
func moveButton(sender: UIButton) {
if sender.tag == 1 {
if sender.transform == CGAffineTransform.identity {
UIView.animate(withDuration: 0.5, animations:
sender.transform = CGAffineTransform(translationX: 50, y: 100)
})
}
}
}
在函数中,没有使用sender.transform,而是使用btnButton.transform,这是因为你超出了作用域,sender可能会被dismiss,导致动画dismiss。
另一种选择是强力持有对象:
let tappedButton : UIButton = sender
然后使用 tappedButton
编辑
我的意思是这样的:
func moveButton(sender: UIButton) {
if ((sender.tag == 1) && (sender == self.btnButton)) {
if self.btnButton.transform == CGAffineTransform.identity {
UIView.animate(withDuration: 0.5, animations:
self.btnButton.transform = CGAffineTransform(translationX: 50, y: 100)
})
}
}
}
编辑 - 2
根据你的代码有两个问题:
- 所有 14 个按钮都堆叠 1 个在另一个顶部,这意味着按钮 14 将成为最上面的按钮,而不是按钮 1。
您没有设置标签,然后在您检查 moveButton 时失败:
func createButtonPuzzle(id: Int) {
for i in 1...14 { let btnButton = UIButton(type: .roundedRect) btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100) btnButton.backgroundColor = .blue btnButton.setTitle("iButton", for: .normal) btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside) **btnButton.tag = i // This is missing ** view.addSubview(btnButton) }
}
然后这失败了: 如果sender.tag == 1 {
因此,要测试它并查看它是否正常工作,首先您需要从 14 到 1,然后从 1..<2 或将按钮重新定位在不同的位置,以便它真正起作用。
然后将设置标签,当点击带有标签 1 的按钮时它将起作用