如何在拖动其他视图时移动一个视图

时间:2014-07-08 18:05:10

标签: ios objective-c autolayout nslayoutconstraint

我尝试使用自动布局拖动另一个视图来移动一个视图。我的场景看起来像这样:

Scene with upper view which is desired to be dragged by touch and the view below which should follow the view above

这个绿松石视图是我想通过触摸拖动的视图,下面的红色视图应该跟随我拖动的视图。我在这些视图之间添加了约束,即垂直间距约束,常量等于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];

但没有任何积极的结果。

我该怎么做才能正确实现这种行为?

提前谢谢。

1 个答案:

答案 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]之前改变它的常量,这会触发立即重新计算所有约束。'