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];
    }
}