gpt4 book ai didi

cocoa - NSTableView: float (或固定)列

转载 作者:行者123 更新时间:2023-12-03 17:48:58 24 4
gpt4 key购买 nike

我想要实现的是这样的:
DevExpress Grid
Table with fixed columns

上述链接中的表格可以有“固定”列,这些列不会与其他内容一起滚动。

我知道 NSTableViewfloatsGroupRows 功能,以及 NSScrollViewaddFloatingSubview:forAxis: 方法;但要实现上述目标,这些还不够:

  • 首先,这些列不是 NSView
  • 表头和表内容被放置在NSScrollView下的2个独立的NSClipView中(这是NSTableView的默认操作)

所以只要我找不到任何内置的解决方案。我唯一的想法是使用 3 个彼此相邻的 NSTableView(+1 为左侧,+1 为右侧);并手动同步其中的垂直滚动。如何同步水平滚动,现在这是一个更难的问题。左侧和右侧不应滚动,因此应“ float ”。 对于表格的内容,NSScrollViewaddFloatingSubview:forAxis: 方法应该可以工作(IMO)(*);但列标题是不同的动物。好吧,仍然应该有一种方法可以通过破解列的绘制来实现这种 float 行为......

但是,我仍然没有开始实现上面的,因为我的 NSTableView 已经足够慢了( NSTableview View Based Scrolling Performance ),而且我确信这些加上的东西会严重减慢它的速度。

有谁知道如何在 Cocoa 中实现 float 列吗?非常感谢任何帮助!

编辑

(*): NSScrollViewaddFloatingSubview:forAxis: 对此不起作用。正如我现在所看到的,如果赋予此方法的 NSView 是 NSTableView 的 subview ,那么它会得到特殊处理。可能该表添加了自己的逻辑;现在对我来说,NSTableView 一次只能有 1 个 float 行。

最佳答案

我已经实现了垂直同步两个 NSTableView。不太清楚为什么你需要三个,但无论如何。请注意,这都是使用 Xamarin.Mac 库的 C# 代码。这些是原生 Cocoa 平台的包装器。您必须自己将其转换为 obj c/swift 。这应该不难。

从 Nib 中醒来:

table1.EnclosingScrollView.ContentView.PostsBoundsChangedNotifications = true;
NSNotificationCenter.DefaultCenter.AddObserver (NSView.BoundsChangedNotification, BoundsDidChangeNotification, table1.EnclosingScrollView.ContentView);
table2.EnclosingScrollView.ContentView.PostsBoundsChangedNotifications = true;
NSNotificationCenter.DefaultCenter.AddObserver (NSView.BoundsChangedNotification, BoundsDidChangeNotification, table2.EnclosingScrollView.ContentView);

因此,每次其中一个表滚动时,都会调用 BoundsDidChangeNotification,并负责同步 y 轴。请注意,即使由于惯性滚动或边界的编程更改(或放大/缩小或调整 View 大小等)而发生滚动,这也适用。此类事件可能并不总是触发专门用于“用户滚动”的事件,因此,这是更好的方法。下面是 BoundsDidChangeNotification 方法:

public void BoundsDidChangeNotification (NSNotification o)
{
if (o.Object == table1.EnclosingScrollView.ContentView) {
var bounds = new CGRect (new CGPoint (table2.EnclosingScrollView.ContentView.Bounds.Left, table1.EnclosingScrollView.ContentView.Bounds.Top), table2.EnclosingScrollView.ContentView.Bounds.Size);
if (bounds == table2.EnclosingScrollView.ContentView.Bounds)
return;
table2.ScrollPoint (bounds.Location);
} else {
var bounds = new CGRect (new CGPoint(table1.EnclosingScrollView.ContentView.Bounds.Left, table2.EnclosingScrollView.ContentView.Bounds.Top), table1.EnclosingScrollView.ContentView.Bounds.Size);
if (table1.EnclosingScrollView.ContentView.Bounds == bounds)
return;
table1.ScrollPoint (bounds.Location);
}
}

这里没什么太花哨的...有一些边界相等检查以避免最终的无限循环(table1 告诉 table2 同步,然后 table2 告诉 table1 等等,永远)。 AFAI 请记住,如果您 ScrollPoint 到当前滚动位置,则不会触发边界更改,但由于否则会发生无限循环,我认为额外的检查是值得的 - 您永远不知道 future 的 os x 版本中会发生什么。

关于cocoa - NSTableView: float (或固定)列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779446/

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