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

来源:互联网 发布:软件设计师题目 编辑:程序博客网 时间:2024/06/05 18:51

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

 

0 0