button按钮长按拖拽
首先要实现这个需求主要有5点
1.获取所要移动的btn
2.获取目标位置的btn
3.计算所有需要移动的btn
4.更改数据源中btn的位置
5.实现动画
1.获取所要移动的btn
1)我们为btn添加长按手势,实现其长按方法
- (void)buttonLongPressed:(UILongPressGestureRecognizer *)sender
sender参数有个状态属性sender.state 只需判断状态为开始,就可以获取长按的btn
if (sender.state == UIGestureRecognizerStateBegan)
2.获取目标位置的btn
获取状态值为UIGestureRecognizerStateChanged的时候,我们可以根据方法locationInView拿到新的坐标点
然后新的坐标点减去我们之前记录的开始拖动的坐标点就是移动的坐标点
最后用记录的btn.center加上移动的坐标点,就是新的按钮坐标
遍历添加btn的数组,用CGRectContainsPoint就可以找到目标btn
if (sender.state == UIGestureRecognizerStateChanged) {
CGPointnewPoint = [senderlocationInView:sender.view];
CGFloatdeltaX = newPoint.x-startPoint.x;
CGFloatdeltaY = newPoint.y-startPoint.y;
btn.center=CGPointMake(btn.center.x+deltaX,btn.center.y+deltaY);
}
for(NSIntegeri =0;i<self.itemArray.count;i++) {
UIButton*button =self.itemArray[i];
if(button != btn) {
if(CGRectContainsPoint(button.frame, point))
returni;
} } }
3.计算所有需要移动的btn
要移动的btn就是包括开始和目标btn以及其中间所有的btn
这里分两种情况,分别是from < to 的时候
这是fromBtn要到toBtn的位置
fromBtn之后一直到toBtn,中间所有的Btn前移一个位置
当from > to 的时候也是一样
if(from < to) {
[UIView animateWithDuration:0.3 animations:^{
CGPointtemp =CGPointZero;
for(NSIntegeri = from; i
UIButton* button =self.itemArray[i+1];
temp = button.center;
button.center=self->originPoint;
self->originPoint= temp;
}
[selfchangeArrayDataSourceWithfrom:fromto:to];
btn.center= temp;
}];
}else{
[UIView animateWithDuration:0.3 animations:^{
CGPointtemp =CGPointZero;
for(NSIntegeri =from; i>to; i--) {
UIButton* button =self.itemArray[i-1];
temp = button.center;
button.center=self->originPoint;
self->originPoint= temp;
}
[selfchangeArrayDataSourceWithto:tofrom:from];
btn.center= temp;
}];
}
4.更改数据源中btn的位置
因为当你更改了按钮位置的时候可能这个拖拽还没有结束,还能继续拖拽,因为我们的拖拽其实也要依赖数据源,所以有必要更改数据源
数据源的更改和显示按钮的更改一致,就是改变btn在数据源的索引,下面对应的是from < to的时候
idtemp = [self.itemArrayobjectAtIndex:from];
for(NSIntegeri=from;i
self.itemArray[i] =self.itemArray[i+1];
if(i+1== to) {
self.itemArray[i+1] = temp;
}
}
_index= to;
for(UIButton* buttoninself.itemArray) {
NSLog(@"%@",button.titleLabel.text);
}
5.实现动画
最后在状态为UIGestureRecognizerStateEnded的时候 实现结束动画
[UIView animateWithDuration:0.3 animations:^{
btn.transform = CGAffineTransformIdentity;
btn.alpha=1.0;
if(!self->contain)
{
btn.center=self->originPoint;
}
}];
结语:如有不当,欢迎一起交流
demo:https://github.com/1320185140/ZJDragView