我在我的 UITableViewCell
子类上添加了一个 UIPanGestureRecognizer
,这样当用户向左滑动时,下面的按钮就会显示出来(有点像在 Mail 应用程序中)。我在 awakeFromNib
中执行此操作:
// Add a pan gesture recognizer to the pannable view.
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panScrollView:)];
panGesture.delegate = self;
[self.pannableView addGestureRecognizer:panGesture];
尽管我有自定义手势识别器,但我还是希望允许表格 View 滚动,因此我在同一个 UITableViewCell
子类中也有以下内容:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
我现在的问题是我不知道如何一次只允许一个手势识别器,这样当用户侧滑时,表格 View 不会滚动,反之亦然。帮忙?
我试过的没用
方法一
在 TableView 的 View Controller 中实现 UIGestureRecognizerDelegate,并要求除了用于滚动 TableView 的垂直手势识别器之外的任何其他手势识别器失败。
将 TableView 的
panGestureRecognizer
的委托(delegate)设置为包含它的 View Controller (比如说它是ContainingViewController
)。self.tableView.panGestureRecognizer.delegate = self;
使
ContainingViewController
实现UIGestureRecognizerDelegate
。实现
shouldRequireFailureOfGestureRecognizer:
并返回 YES(我假设otherGestureRecognizer
将是水平平移手势)。
错误:“UIScrollView 的内置平移手势识别器必须将其 ScrollView 作为其委托(delegate)。”
最佳答案
创建一个 bool 值,允许您的 panGesture 在 panScrollView
内操作
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
self.blockPanGesture = YES;
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
self.blockPanGesture = NO;
}
然后
-(void)panScrollView:(UIPanGestureRecognizer *)panGestureRecognizer
{
if(self.blockPanGesture == NO)
{
// do the stuff
}
}
如果您亲自平移整个 tableview,我会将手势识别器放在 tableView 本身上......否则还有
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return YES if you want the specified item to be editable.
return YES;
}
它会为您处理所有这些……但我假设您有理由不想使用它。你也可以建立在这个逻辑上,例如你可能想调整 ScrollView 何时可以拖动,通过在 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
等中放置类似的检查。 p>
关于ios - 当 UITableView 仍在垂直滚动时禁用 UITableViewCell 的水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838881/