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

Posted

技术标签:

【中文标题】如何在 iOS 11 的 UITextfield 中启用拖动【英文标题】:How to enable Dragging in UITextfield in iOS 11 【发布时间】:2017-11-08 13:42:49 【问题描述】:

我知道现在询问 ios 11 最新功能的开发还为时过早Drag and Drop。这也说明 所有拖放功能都可以在 iPad 上使用。在 iPhone 上,拖放仅在应用内可用。

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

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

谢谢

【问题讨论】:

【参考方案1】:

对于 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

【讨论】:

我认为您的答案更多地与 iPad 相关,iPad 在应用程序之间拖放,但我希望在同一个应用程序中进行 DnD。 嗯,好的。我想念这个问题。我会更新我的答案。你的意思是在屏幕之间拖动吗?还是只在您应用的同一屏幕中进行 DnD?

以上是关于如何在 iOS 11 的 UITextfield 中启用拖动的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13:带有 LeftView 间距问题的 UITextField - Xcode 11

UITextField / UITextView - iOS 11 - 高 CPU 使用率

如何在 iOS 5 中添加多个 UITextfield?

如何在 iOS 7 中向 UIAlertView 添加多个 UITextField?

如何在 iOS 7 的 UITextField 中添加带有缩进的图像 UIImage?

右对齐 UITextField 空格键在 iOS 7 中不前进光标