IOS开发 阅读器类APP可用开源框架介绍(1)

   首先是阅读器首页,因为打算做一个类似于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 上,这样可以加上更多的按钮。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值