gpt4 book ai didi

objective-c - NSView setNeedDisplay :rect causes redrawing bigger area than needed

转载 作者:行者123 更新时间:2023-12-03 16:35:36 25 4
gpt4 key购买 nike

我需要重绘一些 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/

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