17

The issue is to move an "InfoView" (UIView) programmatically in Swift.

The following constraints exist in the storyboard (see image):

enter image description here

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 !

2
  • Are you attempting to create an animation or are you just trying to move the view's position w/o an animation sequence? Commented Jun 13, 2015 at 20:49
  • There is no need for an animation! Commented Jun 13, 2015 at 21:52

4 Answers 4

25

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.

Sign up to request clarification or add additional context in comments.

Comments

17

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  )

2 Comments

Make sure you turn off the AutoResizing constraints or the second option doesn't work.
I'm not sure what you mean by this, dan m. To this day, both examples appear to work as intended. Could you be more specific?
9

Swift 4

UIView.animateKeyframes(withDuration: 0.25, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: 7), animations: {
       self.infoTextLabelView.frame.origin.y+=200

},completion: nil)

4 Comments

what is rawValue: 7 means?
Swift 5 - UIView.animateKeyframes(withDuration: 0.25, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: 7), animations: { self.infoTextLabelView.frame.origin.y+=200 },completion: nil)
Or even something simple like this ?: UIView.animate(withDuration: 0.1) { self.formSV.frame.origin.y += 100 }
This works for me with the same result: UIView.animateKeyframes(withDuration: 2.0, delay: 0.0, animations: { self.infoTextLabelView.frame.origin.y+=200 },completion: nil)
8

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)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.