ios - pro生产力 - ipad少数派




如何禁用整个应用程序内的iOS 11拖动? (2)

拖放功能默认是不启用的。 您需要通过为您的视图提供拖动交互委托来启用它。 所以你可能不需要禁用拖放,如果你还没有实现它。

注意:
文本视图和文本字段自动支持拖放。 但是它的默认行为是允许使用UIMenuController从一个源复制内容到另一个源。 通过拖放可以轻松复制粘贴文本输入视图的文本内容。 与使用UIMenuController进行数据共享的当前稳定的OS功能相比,拖放对数据安全性没有任何影响。


这是苹果公司的同样的声明。

查看拖动源通过为视图实现拖动交互委托( UIDragInteractionDelegate ),可以使该视图在您的应用程序中充当拖动源。


启用视图作为拖动源
UIView的任何实例或子类都可以作为拖动源。 你要做的第一步是:

  1. 创建一个拖动交互(一个UIDragInteraction实例)。
  2. 指定拖动交互的委托(符合UIDragInteractionDelegate协议的对象)。
  3. 将交互添加到视图的交互属性。

以下是如何使用自定义帮助程序方法执行此操作的方法,您通常会在视图控制器的viewDidLoad()方法中调用该方法:

func customEnableDragging(on view: UIView, dragInteractionDelegate: UIDragInteractionDelegate) {
    let dragInteraction = UIDragInteraction(delegate: dragInteractionDelegate)
    view.addInteraction(dragInteraction)
}



创建一个拖动项目
一个拖动项目封装了一个源应用程序的承诺,为一个模型对象提供各种数据表示。
要创建拖动项目,请在拖动交互代理中实施dragInteraction(_:itemsForBeginning :)方法,如下所示,以最小的形式显示:

func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
    // Cast to NSString is required for NSItemProviderWriting support.
    let stringItemProvider = NSItemProvider(object: "Hello World" as NSString)
    return [
        UIDragItem(itemProvider: stringItemProvider)
    ]
}

这个实现使用init(object :)方便初始值设定项。 当你实例化一个拖动项目时,传递一个对象在你的应用程序的本地表示中,或者以你所支持的最高保真表示。 通常,确保项目提供者的registeredTypeIdentifiers数组中的第一个元素表示您的拖动交互委托可以提供的最高保真度数据。

要将更多数据表示添加到拖动项目中,就像您在应用程序中通常所做的那样,请按照从高到低的保真度顺序添加它们。 添加表示时,您可以选择:

  • 在很多情况下,将多个数据表示添加到拖动项目的最佳选择是在模型类中采用NSItemProviderWriting协议。 使用这个协议,你把代码放在模型类中提供多个数据表示。
  • 您可以使用NSItemProvider类中的registerObject(_:visibility:)方法或相关方法显式注册数据表示形式。

出于安全原因,我想在我的整个应用程序中禁用新的iOS 11拖放功能。 更具体地说,拖动部分。

在iOS 11中,默认情况下是在所有可以选择文本的地方(弹出窗口,文字浏览,网页浏览等)发生的。


我不知道有什么办法来完全禁用拖动功能,但有一种方法可以将拖动会话限制在您自己的应用程序中。 这在安全性方面应该已经有了很大的改进。

看看sessionIsRestrictedToDraggingApplication

dragInteraction(_:sessionIsRestrictedToDraggingApplication :)

打电话问你的应用程序,拖动会话是否应限制在它开始的应用程序。







ios11