- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要重绘一些 NSView 的一部分。
- (IBAction)onUpdateView:(id)sender
{
NSRect updatedRect = ... // Redraw updated area only.
[self.view setNeedsDisplayInRect:updatedRect];
}
当我使用这个简单明了的解决方案时,Quartz Debug 会突出显示更大区域的重绘 - 直至 View 的整个区域。
我注意到,如果 [NSView setNeedsDisplayInRect] 的调用被推迟到下一个运行循环周期,或者我只是执行 [runloop runUntilDate:+0],问题就会消失:
- (IBAction)onUpdate:(id)sender
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setNeedsDisplayInRect:updatedRect];
});
}
或
- (IBAction)onUpdateAndRunLoop:(id)sender
{
[self.view setNeedsDisplayInRect:updatedRect];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.0]]; // EEW
}
但是如果在 mouseDown 处理程序中调用 setNeedsDisplayInRect,它就可以在没有所有这些黑客攻击的情况下工作:
-(void)mouseUp:(NSEvent*)event
{
NSPoint p = [self convertPoint:[event locationInWindow] fromView:nil];
int size = 100;
[self setNeedsDisplayInRect:NSMakeRect(p.x-size/2, p.y-size/2, size, size)];
}
发生了什么事,该怎么办?
解决此问题的独立 Xcode 项目位于:http://beta.kalinsky.ru/wtf/testRedraw.tar.gz
最佳答案
是什么让您如此确定这是不良行为?我在 Quartz Debugger 下看到的行为表明,当我点击“更新”按钮时,所单击按钮的矩形与传递的 dirtyRect 的矩形的交集会闪烁。这是预期的,因为系统将所有需要的绘图合并在运行循环的同一 channel 内(鼠标松开时)以提高效率。
您的其他 hacky 方法会绕过此行为,因为按钮的状态是在一次(实际上是两次:鼠标按下和鼠标向上)传递中处理的,并且 View 的更新是在后续传递中处理的。如果您密切注意延迟绘图点击中的更新闪烁(按钮向下闪烁,再次向上闪烁,然后 View 的脏区域闪烁),则可以验证这一点。对 View 本身的点击不涉及其他任何内容(好吧,从技术上讲,它的非不透明祖先),因此所有 View 的脏矩形的联合仅限于您请求的矩形。
我希望这会有所帮助。
关于objective-c - NSView setNeedDisplay :rect causes redrawing bigger area than needed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162964/
我有一个带有 events.load 函数的图表,该函数根据图表属性绘制一些线条。 加载功能完全按照我的意愿工作,但我想在每次重新绘制图表时删除并重新绘制线条(例如隐藏系列)。 我在 chart.ev
我有一个基本的 UWP 应用程序,其中嵌入了 WebView,可呈现相当大的 HTML 文档(最多 500 个信纸大小的打印页面)。 我想添加对打印该 HTML 文档的支持。这是我的方法: 为了支持分
每次我选择一个 m 适配器时,我都想重新绘制我的图表,第一次绘制的图表看起来很完美,但是当我选择一个并返回时,看起来它绘制了两次相同的图表。 这是我的源代码: public class MainA
您好,我有一个下拉菜单,每当我更改下拉菜单中的选项时,我想更改 Canvas 中的内容...例如 var paper = Raphael("myDivID",400,400); function sm
我已经编写了一个带有 NSview 和按钮的窗口。当程序启动时,窗口中会出现一个点。按下按钮后,应该会出现另外三个点,但代码不会重绘窗口。如果我在绘图函数内设置断点,我发现代码仅在绘图函数中第一次停止
我正在尝试将属性更改为自定义 LinearLayout 类,我将选项设置为类: MyBuilder option = new MyBuilder.Builder() .image(...) .setC
我正在为我的应用程序使用一些矢量图形 (.png)。在 photoshop 中,我可以放大并始终看到简单几何形状(如圆形)的完美清晰边界。但是,在我的 iPhone 上,我的相同图形看起来参差不齐且粗
我是 cocoa 新手。我以为我可以将 UITableViewCell 背景 View 设置为我自己的自定义子类,以便在单元格的背景中显示加载栏,但当我想更新该栏时,调用 setNeedsDispla
CoreData 返回 BOOL 值,根据该值我在 UITableViewCell accessoryView 上绘制了一个 UILabel。问题是 UILabel 也在它根本不应该出现的单元格上重复
我正在编写一个从 HealthKit 获取步数数据并在屏幕上显示统计数据的应用程序。我有一个带有委托(delegate)协议(protocol)功能的 viewcontoller: func user
我目前正在使用新版本的 OpenLayers OL3 升级 OpenLayers 客户端版本 2.13.1。我的设置包括作为 WMS map 服务器的 Mapserver 和前面提到的 OpenLay
我正在使用 morris.js 图表和 Bootstrap slider 。 我想做什么: 如果移动了 slider ,我想在图表中 slider 值的位置插入一条事件线。没什么特别的。 问题: 设置
本文整理了Java中gov.nasa.worldwind.WorldWindow.redraw()方法的一些代码示例,展示了WorldWindow.redraw()的具体用法。这些代码示例主要来源于G
我正在使用 Highcharts 3.0.2 我有一个 div#chart 和两个 js 变量,var options1 = {...}, options2 = {...}。它们包含不同的 highc
我正在使用 Highcharts,我想在用户点击图表标签时触发一些事件。只要我不重绘,它就可以正常工作。当我使用 chart.redraw() 时,不再触发点击事件这是一个 fiddle :https
我有一个带有图片框的表单,它显示图片和在图片框的 Paint 事件处理程序中绘制的一些叠加层。叠加层根据鼠标移动更新自身(基本上改变叠加层不同部分的不透明度)。 目前,我正在从鼠标移动处理程序调用 p
我正在使用基于 View 的 NSTableView,它使用其中包含多个控件的自定义单元格 View 。其中一个控件是纯图像 NSButton,它要么显示复选标记图像,要么根本不显示图像。此外,当我将
我正在制作条形图。它显示了各州的流感疫苗接种率。通过单击图例,您可以在每个州的人口统计之间切换,太棒了! 但是,需要双击图例才能重绘。单击一次即可成功消除条形,但需要第二次单击才能重新绘制它们。 工作
我有一个向导(org.apache.wicket.extensions.wizard.Wizard),它有一个AjaxButton作为其下一个按钮。 我正在对下一个按钮的 onSubmit() 方法执
我是 angularjs 新手,正在尝试创建我的第一个指令。我正在创建一个指令来将 Charts.js2.0(beta) 加载到我的应用程序中。 我有 2 个由 Angular-route 管理的 V
我是一名优秀的程序员,十分优秀!