2013-03-12 103 views
6

我期待創建具有以下特徵的表:帶有可鎖定列和水平滾動的表視圖?

  • ,隨着 表中的其餘橫向滾動列數量可變
  • 變量數列可鎖定的不水平滾動 與表的其餘部分
  • 可排序列標題
  • 卷軸垂直
  • 卷軸水平

我看到人們使用不同的策略來實現類似的功能,包括:

  1. 的UITableView與含有放置內的另一個的UIScrollView來處理水平滾動的一個UITableView 變換90度的每個表格單元。爲了這個工作,但我需要爲每個單元格使用鎖定的旋轉表格,如果我想要滾動整個主表格而不是每個表格單元格中的表格,好像會出現一些單元出毛病。
  2. 第一個變體,但對每個表格單元使用自定義uiview而不是uitableview。 (到目前爲止的主要候選人)
  3. 自定義UIScrollview類,它複製了 UITableview的功能,並添加了諸如MDSpreadView之類的功能。看起來像最靈活和最難實施的。

有沒有人有什麼樣的例子/建議/建議可以很容易地啓動和運行,很好的滾動性能和靈活性。

我仍處於規劃階段,試圖找出解決這個問題的最佳方法,並提出了一些構思,其中包含兩個同步滾動的可視化視圖。左表視圖將用於鎖定列,右表將用於水平滾動表。兩個表都會使用與每個列具有自定義uiview對象的表格單元格相同的uiviews。

enter image description here

UPDATE

似乎很直截了當地能夠同步鎖定列和水平滾動表,到目前爲止,這似乎是我正在朝着扶着選項間滾動( #2)。有沒有人用這種方法看到任何潛在的陷阱或障礙?

所需的成品我是可以在應用程序的Roambi發現後的一個很好的例子(下圖)

enter image description here

THX

+0

我們已將所有這些功能內置到我們的產品中:http://www.ioscomponents.com/Home/IOSDataGrid – 2014-08-31 23:53:29

回答

1

我在我自己的一個這樣做應用程序 - 看看MDSpreadView。它的委託/數據源調用就像UITableView的調用一樣。

+0

是的,我遇到了這個庫,雖然它似乎沒有排序鎖定的列。似乎可能需要更多的工作來實現該功能,然後試圖推出自己的? – 2013-03-14 15:23:33

+0

@ s.newave您必須將自己的解決方案推出該問題 - 就像使用普通的舊UITableView一樣。 – Undo 2013-03-14 15:29:37

1

我用三個視圖實現了這一點,通過標準協議和單個視圖控制器進行管理。在這個解決方案中,你只關心鏈接兩個表視圖控制器的垂直滾動。水平滾動通過包裝表視圖主體的滾動視圖免費提供。我利用下面的UITableViewDelegate函數來獲取鎖定列標題:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; 

enter image description here

視圖結構

- View - The VCs root view 
    - Table View  - rowHeadersTable     - the locked left hand columns 
    - Scroll View - rowBodyHorizontalScrollView  - a container of the table body 
    - Table View - rowBodyVerticalContentTableView - the table body, as wide as it needs to be beyond the frame of the parent scroll view 

視圖控制器

實現協議:

@interface LockedTableColumnsViewController : UIViewController <UITableViewDataSource,UITableViewDelegate> 

設置:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self.rowHeadersTable     setDataSource:self]; 
    [self.rowHeadersTable     setDelegate:self]; 

    [self.rowBodyVerticalContentTableView setDataSource:self]; 
    [self.rowBodyVerticalContentTableView setDelegate:self]; 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    // This ensures the scroll view can only scroll horizontally, and adapts to the size of its member content 
    [self.rowBodyHorizontalScrollView setContentSize:self.rowBodyVerticalContentTableView.frame.size]; // Important to do this here rather than viewDidLoad, because we want a final reading on self.rowBodyVerticalContentTableView.frame.size 

    [super viewDidAppear:animated]; 
} 

// Do your Table Data Source however you choose 

管理的垂直滾動rowHeadersTable和rowBodyVerticalContentTableView之間的鏈接:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView == self.rowBodyVerticalContentTableView) { 
     [self.rowHeadersTable setContentOffset:CGPointMake(self.rowHeadersTable.contentOffset.x, scrollView.contentOffset.y)]; 
    } 
    else if (scrollView == self.rowHeadersTable) { 
     [self.rowBodyVerticalContentTableView setContentOffset:CGPointMake(self.rowBodyVerticalContentTableView.contentOffset.x, scrollView.contentOffset.y)]; 
    } 
} 

N.B.由於它使用了原型單元格等,因此這對長時間(意思是高的)表格來說會表現的很好。但是它並不針對水平激烈的行內容進行優化。我的表格內容是文本,列數有限。如果你沒有這種奢侈品,你總是可以使你的表格行身爲水平流動的集合視圖,但是你必須鏈接所有的行集合視圖偏移量(通過我猜測的可見單元格)。那是另外一種動物。祝你好運!

1

如果您的目標操作系統比iOS 6.0舊,則可以使用嵌入的表格視圖廣告here。不要忘記同步每個水平表的內容偏移量。

但是,如果您的目標iOS 6.0+可以使用MMSpreadsheetView,但其性能非常差,您不能爲其列設置不同的大小。

您擁有的最佳選擇是編寫您自己的UICollectionView佈局。