Skip to content

Instantly share code, notes, and snippets.

@palmerc
Last active December 24, 2017 13:54
Show Gist options
  • Save palmerc/65701a2d097cb796de976071cbeedda1 to your computer and use it in GitHub Desktop.
Save palmerc/65701a2d097cb796de976071cbeedda1 to your computer and use it in GitHub Desktop.
Demo of a button that changes a constraint
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
var innerViewLeadingConstraint: NSLayoutConstraint?
var innerViewCenterXConstraint: NSLayoutConstraint?
var innerView: UIView?
@objc
func animate(sender: AnyObject)
{
guard let innerView = self.innerView,
let innerViewLeadingConstraint = self.innerViewLeadingConstraint,
let innerViewCenterXConstraint = self.innerViewCenterXConstraint else {
return
}
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1.8, animations: {
if self.view.constraints.contains(innerViewCenterXConstraint) {
self.view.removeConstraint(innerViewCenterXConstraint)
self.view.addConstraint(innerViewLeadingConstraint)
} else {
self.view.removeConstraint(innerViewLeadingConstraint)
self.view.addConstraint(innerViewCenterXConstraint)
}
self.view.layoutIfNeeded()
})
}
override func loadView() {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .gray
self.view = view
}
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Click", for: .normal)
button.addTarget(self, action: #selector(animate(sender:)), for: .touchUpInside)
self.view.addSubview(button)
let innerView = UIView()
innerView.translatesAutoresizingMaskIntoConstraints = false
innerView.backgroundColor = .red
self.view.addSubview(innerView)
self.innerView = innerView
let views:[String: Any] = ["view": view,
"innerView": innerView,
"button": button]
let buttonCenterX = NSLayoutConstraint(item: button, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1.0, constant: 0.0)
self.view.addConstraint(buttonCenterX)
let buttonVConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[button]", metrics: nil, views: views)
self.view.addConstraints(buttonVConstraints)
innerView.addConstraint(NSLayoutConstraint(item: innerView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 150.0))
let innerViewLeadingConstraint = NSLayoutConstraint(item: innerView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1.0, constant: 0.0)
self.innerViewLeadingConstraint = innerViewLeadingConstraint
let innerViewCenterXConstraint = NSLayoutConstraint(item: innerView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1.0, constant: 0.0)
self.view.addConstraint(innerViewCenterXConstraint)
self.innerViewCenterXConstraint = innerViewCenterXConstraint
let innerViewVConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-100-[innerView]-50-|", metrics: nil, views: views)
self.view.addConstraints(innerViewVConstraints)
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = MyViewController()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment