1

我目前正在尝试为 iPhone 编写一个音乐播放器应用程序。设计的一部分是可以在歌曲列表的单个条目上滑动以显示其他选项(如在 iOS 7 Mail.app 中)。

我在自定义 UITableViewCell 的帮助下实现了这一点,它包含一个自定义 UIScrollView 和两个 UIView(一个用于实际内容,一个用于“背景菜单”),它们大部分都按预期工作。由于 UIScrollView 似乎接受了 TableViewCells 上的所有触摸,从而禁用了实际播放歌曲的选项,因此我转发了触摸事件(例如,此处建议):

细胞滚动视图.m

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if (![self isDragging]){
        [[self superview] touchesBegan:touches withEvent:event];
    }
    [super touchesBegan: touches withEvent: event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if (![self isDragging]){
        [[self superview] touchesMoved:touches withEvent:event];
    }
    [super touchesMoved: touches withEvent: event];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    if (![self isDragging]){
        [[self superview] touchesCancelled:touches withEvent:event];
    }
    [super touchesCancelled: touches withEvent: event];
}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event{
    if (![self isDragging]){
        [[self superview] touchesEnded:touches withEvent:event];
    }
    [super touchesEnded: touches withEvent: event];
}

现在我的问题如下:当我按住列表中的一个单元格并开始滚动时,媒体播放器不会开始播放(如预期的那样)。但是当我点击列表中的任何其他条目时,播放的不是我点击的标题,而是我首先按住然后开始滚动的标题。仅当我在点击并按住之后不再滚动并通过点击停止滚动时才会发生这种情况(这会在日志中显示“滚动期间的意外触摸阶段”,我想这就是最终取消点击的原因-抓住)。

有没有办法纠正这种行为(如果我只使用普通的 UITableViewCell 一切正常,所以我猜 UIScrollView 会破坏一切)?

4

1 回答 1

1

我和你有完全一样的问题。

我所做的修复它是将包含 tableview 的视图控制器设置为单元格的代表。

然后我在我的单元格上设置了一个委托选择器,以将点击手势传递给包含我的 tableview 的视图控制器。

@class GameSequenceCell;

@protocol CustomCellDelegate <NSObject>
- (void)didSelectCell:(CustomCell *)sender;
@end

@interface CustomCell : UITableViewCell
/*
 * Some stuffs
 */
@end

然后我直接在单元格上添加了一个 UITapGestureRecognizer 。这必须在单元初始化时完成。

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
    if (self) [self prepareForFirstUse];
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) [self prepareForFirstUse];
    return self;
}

-(void)prepareForFirstUse
{
    /*
     * The tap gesture recognizer is needed to be able to tap on the scroll view in the cell
     * Calling the singleTapGestureCaptured will trigger the tableView:didSelectRowAtIndexPath:
     * of the EventPanelVC tableview delegate.
     */
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
    [self addGestureRecognizer:singleTap];
}

然后我在单元格中实现了:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    [self.delegate didSelectCell:self];
}

代表是包含单元格所在的表格视图的视图控制器。

现在单元格中的所有点击手势都被捕获并在我实现的视图控制器中:

- (void)didSelectCell:(CustomCell *)sender;
{
    NSIndexPath *indexPathOfTouchedCell = [self.fetchedResultsController indexPathForObject:sender.object];
    if(indexPathOfTouchedCell)
    {
        [self.tableView selectRowAtIndexPath:indexPathOfTouchedCell animated:YES scrollPosition:UITableViewScrollPositionNone];
        [self tableView:self.tableView didSelectRowAtIndexPath:indexPathOfTouchedCell];
    }
} 

这就是我解决这个问题的方法。

于 2013-10-25T09:00:37.913 回答