如何在iOS 11中的UITextfield中启用拖动

如何在iOS 11中的UITextfield中启用拖动,ios,iphone,xcode,drag-and-drop,drag,Ios,Iphone,Xcode,Drag And Drop,Drag,我知道现在问iOS 11最新功能的开发还为时过早。这也表明,所有拖放功能都可以在iPad上使用。在iPhone上,拖放功能仅在应用程序中可用。 所以我希望在iPhone的单个应用程序中移动textfield。我查看了UIDragInteraction类,但我不知道如何在UITextfield中启用或激活拖动功能,我还注意到.textDragDelegate属性添加到UITextfield中,但我不知道如何激活拖动 寻找已经实践过的建议或帮助 感谢iPhone,如果DnD用于同一屏幕,那么这很棘手

我知道现在问iOS 11最新功能的开发还为时过早。这也表明,所有拖放功能都可以在iPad上使用。在iPhone上,拖放功能仅在应用程序中可用。

所以我希望在iPhone的单个应用程序中移动textfield。我查看了
UIDragInteraction
类,但我不知道如何在
UITextfield
中启用或激活拖动功能,我还注意到
.textDragDelegate
属性添加到
UITextfield
中,但我不知道如何激活拖动

寻找已经实践过的建议或帮助


感谢iPhone,如果DnD用于同一屏幕,那么这很棘手:

  • 检测UITextField上的触摸
  • 如果用户仍然触摸屏幕并移动手指,则创建此文本字段的“可视副本”
  • 当手指移动时,移动此“可视副本”
  • 当用户松开手指时,检测放置此“可视副本”的位置
  • 创建uitextfield对象的副本,调用addSubview将其添加到正确的位置
  • 调整此新uitextfield的自动布局约束
  • 删除旧的uitextfield并调整与其相关的视图的自动布局
对于屏幕之间的DnD,从技术上讲,这是可能的,但应用程序必须针对该要求进行设计

要在iPad的UIView对象上启用拖动,必须创建一个DraginInteraction并将其添加到UIViewObject中。然后,还必须启用与ViewController的dropInteraction

例如(未测试):

并实施这些授权

extension ViewController : UIDragInteractionDelegate {
    //this is mandatory
    func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
        //implement your code

    }
}

extension ViewController : UIDropInteractionDelegate {
    //this is optional
    func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
        // If you want to enable drag-drop on UITextField object only:
        return session.canLoadObjects(ofClass: [UITextField.self])
    }
}
您需要更多的工作来加载数据或更新目标的UI。您可以在以下网址阅读更多内容:


我认为你的答案更多地与iPad有关,iPad在应用程序之间拖放,但我希望在同一个应用程序中使用DnD。啊,好的。我不明白这个问题。我会更新我的答案。你的意思是在屏幕之间拖动吗?还是只在应用程序的同一屏幕中显示DnD?
extension ViewController : UIDragInteractionDelegate {
    //this is mandatory
    func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
        //implement your code

    }
}

extension ViewController : UIDropInteractionDelegate {
    //this is optional
    func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
        // If you want to enable drag-drop on UITextField object only:
        return session.canLoadObjects(ofClass: [UITextField.self])
    }
}