Ios 在UIScrollView中拖放
我试图设计一个视图,其中包含要排序并放入数组的项目列表。项目是动态生成的,因此冷量可能会超出屏幕底部 因此,我的第一个视图是Ios 在UIScrollView中拖放,ios,objective-c,uiscrollview,Ios,Objective C,Uiscrollview,我试图设计一个视图,其中包含要排序并放入数组的项目列表。项目是动态生成的,因此冷量可能会超出屏幕底部 因此,我的第一个视图是UIScrollview,它占据了整个设备屏幕 嵌套在下面的是一个标签,解释列表的用途以及如何与之交互,然后是一个带有拖放功能的UITableView,其中包含来自 我面临的问题是,虽然脚本在有1到2行时工作得很好,但当UIscrollview的contentsize大于屏幕时,它似乎优先于拖放操作,从而导致不可预测的行为 是否有任何方法可以使表上的单击优先于仅编辑单元格,
UIScrollview
,它占据了整个设备屏幕
嵌套在下面的是一个标签,解释列表的用途以及如何与之交互,然后是一个带有拖放功能的UITableView
,其中包含来自
我面临的问题是,虽然脚本在有1到2行时工作得很好,但当UIscrollview
的contentsize大于屏幕时,它似乎优先于拖放操作,从而导致不可预测的行为
是否有任何方法可以使表上的单击优先于仅编辑单元格,并允许用户通过在视图的其他位置进行交互来滚动
谢谢
更新
根据下面的评论,我设法得到:
- (void)viewDidLoad
{
[super viewDidLoad];
//
//
//
UIPanGestureRecognizer *tapGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(wasPanned:)];
[self.view addGestureRecognizer:tapGesture];
}
-(void)wasPanned:(UIPanGestureRecognizer *)gesture
{
CGPoint point = [gesture locationInView:scrollView];
UIView *isTable = [scrollView hitTest:point withEvent:nil];
if (gesture.state == UIGestureRecognizerStateBegan)
{
if([[[isTable class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
NSLog(@"Dragged from within table");
[scrollView setScrollEnabled: NO];
}
else
{
[scrollView setScrollEnabled:YES];
}
}
else{
[scrollView setScrollEnabled:YES];
}
}
现在,当scrollview不够长,无法开始滚动时,它会很好地记录消息
但是,当scrollview较长时,只有当scrollview没有首先开始滚动时,它才会识别该手势
更新
我现在有了控制台,可以100%地识别表格中的触摸,并禁用滚动。但是,禁用滚动也会停止拖放功能。有人知道为什么吗
额外代码:
tapGesture.delegate = self;
#pragma mark UIGestureRecognizerDelegate
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
因此,我的最终(但并非完美)解决方案是:
.h
<UIGestureRecognizerDelegate>
.m
-(void)wasTapped:(UIPanGestureRecognizer *)gesture
{
CGPoint point = [gesture locationInView:scrollView];
UIView *isTable = [scrollView hitTest:point withEvent:nil];
if (gesture.state == UIGestureRecognizerStateBegan)
{
if([[[isTable class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
NSLog(@"Dragged from within table");
[scrollView setScrollEnabled: NO];
}
else
{
[scrollView setScrollEnabled:YES];
}
}
else{
[scrollView setScrollEnabled:YES];
}
}
轻触手势比平移手势效果更好,因为平移手势似乎能将按住、拖动、停止和拖动识别为两种不同的手势。该功能现在可以正常工作,但如果在单元移动动画开始之前移动手指,它将滚动。您还必须等待视图(我可以称之为overscroll?)动画完全停止,滚动条消失,然后才能抓取单元格
如果有人能改进它,我将不胜感激:)嘿,杜德已经看过了,。我读过一些类似的文章,大家的共识是,每当与tableview交互时,我都需要取消或禁用滚动行为。我曾尝试设置canCancelContentTouches=No,但主要问题是在滚动开始之前tableview没有注册任何交互。。。我将尝试其他一些方法/侦听器并报告:)
-(void)wasTapped:(UIPanGestureRecognizer *)gesture
{
CGPoint point = [gesture locationInView:scrollView];
UIView *isTable = [scrollView hitTest:point withEvent:nil];
if (gesture.state == UIGestureRecognizerStateBegan)
{
if([[[isTable class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
NSLog(@"Dragged from within table");
[scrollView setScrollEnabled: NO];
}
else
{
[scrollView setScrollEnabled:YES];
}
}
else{
[scrollView setScrollEnabled:YES];
}
}