- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
更新到 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 layer
的 contentsFormat
属性。
您可以选择与灰度、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/
在我的代码中,我想要“动画”绘制一条线的延迟,因此在向 View 添加新线后,我调用 setNeedsDisplay - 一次就可以正常工作。 在drawRect方法中,我绘制线条并调用线条的方法来增
我正在尝试使用 MonoTouch 创建自定义 ProgressBar。我创建了一个用计时器重新绘制线条的类。我的问题是,当调用 SetNeedsDisplay 时, View 不会自行重绘。仅当提供
我注意到 Mac OS X 10.7 上基于 Cocoa 的应用程序存在一个奇怪的问题。由于某种原因(这里并不重要),有时我必须在自定义 View 的 drawRect 方法之外进行绘制。 我必须在我
我正在运行一个 Parse 程序,该程序获取数据并使用“findObjectsInBackgroundWithBlock”从中创建对象。完成后,我更新 self ,然后调用“[self.tableVi
每次使用 setNeedsDisplay 调用 drawRect 时,我都会显示大量图像。问题是导致滞后导致每次我调用 dracRect 时,我都会重新绘制每个图像(数千张)。 有没有办法不重绘所有图
下面的方法是在非主线程上调用的,具体来说,是在录音音频队列回调中 - (void)myMethod { //... dispatch_async(dispatch_get_main_queue(),
我最近开始学习在 View 上绘制核心图形,但每次调用 setNeedsDisplay 时,该方法都会运行,但不会触发 drawRect。在我的项目中,我在 View Controller 上有一个
我有一个自定义 View ,其中绘制了一个钢琴键盘。每个键都作为单独的调用绘制,因此我只能绘制需要重绘的键。该 View 支持多点触控,因此可以同时按住多个键。 每个键的绘制成本都有些高,因此每当在
在我的程序中,我使用 slider 更改当前所选颜色的 alpha 级别。 当 slider 更改其值时,它调用我的 setColor() 方法来更新使用新的 alpha 值更新当前颜色并更新显示当前
我正在 UIContainerView 中创建 subview ,它属于下面描述的类。这些值正确地打印到终端窗口,但实际上并没有显示在我定义的 subview 中。我认为 setNeedsDispla
我正在尝试重新加载 UIView。实际上我得到一个错误 Cannot convert value of type 'HomeViewController' to expected argument t
我对 setNeedsDisplay 更新 UIView 的不同用法感到困惑?当我尝试使用: [self.view setNeedsDisplay:YES]; 我发现我必须忽略参数才能使其适用于 UI
这里有人知道 setNeedsDisplay 是否会立即调用 drawRect 并立即更新屏幕吗?或者它只是一个排队的请求?谢谢。 最佳答案 View 直到下一个绘图周期才真正重绘。这只是通知系统应该
我看到很多与此问题相关的线程,但没有一个解决我的问题(我认为)。 我的情况应该很简单,我的 Controller 中有一个自定义 UIView,我在我的 Controller 中使用了 [self.m
使用drawRect、setNeedsDisplay和layoutSubViews等方法有什么基本规则吗?我相信它们会对应用程序性能产生不利影响。这些消息有任何首选替代方案吗? 最佳答案 虽然这不是
我有一个更新 View 的后台任务。该任务调用 -setNeedsDisplay 来绘制 View 。 这有效: - (void) drawChangesTask; { NSAutorelea
我的 ui 结构类似于 NSWindow -> NSViewController -> NSView(parent) -> NSView(target view)。目标 View 是从 XIB 文件中
我正在尝试制作一个非常简单的绘画应用程序(Cocoa)。在我的自定义 View 中,我有我的drawRect:方法,它在光标位置创建一个矩形: - (void)drawRect:(NSRect)rec
我有一个仅绘制的 UIView 派生 View 一次并且从未更新。 调用[self setNeedsDisplay]没有效果。什么可能导致这种情况? 绘图代码是否在无关紧要 drawRect: , 或
我正在尝试创建一个循环进度指示器。不幸的是,仅从 setNeedsDisplay 第一次和最后一次调用 drawRect 例程,它不会创建我正在寻找的渐变填充模式。我创建了一个 UIView 子类,在
我是一名优秀的程序员,十分优秀!