The issue is to move an "InfoView" (UIView) programmatically in Swift.
The following constraints exist in the storyboard (see image):
Now, I would like to move the "InfoView" inside "MyView" up or down.
I tried:
@IBOutlet weak var infoTextLabel: UILabel!
@IBOutlet weak var infoTextLabelView: UIView!
// set infoTextLabel color
self.infoTextLabel.textColor = UIColor.blackColor()
// set infoTextLabel text
self.infoTextLabel.text = "hello"
// unhide infoTextLabel
self.infoTextLabel.hidden = false
// For the moving in Y-direction, I tried this - but does not work !!!!!!!
self.infoTextLabelView.frame.origin.y += 200
Could the Autolayout-constraints play a role. How to overcome those programmatically. Or is the frame.origin.y method the wrong one ??
Appreciate any help on this !
Swift 5
Use CGAffineTransform
@IBOutlet weak var mainCurtain: UIView!
func moveUp() {
UIView.animate(withDuration: 0.5, delay: 0.0, options:[], animations: {
self.mainCurtain.transform = CGAffineTransform(translationX: 0, y: 0)
}, completion: nil)
}
func moveDown() {
UIView.animate(withDuration: 0.5, delay: 0.0, options:[], animations: {
let screenSize = UIScreen.main.bounds.size
self.mainCurtain.transform = CGAffineTransform(translationX: 0, y: screenSize.height * 0.5)
}, completion: nil)
}
When using constraints, you never want to set a view's frame directly. Instead, reconfigure the constraints and let the auto layout engine set your view's frame for you. Create an IBOutlet in your view controller to store a reference to your "Center Y Alignment constraint". Make sure you connect it in your storyboard or xib.
@IBOutlet var yConstraint: NSLayoutConstraint
Then you can set the constraint's constant property to offset it from the Y position (positive number will move it down, negative moves it up).
yConstraint.constant = 200
This would move your view 200 points down.
See my answer to this other question about a good way to programmatically move views using auto layout: https://stackoverflow.com/a/30687856/3149796
Also, depending on the effect you're going for and other requirements of your UI, you might also achieve this with transforms without disturbing your auto layout.
// Create a new transform
self.infoTextLabelView.transform = CGAffineTransformMakeTranslation( 0.0, 200.0 )
// Or modify existing transform
self.infoTextLabelView.transform = CGAffineTransformTranslate( self.infoTextLabelView.transform, 0.0, 200.0 )
Swift 4
UIView.animateKeyframes(withDuration: 0.25, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: 7), animations: {
self.infoTextLabelView.frame.origin.y+=200
},completion: nil)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With