Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotating a UIButton by 90 degrees every time the button is clicked

How do you rotate a UIButton by 90 degrees each time the button is clicked and also keep track of each rotated position/angle?

Here is the code I have so far but it only rotates once:

@IBAction func gameButton(sender: AnyObject) {
    UIView.animateWithDuration(0.05, animations: ({
        self.gameButtonLabel.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
    }))
}
like image 735
nodyor90z Avatar asked Aug 19 '16 17:08

nodyor90z


2 Answers

self.gameButtonLabel.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))

Should be changed to

// Swift 3 - Rotate the current transform by 90 degrees.
self.gameButtonLabel.transform = self.gameButtonLabel.transform.rotated(by: CGFloat(M_PI_2))

// OR

// Swift 2.2+ - Pass the current transform into the method so it will rotate it an extra 90 degrees.
self.gameButtonLabel.transform = CGAffineTransformRotate(self.gameButtonLabel.transform, CGFloat(M_PI_2))

With CGAffineTransformMake..., you create a brand new transform and overwrite any transform that was already on the button. Since you want to append 90 degrees to the transform that already exists (which could be 0, 90, etc degrees rotated already), you need to add to the current transform. The second line of code I gave will do that.

like image 91
keithbhunter Avatar answered Nov 14 '22 15:11

keithbhunter


Swift 4:

@IBOutlet weak var expandButton: UIButton!

var sectionIsExpanded: Bool = true {
    didSet {
        UIView.animate(withDuration: 0.25) {
            if self.sectionIsExpanded {
                self.expandButton.transform = CGAffineTransform.identity
            } else {
                self.expandButton.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2.0)
            }
        }
    }
}

@IBAction func expandButtonTapped(_ sender: UIButton) {
    sectionIsExpanded = !sectionIsExpanded
}
like image 42
Eng Yew Avatar answered Nov 14 '22 16:11

Eng Yew