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

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

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

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

看看sessionIsRestrictedToDraggingApplication 。

dragInteraction(_:sessionIsRestrictedToDraggingApplication 🙂

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

find了解决办法。 在你的应用程序可能需要的情况下,调用UIDragInteraction的isEnabled方法来返回NO。 请注意,方法调整通常不是一个好主意。

@implementation UIDragInteraction (TextLimitations) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(isEnabled); SEL swizzledSelector = @selector(restrictIsEnabled); Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); } -(BOOL)restrictIsEnabled { if (restrictedCondition) { return NO; } return [self restrictIsEnabled]; } 

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

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

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

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

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

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

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

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

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

 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数组中的第一个元素表示您的拖动交互委托可以提供的最高保真度数据。

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

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