Réglage transformation de l'identité une fois que vous avez défini le cadre d'une nouvelle valeur ne se déplace pas sur le bouton du tout, car il reviendra juste le nouveau cadre.
Soit: Vous devez stocker l'ancien cadre dans une variable, avant de vous mettre à une nouvelle valeur:
let oldFrame : CGRect = sender.frame
// Now set the frame to its new value
sender.frame = ....
Et puis dans votre bloc d'animation:
sender.frame = oldFrame
Ou: do n'attribuez pas de nouvelle image à l'expéditeur mais lui assignez une transformation de traduction, puis définissez la transformation sur identité dans le bloc d'animation pour annuler la transformation et renvoyer le bouton à l'endroit où il se trouvait.
EDIT: Comme l'a demandé, une implémentation simple de ViewController cela comme suit:
import UIKit
classe ViewController: UIViewController {
fileprivate var buttonOne : UIButton!
fileprivate var buttonTwo : UIButton!
fileprivate var buttonOneFrame : CGRect {
return CGRect(origin: CGPoint(x: view.bounds.width/2 - 200, y: 100),
size: CGSize(width: 150, height: 100))
}
override func viewDidLoad() {
super.viewDidLoad()
buttonOne = {
let bO : UIButton = UIButton()
bO.backgroundColor = .red
bO.setTitle("Frame Method", for: .normal)
bO.addTarget(self, action: #selector(frameMethodMove(sender:)), for: .touchUpInside)
bO.frame = buttonOneFrame
return bO
}()
buttonTwo = {
let bT : UIButton = UIButton()
bT.backgroundColor = .blue
bT.setTitle("Transform Method", for: .normal)
bT.addTarget(self, action: #selector(transformMethodMove(sender:)), for: .touchUpInside)
bT.frame = CGRect(origin: CGPoint(x: view.bounds.width/2 + 50, y: 100),
size: CGSize(width: 150, height: 100))
return bT
}()
view.addSubview(buttonOne)
view.addSubview(buttonTwo)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc fileprivate func frameMethodMove(sender: UIButton) -> Void {
let newFrame : CGRect = CGRect(origin: CGPoint(x: buttonOneFrame.origin.x, y: buttonOneFrame.origin.y + 500),
size: buttonOneFrame.size)
sender.frame = newFrame
sender.removeTarget(self, action: #selector(frameMethodMove(sender:)), for: .touchUpInside)
sender.addTarget(self, action: #selector(frameMethodMoveBack(sender:)), for: .touchUpInside)
}
@objc fileprivate func frameMethodMoveBack(sender: UIButton) -> Void {
UIView.animate(withDuration: 0.5, delay: 0, options: .allowUserInteraction, animations: {
sender.frame = self.buttonOneFrame
}, completion: ({ _ in
sender.removeTarget(self, action: #selector(self.frameMethodMoveBack(sender:)), for: .touchUpInside)
sender.addTarget(self, action: #selector(self.frameMethodMove(sender:)), for: .touchUpInside)
}))
}
@objc fileprivate func transformMethodMove(sender: UIButton) -> Void {
sender.transform = CGAffineTransform.init(translationX: 0, y: 500)
sender.removeTarget(self, action: #selector(transformMethodMove(sender:)), for: .touchUpInside)
sender.addTarget(self, action: #selector(transformMethodMoveBack(sender:)), for: .touchUpInside)
}
@objc fileprivate func transformMethodMoveBack(sender: UIButton) -> Void {
UIView.animate(withDuration: 0.5, delay: 0, options: .allowUserInteraction, animations: {
sender.transform = .identity
}, completion: ({ _ in
sender.removeTarget(self, action: #selector(self.transformMethodMoveBack(sender:)), for: .touchUpInside)
sender.addTarget(self, action: #selector(self.transformMethodMove(sender:)), for: .touchUpInside)
}))
}
}
sender.transform = .identity ne pas revenir à la position d'origine? – Arrabidas92
Non @ Arrabidas92 –