我尝试使用自动布局拖动另一个视图来移动一个视图。我的场景看起来像这样:
这个绿松石视图是我想通过触摸拖动的视图,下面的红色视图应该跟随我拖动的视图。我在这些视图之间添加了约束,即垂直间距约束,常量等于0。
我添加了计时器,每秒移动上部较小的视图一个像素,但遗憾的是红色的仍然在同一个地方。
@implementation ViewController {
NSTimer *_timer;
}
- (IBAction)onDragButtonPressed:(id)sender {
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(_onDrag) userInfo:nil repeats:YES];
}
- (void)_onDrag {
self.draggable.center = CGPointMake(self.draggable.center.x, self.draggable.center.y - 1);
[self.dragged setNeedsDisplay];
}
我也试过像这样的自定义约束:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.dragged attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.draggable attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
[self.view addConstraint:constraint];
但没有任何积极的结果。
我该怎么做才能正确实现这种行为?
提前谢谢。
答案 0 :(得分:2)
使用AutoLayout时,会丢失框架和中心。相反,你依赖NSLayoutConstraints
的常数值。所以你需要改变的代码在这里:
- (void)_onDrag {
self.draggable.center = CGPointMake(self.draggable.center.x, self.draggable.center.y - 1);
[self.dragged setNeedsDisplay];
}
使它更像是
- (void)_onDrag:(UIPanGestureRecognizer *)gesture {
self.draggableConstraint.constant = [gesture locationInView:self.view].y;
[self.view layoutIfNeeded];
}
请注意UIPanGestureRecognizer
。您应该考虑使用设计用于移动视图的手势识别器的简单视图,而不是按钮。然后,您的OnDrag:
方法可以询问手势触摸的位置,并相应地更新self.draggableConstraint
。您可能需要进行一些调整,例如constant = (GESTURE LOCATION Y) - (DRAGGABLE STARTING Y);
来处理偏移量。这里的神奇之处在于你坚持一个约束,然后在调用-[UIView layoutIfNeeded]
之前改变它的常量,这会触发立即重新计算所有约束。'