iphone和ipad关于removeFromSuperview使用注意

[UIApplication sharedApplication].keyWindow.subviews

正常情况下当前窗口的subview只有一个,但是有时需要将整个屏幕蒙上一层半透明的view并显示自定义的提示框,这时会在当前窗口里参加view使得subview不止一个。

本来如果用removeFromSuperview方法就可以把新增的view去掉,但是如果你 不小心 把原始的view(也就是最开始当前窗口下的那个view)也去掉了,ios系统会自动帮你把原始的view添加回来。

但是在添加的过程中,ipad上是以左上角设备本身坐标原点来添加,不是自动布局后的可显示区域的左上角为坐标原点,这就导致了布局错位。
iphone上因为设备本身坐标原点和可显示区域的坐标原点是重合的,所以不存在这个问题。 
PKToolPicker 是一个用于 PencilKit 的工具选择器,它提供了一组工具,包括铅笔、笔刷、橡皮擦等,用户可以通过它来选择不同的绘图工具。 在 iOS 中,使用 PKToolPicker 需要以下步骤: 1. 创建一个 PKToolPicker,并设置其 delegate 和 isVisible 属性。 2. 将 PKToolPicker 添加到视图中。 3. 配置 PKToolPicker 中的工具。 4. 处理工具选择事件。 下面是一个简单的示例代码,用于创建一个包含 PKToolPicker 的 UIViewController: ``` import UIKit import PencilKit class MyViewController: UIViewController { private var canvasView: PKCanvasView! private var toolPicker: PKToolPicker! override func viewDidLoad() { super.viewDidLoad() // 创建一个 PKCanvasView canvasView = PKCanvasView(frame: view.bounds) canvasView.backgroundColor = .white view.addSubview(canvasView) // 创建一个 PKToolPicker toolPicker = PKToolPicker() toolPicker.addObserver(canvasView, forKeyPath: "selectedTool", options: .new, context: nil) // 将 PKToolPicker 添加到视图中 if let window = view.window { toolPicker.setVisible(true, forFirstResponder: canvasView) window.addSubview(toolPicker) } // 配置 PKToolPicker 中的工具 toolPicker.addObserver(self, forKeyPath: "selectedTool", options: .new, context: nil) toolPicker.addObserver(self, forKeyPath: "color", options: .new, context: nil) toolPicker.addObserver(self, forKeyPath: "drawingAngle", options: .new, context: nil) // 处理工具选择事件 canvasView.delegate = self } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 关联工具选择器和视图 if let window = view.window, let toolPicker = toolPicker { toolPicker.setVisible(true, forFirstResponder: canvasView) toolPicker.addObserver(canvasView, forKeyPath: "selectedTool", options: .new, context: nil) window.addSubview(toolPicker) } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 移除工具选择器和视图的关联 if let toolPicker = toolPicker { toolPicker.setVisible(false, forFirstResponder: canvasView) toolPicker.removeObserver(canvasView, forKeyPath: "selectedTool") toolPicker.removeFromSuperview() } } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let toolPicker = object as? PKToolPicker { if keyPath == "selectedTool" { let tool = toolPicker.selectedTool // 处理工具选择事件 } else if keyPath == "color" { let color = toolPicker.color // 处理颜色选择事件 } else if keyPath == "drawingAngle" { let angle = toolPicker.drawingAngle // 处理角度选择事件 } } } } extension MyViewController: PKCanvasViewDelegate { func canvasViewDidFinishRendering(_ canvasView: PKCanvasView) { // 处理渲染完成事件 } func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) { // 处理绘图变化事件 } } ``` 上述代码中,我们创建了一个包含 PKToolPicker 的 UIViewController,并将其关联到 PKCanvasView 中,处理了工具选择事件、颜色选择事件和角度选择事件。注意,在 PKToolPicker 中选择工具时,需要将其添加为 canvasView 的 firstResponder,这样才会触发工具选择事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值