使用NSLayoutConstraints移动UIViews所需的建议

时间:2013-02-05 12:16:28

标签: ios objective-c nslayoutconstraint

从下面的图片中,当用户点击view1时,我有view2和view3向下滑动到页脚,通过设置view3的约束常量并且页脚为0(ish)来有效地拉动。我的xib设置了第一张图片中显示的约束。其中最重要的两个[对我来说]是view1View2约束和view3Footer约束

xib with constraints and views

为了实现向下滑动,我最终为view1view2约束设置了低优先级,为view3Footer约束设置了更高的优先级,然后在animateWithDuration中更新了view3Footer约束常量

successful slide down

我的问题是让view2和view3向后滑动,如果我使用相同的方法,我可以通过将view1view2约束常量设置为2来实现。

我认为上面提到的问题是view3Footer约束优先于view1View2约束的优先级,优先级似乎只是只读,所以我不能具体更改这些。我理解在设置约束时我只是请求视图定位。

......我相信我可能完全使用错误的方法......

我是否以正确的方式解决这个问题?我是否必须获取约束对象IBOutlet并重写它们?如果是这样,我会重写优先事项吗?我应该只使用> =用于具有相同优先级的常量,这似乎不起作用。我的简单动画下载的代码低于此,但除了手势识别器之外,其设置并不多,设置主要在xib中

非常感谢任何帮助。 谢谢,史蒂夫

对于下滑:

[UIView animateWithDuration:0.9 animations:^{
                        _view3FooterConstraint.constant=2;
                        [self.view layoutIfNeeded];
                        } completion:^(BOOL finished){}];

更新还尝试将此设置优先级相等 - 无法再实现向下滑动

_view3FooterConstraint.constant=2;
[self.view setNeedsUpdateConstraints];
[UIView animateWithDuration:0.9 animations:^{                            
                        [self.view layoutIfNeeded];
                        } completion:^(BOOL finished){}];

对于上滑:

[UIView animateWithDuration:0.9 animations:^{
    _view1View2Constraint.constant=2;
    [self.view layoutIfNeeded];
} completion:^(BOOL finished){}];

1 个答案:

答案 0 :(得分:1)

我想我会通过添加和删除更改的2个约束(2的顶部约束为1,以及3的底部约束到页脚)来实现此目的。确保所有视图都有明确的高度,并使IBOutlets达到我上面提到的2个约束。你真的一次只需要其中一个,但你需要在IB中添加这两个,这样你就可以为它们做出口。在viewDidLoad中,我立即删除了底部的一个。这应该在肖像和风景中起作用。我使用的代码是:

implementation ViewController {
   IBOutlet NSLayoutConstraint *conBottom;
   IBOutlet NSLayoutConstraint *conTop;
    int pos;
}

-(void)viewDidLoad{
    [super viewDidLoad];
    pos = 0;
    [self.view removeConstraint:conBottom];
    [self.view layoutSubviews];
}


-(IBAction)togglePosition:(id)sender { //tap recognizer on view one action method
    if (pos == 0) {
        [self moveDown];
    }else{
        [self moveUp];
    }
}

-(void)moveDown {
    [self.view removeConstraint:conTop];
    [self.view addConstraint:conBottom];
    conBottom.constant=2;
    [UIView animateWithDuration:0.9 animations:^{
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        pos = 1;
    }];
}

-(void)moveUp {
    [self.view removeConstraint:conBottom];
    [self.view addConstraint:conTop];
    conTop.constant=2;
    [UIView animateWithDuration:0.9 animations:^{
        [self.view layoutIfNeeded];
    }completion:^(BOOL finished) {
        pos = 0;
    }];
}