我遇到了与UIScrollview enable delete row by swipe相同的问题
它是一个tableView,另一个视图作为scrollView的子视图工作,在我将scrollView的 scrollEnable 属性设置为 NO 之前,我无法启用“滑动删除” ,但它带来了另一个问题:我无法在tableView和另一个视图之间滑动
除了设置 scrollEnable 属性以启用“滑动删除”之外,还有其他方法吗?
如果没有,我应该何时设置self.scrollEnable = NO
,何时应将self.scrollEnable = YES
设置为“滑动删除”和“在视图之间滑动”两者都可以正常工作?
谢谢
答案 0 :(得分:6)
我成功使用了
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
在包含tableview的UIScrollView子类中,使得驻留在tableview中的UISwipeGestureRecognizer能够触发而不被“主”scrollview的手势识别器吞没。
答案 1 :(得分:6)
您需要使用UIScrollView
的自定义子类。它应该适用于水平滚动视图中的表视图:
@interface MyCoolScrollView : UIScrollView
@end
@implementation MyCoolScrollView
// Allows inner UITableView swipe-to-delete gesture
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(nonnull UIGestureRecognizer *)otherGestureRecognizer
{
return [otherGestureRecognizer.view.superview isKindOfClass:[UITableView class]];
}
@end
答案 2 :(得分:4)
如果,我没有弄错,滚动视图会消耗这些触摸,并且表格的编辑没有发生,因为表格没有触及。这可以通过继承UIScrollView来解决,以便将触摸发送给下一个响应者。所以这只是覆盖touchesBegan,移动和结束的问题。今天晚些时候将使用所需的代码更新答案,因为我现在正在路上。干杯!
编辑:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if(!self.dragging)
{
[self.nextResponder touchesMoved:touches withEvent:event];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.nextResponder touchesEnded:touches withEvent:event];
}
只需创建一个继承自UIScrollView
的类,并在实现中删除此代码。这将使scrollView不会吞下触摸,但会传递它们。显然,在创建scrollView时,请使用刚刚创建的类而不是UIScrollView
。
抱歉耽搁了。希望这会有所帮助。
干杯!
答案 3 :(得分:3)
@ THOR的答案还可以,但如果UITableView
位于UIScrollView
,那么您可能还有另一个UIView
。向上滚动tableview
时,您不小心滑到"其他视图"。
这样可以防止滑动,并允许您滑动以删除。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (gestureRecognizer.state != 0) {
return YES;
} else {
return NO;
}
}
答案 4 :(得分:0)
我知道这个线程很旧,但是这里是swift 4版本,可以在iOS 11中为我工作(您可以将UIScrollView子类化):
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if (otherGestureRecognizer.view != nil && otherGestureRecognizer.view!.superview != nil) {
return otherGestureRecognizer.view!.superview!.isKind(of: UITableView.self)
}
return false
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if (gestureRecognizer.state != .possible) {
return true
}
return false
}