首先是阅读器首页,因为打算做一个类似于win8 风格的首页,能将用户所订阅的资讯简洁大方的展现出来, 可以参考一个DragDemo ,它主要实现了对按钮的拖动,用可以根据自己的喜好将不同的button放在不同的位置。
主要的代码如下:
//用来保存button上一次移动的顺序
_tagsArray = [[NSMutableArray alloc]initWithCapacity:8];
for (NSInteger i = 0; i< 8; i++)
{
NSNumber *n = [NSNumber numberWithInteger:i];
[_tagsArray addObject:n];
}
NSMutableArray *array = [[NSUserDefaults standardUserDefaults]objectForKey:@"Array"];
if (array != NULL)
{
// 取出保存的button顺序
_tagsArray = array;
}
// 创建button
for (NSInteger i = 0;i<8;i++)
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.backgroundColor = [UIColor lightGrayColor];
btn.frame = CGRectMake(50+(i%2)*100, 64+(i/2)*100, 90, 90);
btn.tag = [[_tagsArray objectAtIndex:i] integerValue];
btn.titleLabel.font = [UIFont boldSystemFontOfSize:20];
[btn setTitle:[NSString stringWithFormat:@"%d",i] forState:UIControlStateNormal];
[self.view addSubview:btn];
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(buttonLongPressed:)];
[btn addGestureRecognizer:longGesture];
[self.itemArray addObject:btn];
}
}
// 长按手势的触发事件
- (void)buttonLongPressed:(UILongPressGestureRecognizer *)sender
{
UIButton *btn = (UIButton *)sender.view;
NSInteger selInt = btn.tag;
NSLog(@"选中的button是:%d",selInt);
//
if (sender.state == UIGestureRecognizerStateBegan)
{
// 得到手指所按的点 和 button的中心点
startPoint = [sender locationInView:sender.view];
originPoint = btn.center;
[UIView animateWithDuration:Duration animations:^{
//长按后出现放大和半透明效果
btn.transform = CGAffineTransformMakeScale(1.1, 1.1);
btn.alpha = 0.7;
}];
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
//得到手指移动后的点
CGPoint newPoint = [sender locationInView:sender.view];
CGFloat deltaX = newPoint.x-startPoint.x;
CGFloat deltaY = newPoint.y-startPoint.y;
//button也跟着手指移动
btn.center = CGPointMake(btn.center.x+deltaX,btn.center.y+deltaY);
// 返回值是手指移动到下一个按钮所在区域时下一个按钮的tag值,如果手指所在区域不在另外一个按钮上时,则返回-1,
NSInteger index = [self indexOfPoint:btn.center withButton:btn];
if (index<0)
{
contain = NO;
}
else
{
// 再将button的tag值放入数组
for (int i = 0 ; i< 8; i++)
{
NSNumber *numb = [_tagsArray objectAtIndex:i];
[_tagsArray addObject:numb];
}
//删掉数组中的前8个旧的tag值,保留新的tag值
NSRange range = NSMakeRange(0, 8);
[_tagsArray removeObjectsInRange:range];
// 在数组中交换button的tag值对应在数组中的下标
NSNumber *mmm_1 = [NSNumber numberWithInteger:selInt];
NSNumber *mmm_2 = [NSNumber numberWithInteger:index];
NSInteger nnInt_1 = [_tagsArray indexOfObject:mmm_1];
NSInteger nnInt_2 = [_tagsArray indexOfObject:mmm_2];
[_tagsArray exchangeObjectAtIndex:nnInt_1 withObjectAtIndex:nnInt_2];
// 在本地保存记录tag值顺序的数组
[[NSUserDefaults standardUserDefaults] setObject:_tagsArray forKey:@"Array"];
[[NSUserDefaults standardUserDefaults] synchronize];
[UIView animateWithDuration:Duration animations:^{
// 交换选中的button和移动后指尖处的button
CGPoint temp = CGPointZero;
UIButton *button = _itemArray[index];
temp = button.center;
button.center = originPoint;
btn.center = temp;
originPoint = btn.center;
contain = YES;
}];
}
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
[UIView animateWithDuration:Duration animations:^{
// 将button的形状和透明度还原
btn.transform = CGAffineTransformIdentity;
btn.alpha = 1.0;
// 如果指尖处没有button,则移动的button回到原来位置
if (!contain)
{
btn.center = originPoint;
}
}];
}
}
// 返回值是手指移动到下一个按钮所在区域时下一个按钮的tag值,如果手指所在区域不在另外一个按钮上时,则返回-1,
- (NSInteger)indexOfPoint:(CGPoint)point withButton:(UIButton *)btn
{
for (NSInteger i = 0;i<_itemArray.count;i++)
{
UIButton *button = _itemArray[i];
if (button != btn)
{
if (CGRectContainsPoint(button.frame, point))
{
return i;
}
}
}
return -1;
}
代码虽然很短,但是实用性很强,可以修改的地方很多,比如在长按手势和可以给button的左上角加上删除的图标,点击后可以删除按钮。在所有的按钮视图后可以加上一个空白的按钮,点击后可以添加按钮。所有按钮可以加在一个 UIScrollView 上,这样可以加上更多的按钮。