Moving views with constraints

好久不见. 提交于 2019-11-26 11:33:53

问题


I have a couple views in my view controller that move up when an up swipe is detected then down when a down swipe is detected. I was forcing the views to move by adjusting the y origin using CGRectOffset. I\'ve now applied constraints to my views with IB and I\'m not sure whats the best way to move the views so that they end up in the right position on the iphone 5, 6, and 6+.

Currently I\'m doing something like this:

[self.view layoutIfNeeded];

    self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant +338;

    [UIView animateWithDuration:5
                     animations:^{
                         [self.view layoutIfNeeded];
                     }];

Is it better to change the constants using ratios? So for the constraint above, instead of using 338, would it be better to do this:

    self.panFrameVerticalConstraint.constant = self.panFrameVerticalConstraint.constant + (self.panView.frame.size.height/1.680);

    //self.panView.frame.size.height = 568
    //(568/1.680) = 338

回答1:


Yes, no issue when you change the constants. The thing here is that you have to set your constraint appropriately.

Let's consider an example.

I have a UIView in Storyboard and I would like to change its width. Its default width is 1024.

After some animation, We will change it's width to 900.

Follow steps below to achieve this:

  1. Select UIView in which we want to update constraints. Here we need to update width, So we will add a constraint for width.

  1. Now we can see new constraint added to UIView.

  1. Click on that constraint. It will show constraint properties. Here now we want to decrease width from 1024 to 900, So that in constraint property change Relation property to Less Than or Equal. Similarly, if you like to increase width from 1024 then Relation will be Greater Than or Equal.

  1. Now create an IBOutlet variable for NSLayoutConstraint and connect it with above width constraint.

  2. Change width constant

Swift 5.0

@IBOutlet weak var viewWidthConstraint : NSLayoutConstraint!

func reduceWidth() {
    // Reduce width of view.
    UIView.animate(withDuration: 0.35, animations: { () -> Void in
        self.viewWidthConstraint.constant = 900
        self.view.layoutIfNeeded()
    })
}

func normalWidth() {
    // Change to the default width of view.
    UIView.animate(withDuration: 0.35, animations: { () -> Void in
        self.viewWidthConstraint.constant = 1024
        self.view.layoutIfNeeded()
    })
}

Objective C

@property (weak, nonatomic) IBOutlet NSLayoutConstraint     *viewWidthConstraint; 

- (void) reduceWidth {
    // Reduce width of view.
    [UIView animateWithDuration:0.35f animations:^{
        self.viewWidthConstraint.constant = 900;
        [self.view layoutIfNeeded];
    }];
}

- (void) normalWidth {
    // Change to default width of view.
    [UIView animateWithDuration:0.35f animations:^{
        self.viewWidthConstraint.constant = 1024;
        [self.view layoutIfNeeded];
    }];
}


来源:https://stackoverflow.com/questions/27414052/moving-views-with-constraints

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!