gpt4 book ai didi

iOS 12,Xcode 10 : UIView setNeedsDisplay(_:) seems to be broken

转载 作者:可可西里 更新时间:2023-11-01 00:38:55 26 4
gpt4 key购买 nike

更新到 Xcode 10 后,我意识到我的应用程序中自定义 UIView(派生自 UIView 的类)的 draw(_ rect: CGRect) 例程被错误的 rect< 调用。事实上,它总是被称为 rect 作为底层 UIView 的完整框架,而不是 setNeedsDisplay(_ rect: CGRect) 指定的 rect >.

这是一个可以作为 playground 运行的代码片段,它至少在我的设置中显示了上述在极简设置中的错误行为:

import Foundation
import UIKit
import PlaygroundSupport

class CustomView: UIView {
override func draw(_ rect: CGRect) {
print("rect = \(rect)")
}
}

let customView = CustomView(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 200.0, height: 200.0)))
PlaygroundPage.current.liveView = customView
print("test")
customView.setNeedsDisplay(CGRect(origin: CGPoint.zero, size: CGSize(width: 100.0, height: 100.0)))

我得到的输出是

rect = (0.0, 0.0, 200.0, 200.0)
test
rect = (0.0, 0.0, 200.0, 200.0)

rect 的第一个打印输出是 View 的标准完全重绘,但打印“test”后的第二个输出出现问题。由于之前调用 customView.setNeedsDisplay 而重绘的输出应该是较小的指定矩形 (0.0, 0.0, 100.0, 100.0)

所以我的明显问题是:

  • 你能重现这种行为吗?
  • 我是否漏掉了一些明显的东西?
  • 这是一个错误吗?

最佳答案

这实际上是有意为 iOS 12 的新动态后备存储功能。

什么是后备存储

后备存储用于存储绘制的 View ,需要为此分配内存。该内存量取决于 View 的大小,因为它本质上是颜色和像素之间的映射。

如果您要绘制灰度图像,但已为宽色域分配了内存,那么这将导致大量空分配内存(灰度比 RGBA 占用空间小)。为了解决这个问题,动态后备存储功能的工作原理是绘制 View 的全部内容,然后计算出它需要多少内存,而不是从一开始就假设所有内容都需要广泛的颜色支持。

这样做的链式 react 是您无法重新绘制 View 的较小子部分,因为这可能会改变这家商店。

如何绕过它

这是一个很棒的新功能,但如果您确实需要解决它,您可以在 View 中禁用动态后备存储。方法是显式设置 View layercontentsFormat 属性。

您可以选择与灰度、RGBA 8 位和 RGBA 16 位(广色)相关的三个选项

所以只要调用:

layer.contentsFormat = .RGBA16Float

并且您的setNeedsDisplay(_ rect: CGRect) 将再次按预期开始工作

您可以在此处阅读有关该属性(property)的信息:https://developer.apple.com/documentation/quartzcore/calayer/1792104-contentsformat

还有来自 WWDC 18 的精彩演讲解释了新的动态后备存储并(非常安静地)提到了这项技术

https://developer.apple.com/videos/play/wwdc2018/219/?time=1451

关于iOS 12,Xcode 10 : UIView setNeedsDisplay(_:) seems to be broken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52644404/

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