Перетаскивание видов с помощью UIAttachmentBehavior
Я хотел бы перетащить один UIView, и он переместит положение других представлений, прикрепленных к нему, как если бы они были все присоединены через строку. Начальным состоянием будет куча UIViews, сгруппированных вместе. Если вы вытащите его, элемент, к которому он прикреплен, начнет двигаться, как только будет достигнуто минимальное расстояние между ним и перетаскиваемым видом. Я думал, что лучший способ сделать это - использовать UIDynamicItemBehavior, учитывая, что мне нужно, чтобы он снова встал на место и имел к нему вес. Я не совсем уверен, как сделать это, не делая смешной код в противном случае. Код, который у меня есть, можно увидеть ниже. К сожалению, у меня возникли проблемы с перетаскиванием квадратного элемента обратно на квадрат2. Если бы у кого-нибудь был совет, я с удовольствием уточню, если это необходимо.
- (void)viewDidLoad
{
[super viewDidLoad];
_containmentView = [[UIView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height/2, self.view.frame.size.width, 200)];
[self.view addSubview:_containmentView];
[_containmentView setBackgroundColor:[UIColor greenColor]];
_square = [[UIView alloc]initWithFrame:CGRectMake(200, 0, 100, 100)];
_square.backgroundColor = [UIColor yellowColor];
[_containmentView addSubview:_square];
_square2 = [[UIView alloc]initWithFrame:CGRectMake(100, 0, 100, 100)];
_square2.backgroundColor = [UIColor redColor];
[_containmentView addSubview:_square2];
_animator = [[UIDynamicAnimator alloc]initWithReferenceView:_containmentView];
_gravity = [[UIGravityBehavior alloc]initWithItems:@[_square, _square2]];
_gravity.gravityDirection = CGVectorMake(-1.0, 0.0);
[_animator addBehavior:_gravity];
_collision = [[UICollisionBehavior alloc]initWithItems:@[_square]];
_collision.collisionDelegate = self;
_collision.translatesReferenceBoundsIntoBoundary = YES; //causes the boundary to use the bounds of the reference view supplied to the UIDynamicAnimator
[_animator addBehavior:_collision];
UIDynamicItemBehavior *itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[_square]];
itemBehaviour.elasticity = 0.6;
[_animator addBehavior:itemBehaviour];
UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[_square addGestureRecognizer:gesture];
UIAttachmentBehavior *attach = [[UIAttachmentBehavior alloc] initWithItem:_square2 attachedToItem:_square];
[_animator addBehavior:attach];
}
-(void)handlePan:(UIPanGestureRecognizer *)gesture
{
CGPoint touchPoint = [gesture locationInView:self.view];
UIView* draggedView = gesture.view;
if (gesture.state == UIGestureRecognizerStateBegan) {
// 1. was the pan initiated from the upper part of the recipe?
UIView* draggedView = gesture.view;
CGPoint dragStartLocation = [gesture locationInView:draggedView];
_draggingView = YES;
_previousTouchPoint = touchPoint;
// [_animator updateItemUsingCurrentState:draggedView];
} else if (gesture.state == UIGestureRecognizerStateChanged && _draggingView) {
// 2. handle dragging
float xOffset = _previousTouchPoint.x - touchPoint.x;
gesture.view.center = CGPointMake(draggedView.center.x - xOffset,
draggedView.center.y);
_previousTouchPoint = touchPoint;
// [_animator updateItemUsingCurrentState:draggedView];
} else if (gesture.state == UIGestureRecognizerStateEnded && _draggingView) {
// 3. the gesture has ended
// [self tryDockView:draggedView];
// [self addVelocityToView:draggedView fromGesture:gesture];
[_animator updateItemUsingCurrentState:draggedView];
_draggingView = NO;
}
}