小编foO*_*oOg的帖子

长按UITableView

我想长时间按UITableViewCell下来打印"快速访问菜单".有人已经这样做了吗?

特别是手势识别UITableView

iphone gesture-recognition uitableview ios long-press

181
推荐指数
8
解决办法
10万
查看次数

UICollectionView有效拖放

我目前正在尝试使用UICollectionView实现UITableView重新排序行为.

让我们调用一个UItableView电视和一个UICollectionView CV(以澄清以下解释)

我基本上试图重现电视的拖放,但我没有使用编辑模式,一旦触发长按手势,单元就可以移动了.它完美地工作,我使用CV的移动方法,一切都很好.

我更新CV的contentOffset属性以在用户拖动单元格时处理滚动.当用户转到顶部和底部的特定矩形时,我更新了contentOffset和CV滚动.问题是当用户停止移动手指时,手势不会发送任何更新,这会使滚动停止并在用户移动手指后立即重新开始.

这种行为绝对不自然,我宁愿继续滚动,直到用户发布CV,就像电视中的情况一样.电视拖放体验很棒,我真的想重现同样的感觉.有没有人知道他们在重新排序时如何管理电视中的滚动?

  • 我尝试使用计时器重复触发滚动动作,只要手势位置在正确的位置,滚动很糟糕且效率不高(非常慢和跳跃).
  • 我也尝试使用GCD在另一个线程中监听手势位置,但结果甚至更糟.

我对此没有任何想法,所以如果有人有答案,我会嫁给他!

以下是longPress方法的实现:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender
{
    ReorganizableCVCLayout *layout = (ReorganizableCVCLayout *)self.collectionView.collectionViewLayout;
    CGPoint gesturePosition = [sender locationInView:self.collectionView];
    NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:gesturePosition];

    if (sender.state == UIGestureRecognizerStateBegan)
    {
        layout.selectedItem = selectedIndexPath;
        layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
    }
    else if (sender.state == UIGestureRecognizerStateChanged)
    {
        layout.gesturePoint = gesturePosition; // Setting gesturePoint invalidate layout
        [self swapCellAtPoint:gesturePosition];
        [self manageScrollWithReferencePoint:gesturePosition];
    }
    else
    {
        [self.collectionView performBatchUpdates:^
        {
            layout.selectedItem = nil;
            layout.gesturePoint = CGPointZero; …
Run Code Online (Sandbox Code Playgroud)

scroll drag-and-drop uiscrollview uicollectionview

59
推荐指数
3
解决办法
5万
查看次数