gpt4 book ai didi

ios - PencilKit 中的 PKToolPicker 不会显示在以编程方式创建的 UIWindow 上

转载 作者:行者123 更新时间:2023-12-01 21:57:05 44 4
gpt4 key购买 nike

我有一个 View Controller 想要显示 PKCanvasViewPKToolPicker来自 PencilKit。这是代码:

import UIKit
import PencilKit

class ViewController: UIViewController {
@IBOutlet weak var canvas: PKCanvasView!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
canvas.backgroundColor = .lightGray
canvas.allowsFingerDrawing = true
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

// self.showPicker()
self.perform(#selector(showPicker), with: self, afterDelay: 0)
}

@objc private func showPicker() {
guard let window = UIApplication.shared.windows.filter({ $0.windowScene?.activationState == .foregroundActive }).first else {
return
}

let picker = PKToolPicker.shared(for: window)
if let picker = picker, picker.isVisible {
return
}

print("Picker not visible")
picker?.setVisible(true, forFirstResponder: canvas)
picker?.addObserver(canvas)
picker?.addObserver(self)

canvas.becomeFirstResponder()

self.perform(#selector(showPicker), with: self, afterDelay: 0.5)
}
}


extension ViewController: PKToolPickerObserver {

}

我的问题是,当我以编程方式启动 ViewController作为 Storyboard中的初始 ViewController, PKToolPicker在屏幕底部显示自己就好了。这是工作 DrawingViewController 的屏幕截图

enter image description here

但是,如果我以编程方式启动 ViewController带有新的 UIWindow .然后 PKToolPicker不显示。

enter image description here

所以我假设我的 ViewController 没有任何问题。代码。这可能是我如何创建新 UIWindow 的问题。

我使用 SceneDelegate.swift 中的以下代码(注意我正在使用 iOS 13)创建窗口:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = (scene as? UIWindowScene) else { return }

let window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window.windowScene = windowScene
window.rootViewController = UIStoryboard(name: "Main", bundle: .main).instantiateViewController(withIdentifier: "ViewController")

self.window = window
}

我很困惑。 PencilKit 没有给出太多关于它为什么无法显示 PKToolPicker 的警告或错误。任何输入表示赞赏。

编辑 1

只是添加更多信息。我查看了层次结构查看器,看起来 PKToolPicker 在那里,但没有一个工具被绘制到屏幕上。

enter image description here
enter image description here

编辑 2

我在 ViewController 中添加了一个计时器,我注意到当 PKToolPicker实际显示, PKCanvasView实际上成为第一响应者。不是立即,而是几秒钟后。当我使用以编程方式创建的 UIWindow , PKCanvasView永远不会成为第一响应者。所以也许这与我的窗口没有要求以某种方式成为第一响应者这一事实有关。

编辑 3

我设法简化了问题并将其放入示例应用程序中,您可以查看 here .如果您查看 SceneDelegate.swift ,那里有创建我自己的窗口的代码。如果我将此代码注释掉,我会毫无问题地看到我的工具选择器。当我取消注释代码时,它不显示工具选择器。

最佳答案

我今天只是在玩同样的 API,遇到了同样的问题。我认为问题在于您在场景委托(delegate)中创建窗口,您缺少:window.makeKeyAndVisible()
加上删除 Info.plist 中的 Storyboard 引用,因为您是在场景委托(delegate)中手动加载它。只需删除 key UISceneStoryboardFile里面 UIApplicationSceneManifest
我认为问题在于操作系统正在为您创建窗口(基于 Info.plist),但随后您将使用自己手动创建的窗口覆盖该窗口。实际可见的窗口(Info.plist 创建了一个)不能再被引用。

关于ios - PencilKit 中的 PKToolPicker 不会显示在以编程方式创建的 UIWindow 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61106504/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com