Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 当表格滚动时,为什么NSTextField会在NSTableView上留下工件?_Macos_Cocoa_Nstableview_Nstextfield - Fatal编程技术网

Macos 当表格滚动时,为什么NSTextField会在NSTableView上留下工件?

Macos 当表格滚动时,为什么NSTextField会在NSTableView上留下工件?,macos,cocoa,nstableview,nstextfield,Macos,Cocoa,Nstableview,Nstextfield,我想在滚动表上放置一个文本标签,但该标签与滚动的图形冲突。在这里,您可以看到一个测试,我故意将标签的一半放在表外,并在表中向上滚动,这导致标签覆盖的部分被拖到下面,直到它退出窗口 此外,当我走到表格的另一端向下滚动时,有时标签似乎被重新绘制,并且它的块会随着滚动一起向上移动: 该表似乎正在重画其内容,并且在覆盖视图对象时不会通知其余视图对象重画它们自己。我如何解决这个问题?事实上,这似乎与似乎存在相同问题但使用按钮而不是标签的情况高度相关。是的,NSTableView似乎缓存孔参数表的图形

我想在滚动表上放置一个文本标签,但该标签与滚动的图形冲突。在这里,您可以看到一个测试,我故意将标签的一半放在表外,并在表中向上滚动,这导致标签覆盖的部分被拖到下面,直到它退出窗口

此外,当我走到表格的另一端向下滚动时,有时标签似乎被重新绘制,并且它的块会随着滚动一起向上移动:


该表似乎正在重画其内容,并且在覆盖视图对象时不会通知其余视图对象重画它们自己。我如何解决这个问题?事实上,这似乎与似乎存在相同问题但使用按钮而不是标签的情况高度相关。

是的,NSTableView似乎缓存孔参数表的图形,以便滚动视图不必为每个像素刷新它。然而,这正是我们所需要的。幸运的是,可以这样做,我通过以下方式成功地将NSScrollView子类化,为
reflectScrolledClipView:
添加了一个属性和一个钩子:

@interface EHScrollView : NSScrollView

@property (nonatomic, weak) NSView *refreshView;

@end
执行工作将是:

#import "EHScrollView.h"

@implementation EHScrollView

- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
    [super reflectScrolledClipView:aClipView];
    [self.refreshView setNeedsDisplay:YES];
}

@end
那么唯一需要做的就是修改用户界面的xib。如果表格嵌入到滚动视图中,请选择滚动视图并修改它以继承自定义类EHScrollView。然后,在视图控制器初始化中,使用滚动视图和表格视图的出口,通过
refreshView
属性将后者链接到前者


现在,每一个滚动条都会自动调用
setNeedsDisplay:
on
refreshView
,这意味着表格和覆盖在顶部的任何内容都将被重新绘制。当然,这比不刷新的表更需要性能,所以只在有意义的地方使用。

不要这样做,因为这样会损失很多性能并增加能耗

尝试NSScrollView方法
-(void)添加浮动子视图:(NSView*)轴视图:(nseventgestreaxis)轴

这是因为滚动视图设置为在滚动时复制其内容,并且作为性能优化,仅重新绘制新打开的部分。要关闭该功能,请使用

myScrollView.contentView.copiesOnScroll = NO;
尽管这将使滚动使用更多的CPU(您也可以在XIB中执行此操作,请查看“滚动时复制”复选框)

可能更好的方法是切换滚动视图,并将按钮置于图层背面:

myTableView.enclosingScrollView.wantsLayer = YES;
myTextView.wantsLayer = YES;

(同样,您可以在XIB文件的“层”检查器中进行设置,在该检查器中,您可以单击每个视图旁边的复选框为其指定一个层)现在,滚动视图将仅从其自己的层(不再包括文本视图)复制内容。此外,现在所有文本视图的合成都将在图形卡中完成。但是,如果将文本放置在其自身图层的透明背景上,则会丢失亚像素抗锯齿。但是,如果是任何其他类型的视图(或者文本后面实际上有一个坚实的背景),这看起来会很好。

另一种获得正确重画的方法是在“效果检查器”中打开xib根视图,并将其标记为使用核心动画层。这避免了需要使用重绘钩子创建自定义类。

该方法仅在10.9上存在,我需要对早期版本的支持。以层为基础的NSTableView以生成各种类型的issues@RaduSimionescu你能提供更多关于哪些问题的信息吗?有消息来源吗?文章?“它是已知的”有点模糊:-)。。。你可以找到许多其他类似的报告。如果可能的话,最好避免使用层备份的NSTableView。只有在真正有必要的时候才加入,并为意外行为和挫折做好准备。OK,谢谢链接。我还没有在任何使用层备份表和滚动视图的应用程序中遇到过这个问题,因为你发布的链接都是2年前或更早的,我想这可能在10.9或更高版本中得到了修复(我可能错过了10.8或更早版本的bug,我不经常在那里测试)。所有这些,或者只使用myScrollView.contentView.copiesOnScroll=NO;