从下面的图片中,当用户点击view1时,我有view2和view3向下滑动到页脚,通过设置view3的约束常量并且页脚为0(ish)来有效地拉动。我的xib设置了第一张图片中显示的约束。其中最重要的两个[对我来说]是view1View2约束和view3Footer约束
为了实现向下滑动,我最终为view1view2约束设置了低优先级,为view3Footer约束设置了更高的优先级,然后在animateWithDuration中更新了view3Footer约束常量
我的问题是让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){}];
答案 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;
}];
}