【问题标题】:Can we add text, shape and signature in Photo Markup with Pencil Kit?我们可以使用 Pencil Kit 在照片标记中添加文本、形状和签名吗?
【发布时间】:2020-06-11 09:08:57
【问题描述】:

在我的应用程序中使用 PencelKit 标记照片时,我没有任何选项可以添加文本、形状和签名。此选项在 Apple 的照片应用程序中可用。我尝试使用 CanvasView 和 PKToolPicker 的各种属性来访问它,但没有成功。

self.canvasView?.drawing = PKDrawing()
self.canvasView.allowsFingerDrawing = true
if let window = self.view.window, let toolPicker = PKToolPicker.shared(for: window) {
     toolPicker.setVisible(true, forFirstResponder: self.canvasView)
     toolPicker.addObserver(self.canvasView)
     self.canvasView.becomeFirstResponder()
}

【问题讨论】:

  • 我也有同样的需求,但是找不到解决办法:(
  • 如果有人知道怎么做,请告诉我们!

标签: ios swift ipad ios-simulator pencilkit


【解决方案1】:

我终于明白了!这是 QLPreviewController

使用形状、箭头和签名进行编辑仅适用于 iOS13+。 首先我们需要从一个 url 读取文件,所以用 init 设置它。我以这样的东西为基础并附加文件名,也带有文件扩展名,例如.pdf:

FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!

您不能将它保存在 tempDirectory 中,因为 QLPreviewViewController 需要访问。没有权限可能会导致这样的错误:

AX Lookup problem - errorCode:1100 error:Permission denied portName:

您的 customVC 应该如下所示:

import UIKit
import QuickLook
class CustomVC: UIViewController {
    var url: URL    

    init(url: URL) {
        self.url = url
    }

....func viewDidLoad() and stuff ......

    func editFile() {
        let editor = QLPreviewController()
        editor.dataSource = self
        editor.delegate = self
        editor.setEditing(true, animated: true)
        present(editor, animated: true, completion: nil)
    }
}

// Load the file in the QLPreviewController with DataSource
extension CustomVC: QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return self.url! as QLPreviewItem
    }  
}

// Make editing available with Delegate
@available(iOS 13.0, *)
extension CustomVC: QLPreviewControllerDelegate {
    
    func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem) -> QLPreviewItemEditingMode {
        return .updateContents
    }
    
    func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem) {
        print("UPDATE")
    }
    
    func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
        print("SAVED at \(modifiedContentsURL)")
    }
}

如果您在委托中正确实现了这些功能,标记按钮将自动显示。

您还可以像往常一样使用额外的导航控制器为此 VC 添加更多 barButtonItems,例如在 editFile 函数中是这样的:

        let navController = UINavigationController(rootViewController: editor)
        let customButton = UIBarButtonItem(image: UIImage(systemName: "yourImageName"), style: .plain, target: self, action: #selector(customButtonTapped(_:)))
        let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped(_:)))

        if var items = editor.navigationItem.rightBarButtonItems {
            items.append(customButton)
            editor.navigationItem.rightBarButtonItems = items
        } else {
            editor.navigationItem.rightBarButtonItems = [customButton]
        }
        editor.navigationItem.leftBarButtonItem = doneButton
        viewController?.present(navController, animated: true, completion: nil)
        self.navigationController = navController

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多