2015-11-18 27 views
0

我想達成什麼是這樣的:
DevExpress Grid
Table with fixed columnsNSTableView的:浮動(或固定)列

在上面的鏈接的表格可以具有「固定」欄目,不與滾動其他內容。

我所知道的NSTableView小號addFloatingSubview:forAxis:方法的floatsGroupRows功能,並且NSScrollView的「;但爲了達到上述一個,這些是不夠的:

  • 的列有未NSView S,首先
  • 的表頭和表的內容按NSScrollView(這將放置到2個獨立的NSClipView小號是默認的操作NSTableView

所以只要我找不到任何內置的解決方案。我唯一的想法是使用3 NSTableView(彼此相鄰)(左側+1,右側+1);並手動同步它們中的垂直滾動。如何同步水平滾動,現在這是一個更難的問題。左右兩側不應該滾動,所以應該「浮動」。 對於表格的內容,NSScrollViewaddFloatingSubview:forAxis:方法應該工作IMO(*);但列標題是不同的動物。好吧,仍然應該有一種方法通過黑客列的圖紙來實現這一浮動行爲......

不過,我仍然沒有開始執行上述之一,因爲我NSTableView已經夠慢(NSTableview View Based Scrolling Performance) ,我相信這些加上的東西會讓它變得非常糟糕。

有沒有人(更好)的想法如何在可可中實現浮動列? 任何幫助非常感謝!

編輯

(*):NSScrollViewaddFloatingSubview:forAxis:不適合這項工作。正如我現在看到的那樣,如果NSView給出的這個方法是NSTableView的子視圖,那麼它會得到特殊的處理。可能該表格將自己的邏輯添加到;現在對我來說,NSTableView一次只能有1個浮動行。

+1

如何同步水平滾動:[同步滾動視圖](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/NSScrollViewGuide/Articles/SynchroScroll.html)。 – Willeke

+0

謝謝,有用的來源。 (對於垂直滾動的同步,不是水平的,水平滾動不需要任何同步) – nvirth

+0

我會注意不要試圖通過結合現成的可可組件來模擬這些截圖。正如你似乎欣賞,結合和填充多個表視圖,然後同步滾動,然後克服性能問題將成爲一個萬能的頭痛。相反,放棄你理想的方法,並專注於提出一個以更傳統的方式使用可用組件的解決方案 - 如果你這樣做,我認爲你會爲你自己保證很多努力,並最終得到一個很多的UI更容易與之合作。 –

回答

1

我已經實現了垂直同步兩個NSTableViews。不太清楚爲什麼你需要三個,但無論如何。請注意,這是使用Xamarin.Mac庫的所有c#代碼。這些是對原生Cocoa平臺的封裝。你將不得不將它轉換成obj c/swift自己。這應該不難。

在清醒從筆尖:

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軸的照顧。請注意,即使在由於慣性滾動或邊界的程序化更改(或放大/縮小視圖或調整視圖大小等)而發生滾動時,此功能仍然有效。這種事件可能並不總是觸發專門用於「用戶滾動」的事件,因此這是更好的方法。貝婁是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); 
     } 
    } 

沒什麼特別的在這裏...有一些界限平等檢查,以避免最終的無限循環(表1表2告訴同步,然後表2表1運輸發射車等,永遠)。 AFAI記住,如果你將ScrollPoint移動到當前的滾動位置,邊界確實沒有變化,但是由於會出現無限循環,否則我認爲額外的檢查是值得的 - 你永遠不會知道未來os x版本會發生什麼。