ios - 关于如何将项目从 UITableView 拖放到 UITableView 的教程

标签 ios objective-c uitableview drag-and-drop touches

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




11 年前关闭。




我一直在这个问题上敲我的头一段时间,我想通了。我想回馈社区,因为我从这个网站得到了很多帮助:)。

我试图将一个项目从一个 UITableView 复制到另一个 UITableView 并且我在网上看到的关于如何做到这一点的信息充其量只是粗略的。我自己想出来的,所以我会描述我的小架构。

  • 主界面 View
  • 带有 UITableView 的 UIView
  • 自定义 UITableViewCell
  • 被复制的自定义 UIView(在我的例子中是 Person 对象)
  • 带有 UITableView 的 UIView
  • 自定义 UITableViewCell
  • 被复制的自定义 UIView(在我的例子中是 Person 对象)

  • 我在 UITableView 中的 person 对象是我想从一个表拖放到另一个表中的对象。我最难弄清楚如何将项目从 table 上弹出并以单一的平滑 Action 将其拖过。在最长的时间内,我需要两次触摸才能执行操作。

    从 Person 对象开始,这是一个包含图像的简单对象。我必须实现我自己的 touchesMoved 方法来在发生拖动时更改 Person 的中心位置。
    -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
        if( m_moveable == YES ){
            UITouch *touch = [touches anyObject];
            CGPoint location = [touch locationInView:self.superview];
    
            if( 0 < location.x-50 && location.x+50 < 768 ){ 
                if( 0 < location.y-50 && location.y+150 < 1004 ){
                    self.center = location;
                }
            }
        }
    }
    

    我在初始化时将 Person 对象的 userInteractionEnabled 标志设置为 NO,这样表中的任何点击都不会被 Person 对象捕获。在这种情况下,Person 对象将在表内移动,这违背了目的。

    下一个对象是我的自定义 UITableViewCell。该对象负责捕捉用户的第一次触摸。它应该做的是捕获这个触摸并“弹出”Person。 Person 是属于自定义 UITableViewCell 的 subview 之一。
     - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UIView *parent = self.superview.superview.superview;    
    
        Person *s = nil;
        for( UIView *child in self.subviews ){
            if( [child isKindOfClass:[Person class]] ){
                s = child;
                s removeFromSuperview];
                break;
            }        
        }
    
        if( s != nil ){
            self.userInteractionEnabled = NO;
            s.userInteractionEnabled = YES;
            UITableView *subParent = self.superview;   //EDIT #1
            subParent.scrollEnabled = NO;              //EDIT #1
    
            [parent addSubview:s];
            //[self touchesEnded:touches withEvent:event]; //EDIT #1
        }
    }
    

    重要的是要注意 userInteractionEnabled 标志在上述方法中被翻转。在触摸之前,Person 对象对人的触摸是“禁止的”。自定义单元格捕捉到移动后,通过将其添加到父 View 然后激活 Person 来释放 Person(userInteractionEnabled=YES)。 Person 对象然后“诞生”并且可以处理它自己的移动触摸。

    这有一个小故障,即 Person 对象在左上角闪烁,但随后立即落到用户的手指上。

    这个设计的最后一部分是主 UIView 需要处理“触摸转换”。当用户触摸 table 并且 Person 对象弹出时,应用程序需要意识到焦点需要从 table 上移开并指向 Person 对象。这样做的方法是主 UIView 中的 hitTest 方法被以下内容重载。
    - (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        UIView *rv = nil;
        for(UIView *child in self.subviews){
            if( [child isKindOfClass:[Person class]] ){
                rv = child;
                child.center = point;
                break;
            }
        }
        if( rv == nil ){
            rv = [super hitTest:point withEvent:event];
        }   
        return rv;
    }
    

    这段代码的工作方式是,当 Person 从表中弹出时,它没有聚焦在它上面。触摸由从中弹出 Person 的 UITableView “拥有”。 hitTest 方法是重新聚焦触摸的关键。系统会定期检查哪个 UIView 是触摸的焦点。系统调用 hitTest 方法来识别该 UIView。当 Person 附加到主 View 时,此 hitTest 函数会遍历所有 subview 并检测 Person 的存在并将其作为“主要”触摸对象返回。手指的任何移动都会立即报告给 Person 而不是 UITableView。

    这是实现的胆量。让 UITableView“捕捉”移动的对象现在很简单,我会留给你尝试!
    如果您有任何问题,请留言!

    编辑#1
    事实证明,删除 Person 对象比我想象的要困难 :)。我不得不添加一行以防止 UITableView 在父移动时滚动,因为 UITableView 正在吸收所有移动事件。
    touchesEnded 函数在自定义 UITableViewCell 类中触发。

    最佳答案

    嗨,我已经设法将 UITableView 中的一行拖放到同一个表的另一行上。我创建了一个 uiImageView 表示移动的项目(它没有从表格中删除)并将它附加到最前面的 UIView 以使其可在整个屏幕上拖动。
    以下是一些关于我所面临的痛苦的帖子:

  • UITableView: Drag a row onto another one
  • UITableView: scrolling programmatically the content view
  • UITableView: custom gestures make it scrolling no more

  • 希望这可以帮助^^

    关于ios - 关于如何将项目从 UITableView 拖放到 UITableView 的教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481858/

    相关文章:

    ios - [UIView _forgetDependentConstraint :]: message sent to deallocated instance

    ios - 将数据从 plist 加载到两个 TableView

    ios - Facebook iOS SDK 'one-time' 授权

    ios - 有没有办法为下面的情况编写简洁的代码

    javascript - Node.js AES 解密 iOS 加密的 NSString

    ios - 是否有充分的理由反对让我的 TyphoonAssembly 成为单例?如果是这样,为什么?如果没有,是否有推荐的方法?

    ios - uitableview - 自定义图像在 cell.contentView 中持续加载

    ios - xcode swift AnyObject 到 Swift 转换

    ios - 如何增加图例中列之间的距离 Core plot pie Chart

    ios - 是否可以通过在 GMSMapView 中拖动折线来更改路线?