GMGridView继承于UIScrollView,很强大的一款控件(下载地址:https://github.com/gmoledina/GMGridView)
由于项目需求效果图如下:
由于要设计添加,删除按钮,于是修改了:
- (BOOL)GMGridView:(GMGridView *)gridView canDeleteItemAtIndex:(NSInteger)index
为委托函数的实现;其次还有点击事件:
- (void)tapGestureUpdated:(UITapGestureRecognizer *)tapGesture
由于GMGridView在编辑时点击头像没有事件响应,于是自己继承GMGridView,重写父类方法:
父类方法如下:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
BOOL valid = YES;
BOOL isScrolling = self.isDragging || self.isDecelerating;
if (gestureRecognizer == _tapGesture)
{
if (self.editing && self.disableEditOnEmptySpaceTap) {
//原代码
CGPoint locationTouch = [_tapGesture locationInView:self];
NSInteger position = [self.layoutStrategy itemPositionFromLocation:locationTouch];
valid = (position == GMGV_INVALID_POSITION);
} else {
valid = !isScrolling && !self.isEditing && ![_longPressGesture hasRecognizedValidGesture];
}
}
else if (gestureRecognizer == _longPressGesture)
{
valid = (self.sortingDelegate || self.enableEditOnLongPress) && !isScrolling && !self.isEditing;
}
else if (gestureRecognizer == _sortingPanGesture)
{
valid = (_sortMovingItem != nil && [_longPressGesture hasRecognizedValidGesture]);
}
else if(gestureRecognizer == _rotationGesture || gestureRecognizer == _pinchGesture || gestureRecognizer == _panGesture)
{
if (self.transformDelegate != nil && [gestureRecognizer numberOfTouches] == 2)
{
CGPoint locationTouch1 = [gestureRecognizer locationOfTouch:0 inView:self];
CGPoint locationTouch2 = [gestureRecognizer locationOfTouch:1 inView:self];
NSInteger positionTouch1 = [self.layoutStrategy itemPositionFromLocation:locationTouch1];
NSInteger positionTouch2 = [self.layoutStrategy itemPositionFromLocation:locationTouch2];
valid = !self.isEditing && ([self isInTransformingState] || ((positionTouch1 == positionTouch2) && (positionTouch1 != GMGV_INVALID_POSITION)));
}
else
{
valid = NO;
}
}
return valid;
}自己继承后修改如下:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
BOOL valid = [super gestureRecognizerShouldBegin:gestureRecognizer];
if (gestureRecognizer == self.tapGesture) {
if (self.editing && self.disableEditOnEmptySpaceTap)
{
valid = YES;
}
}
return valid;
}
这样
- (void)tapGestureUpdated:(UITapGestureRecognizer *)tapGesture 函数才能响应
#pragma mark Tap gesture
//////////////////////////////////////////////////////////////
//BOOL canEdit = self.editing && [self.dataSource GMGridView:self canDeleteItemAtIndex:position];
- (void)tapGestureUpdated:(UITapGestureRecognizer *)tapGesture
{
CGPoint locationTouch = [_tapGesture locationInView:self];
NSInteger position = [self.layoutStrategy itemPositionFromLocation:locationTouch];
if (position != GMGV_INVALID_POSITION)
{
if (!self.editing)
{
[self cellForItemAtIndex:position].highlighted = NO;
[self.actionDelegate GMGridView:self didTapOnItemAtIndex:position];
}
}
else
{
if([self.actionDelegate respondsToSelector:@selector(GMGridViewDidTapOnEmptySpace:)])
{
[self.actionDelegate GMGridViewDidTapOnEmptySpace:self];
}
if (self.disableEditOnEmptySpaceTap) {
self.editing = NO;
}
}
}
这里的 if (!self.editing) 也得注释才能响应事件
本文详细介绍了如何针对GMGridView控件进行自定义响应事件优化,包括添加删除按钮、点击事件处理及编辑模式下事件响应逻辑的调整。
2178

被折叠的 条评论
为什么被折叠?



