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

时间:2017-06-07 09:25:46

标签: ios iphone xcode drag-and-drop drag

我知道要求开发iOS 11 Drag and Drop的最新功能还为时过早。这也表示 iPad上提供了所有拖放功能。在iPhone上,只能在应用程序中使用拖放功能。

所以我想在iPhone中的单个应用程序中移动文本字段。我查看了UIDragInteraction课程,但我不知道如何在UITextfield中启用或激活拖动功能,我也注意到.textDragDelegate属性已添加到UITextfield但我不知道知道如何主动拖动。

寻找已经练习过的建议或帮助。

由于

1 个答案:

答案 0 :(得分:2)

对于iPhone,如果DnD用于同一屏幕,那就太棘手了:

  • 检测UITextField上的触摸
  • 创建一个"视觉副本"如果用户仍然触摸屏幕并移动手指,则显示该文本字段。
  • 移动此视频副本"当手指移动时
  • 当用户松开手指时,检测位置以放置此视觉副本"
  • 创建uitextfield对象的副本,调用addSubview以添加到正确的位置
  • 调整此新uitextfield的自动布局约束
  • 删除旧的uitextfield +调整与其相关的视图的自动布局。

对于屏幕之间的DnD,从技术上讲,它是可能的,但应用程序必须根据该要求进行设计。

要启用对iPad的UIView对象的拖动,您必须创建一个dragInteraction并将其添加到您的UIViewObject。然后,您还必须为您的ViewController启用dropInteraction。

例如(未经测试):

@IBOutlet weak var dragableTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    //enable drag for your 'dragableTextField'
    let dragInteraction = UIDragInteraction(delegate: self)
    self.dragableTextField.addInteraction(dragInteraction)

    //set up drop interaction delegate to this ViewController.
    let dropInteraction = UIDropInteraction(delegate: self)
    self.view.addInteraction(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。您可以在以下网址阅读更多信息:

https://developer.apple.com/documentation/uikit/drag_and_drop/making_a_view_into_a_drop_destination

https://developer.apple.com/documentation/uikit/drag_and_drop/adopting_drag_and_drop_in_a_custom_view