一个类似苹果桌面上长按删除app的效果,就是当你长按屏幕时,会出现缩小图片并出现删除按钮,点击删除按钮,删除图片并且后面图片前移。
当再次点击图片,恢复。点击图片有处理事件,可以在此做一些处理。
实现思路以及核心代码:
继承于UIScrollView,先在上面创建出所有的view,在每个view上添加单击手势,在uiscrollView上添加长按手势。
[cpp] view plaincopy
- //创建所有的view
- -
(void)createView - {
-
x = 0; -
y = 0; -
width = self.frame.size.width /Column; -
for (int i = 0; i<_imageArray.count; i) { -
x = (i%Column)*width; -
y = (i/Column)*(ImageHeightSpace); -
-
if (i%Column != 0) { -
x=Space*(i%Column); -
} -
-
//bgView -
UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(x, y, width, ImageHeight)]; -
CALayer *imageLayer = bgView.layer; -
[imageLayer setMasksToBounds:YES]; -
[imageLayer setCornerRadius:3]; -
bgView.tag = i BgViewTag; -
[self addSubview:bgView]; -
-
//添加图像 -
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, bgView.frame.size.width, bgView.frame.size.height)]; -
imageView.image = [Util imageBy:[UIImage imageNamed:[_imageArray objectAtIndex:i]] withWidth:imageView.frame.size.width*2 withHight:imageView.frame.size.height*2]; -
[bgView addSubview:imageView]; -
-
//添加删除按钮 -
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; -
button.frame = CGRectMake(bgView.frame.size.width - 24, 0, 24, 24); -
[button setBackgroundImage:[UIImage imageNamed:@"delete"] forState:UIControlStateNormal]; -
button.tag = BtnTag i; -
[button addTarget:self action:@selector(buttonChange:) forControlEvents:UIControlEventTouchUpIns ide]; -
[bgView addSubview:button]; -
button.hidden = YES; -
-
//在bgview上添加点击手势事件 -
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnContentView:)]; -
[bgView addGestureRecognizer:tapGestureRecognizer]; -
-
-
} -
// -
self.contentSize = CGSizeMake(self.frame.size.width, yImageHeight); -
//长按手势 -
UILongPressGestureRecogn izer *longGesture = [[UILongPressGestureRecogn izer alloc] initWithTarget:self action:@selector(LongPressGestureRecogniz er:)]; -
[self addGestureRecognizer:longGesture]; - }
当你删除时,使其每个view上的删除按钮出现hidden=no,并view缩小
[cpp] view plaincopy
- //是否编辑中
- -
(void)editView:(BOOL)isEdit - {
-
_edit = isEdit; -
for (UIView *view in self.subviews) -
{ -
for (UIView *v in view.subviews) -
{ -
//所有的uibutton是否显示 -
if ([v isMemberOfClass:[UIButton class]]) -
[v setHidden:!isEdit]; -
} -
} -
-
//缩小大小 -
float scale; -
if (_edit) { -
scale = 0.9; -
}else{ -
scale = 1.0; -
} -
-
for (UIView *view in self.subviews) -
{ -
//动画缩小,放大 -
[UIView animateWithDuration:0.1 delay:0.1 options:0 animations:^ -
{ -
view.transform=CGAffineTransformMakeSca le(scale, scale); -
} completion:^(BOOL finished) -
{ -
-
}]; -
} - }
当你删除一个应用时,把UIScrollView上所有的view遍历一遍。把当前view删除,并使其后面的view.frame==前面的view.frame,并动画移动后面的view。
[cpp] view plaincopy
- //删除view时
- -(void)buttonChange:(UIButton*)sender
- {
-
NSArray *views = self.subviews; -
__block CGRect newframe; -
int index = sender.tag - BtnTag; -
for (int i = index; i < [_imageArray count]; i) -
{ -
UIView *obj = [views objectAtIndex:i]; -
__block CGRect nextframe = obj.frame; -
if (i == index) -
{ -
//删除这个view -
[obj removeFromSuperview]; -
} -
else -
{ -
for (UIView *v in obj.subviews) -
{ -
//把每个按钮的tag从重设置 -
if ([v isMemberOfClass:[UIButton class]]) -
{ -
v.tag = iBtnTag - 1; -
break; -
} -
} -
//并且位置动画改变 -
[UIView animateWithDuration:0.6 animations:^ -
{ -
obj.frame = newframe; -
} completion:^(BOOL finished) -
{ -
-
}]; -
} -
//记住上一个view的位置 -
newframe = nextframe; -
} -
//数组移除 -
[_imageArray removeObjectAtIndex:index]; -
- }