首页 > 学院 > 开发设计 > 正文

iOS如何实现长按拖动控件

2019-11-14 19:25:28
字体:
来源:转载
供稿:网友

  实现控件拖动的方法有多种,可以使用UICollectionView的代理方法直接实现,但是有些开发者在初始时没有使用UICollectionView创建九宫格,后来增加需求,却要增加这种拖动移动的效果,又不想更改页面的初始控件,那么应该怎么实现呢?

  方法很简单,首先在@interface创建以下全局变量;

@interface YRViewController (){    BOOL contain;     CGPoint startPoint;     CGPoint originPoint;   }@PRoperty (strong , nonatomic) NSMutableArray *itemArray;@end

  如图所示,在viewDidLoad里创建了如下的控件布局;

 1 - (void)viewDidLoad 2 { 3     [super viewDidLoad]; 4      5     for (NSInteger i = 0;i<8;i++) 6     { 7         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; 8         btn.backgroundColor = [UIColor redColor]; 9         btn.frame = CGRectMake(50+(i%2)*100, 64+(i/2)*100, 90, 90);10         btn.tag = i;11         btn.titleLabel.font = [UIFont boldSystemFontOfSize:20];12         [btn setTitle:[NSString stringWithFormat:@"%d",1+i] forState:UIControlStateNormal];13         [self.view addSubview:btn];14         UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(buttonLongPressed:)];15         [btn addGestureRecognizer:longGesture];16         [self.itemArray addObject:btn];17 18     }19 }

 

  下面,我们就要思考,如何实现长按移动了,控件的移动并且重新排序,主要是考虑移动的那个控件移动到新的位置,直接看下列代码,

 1 - (void)buttonLongPressed:(UILongPressGestureRecognizer *)sender 2 { 3  4     UIButton *btn = (UIButton *)sender.view; 5     if (sender.state == UIGestureRecognizerStateBegan) 6     { 7         startPoint = [sender locationInView:sender.view]; 8         originPoint = btn.center; 9         [UIView animateWithDuration:Duration animations:^{10             btn.transform = CGAffineTransformMakeScale(1.1, 1.1);11             btn.alpha = 0.7;12         }];13        14     }15     else if (sender.state == UIGestureRecognizerStateChanged)16     {17         18         CGPoint newPoint = [sender locationInView:sender.view];19         CGFloat deltaX = newPoint.x-startPoint.x;20         CGFloat deltaY = newPoint.y-startPoint.y;21         btn.center = CGPointMake(btn.center.x+deltaX,btn.center.y+deltaY);22         //NSLog(@"center = %@",NSStringFromCGPoint(btn.center));23         NSInteger index = [self indexOfPoint:btn.center withButton:btn];24         if (index<0)25         {26             contain = NO;27         }28         else29         {30             [UIView animateWithDuration:Duration animations:^{31                 32                 CGPoint temp = CGPointZero;33                 UIButton *button = _itemArray[index];34                 temp = button.center;35                 button.center = originPoint;36                 btn.center = temp;37                 originPoint = btn.center;38                 contain = YES;39 40             }];41         } 44     }45     else if (sender.state == UIGestureRecognizerStateEnded)46     {47         [UIView animateWithDuration:Duration animations:^{48             49            btn.transform = CGAffineTransformIdentity;50            btn.alpha = 1.0;51             if (!contain)52             {53                  btn.center = originPoint;54             }55         }];56     }57 }

  下面这个方法用来判断要移动的button将要移动到的位置的center是不是在button数组(itemArray)元素的位置中,如果是,返回i 新位置原来的button是数组中得第几个元素,否则,返回-1。

 1 - (NSInteger)indexOfPoint:(CGPoint)point withButton:(UIButton *)btn 2 { 3     for (NSInteger i = 0;i<_itemArray.count;i++) 4     { 5         UIButton *button = _itemArray[i]; 6         if (button != btn) 7         { 8             if (CGRectContainsPoint(button.frame, point)) 9             {10                 return i;11             }12         }13     }14     return -1;15 }

  这样,我们通过位置判断,让控件的位置得以改变。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表