self.view
在UITableViewController
是UITableView
因爲tableViewController覆蓋loadView
視圖控制器上。
如果您運行下面的代碼:
UITableViewController *tableViewController = [[UITableViewController alloc] init];
NSLog(@"%@",tableViewController.view);
你會得到以下控制檯輸出:
2014-05-13 21:19:02.823 Test[28681:60b] <UITableView: 0x109834200; frame = (0 20; 320 548); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x109548f00>; layer = <CALayer: 0x109548c40>; contentOffset: {0, 0}>
正如你所看到的,self.view
不是UIView
,而是它是UITableView
。你的隔離視圖滾動使用的tableView因爲調用:
[self.view addSubview:separatorView];
是完全一樣的呼喚:
[self.tableView addSubview:separatorView];
如果你想要的分離停留在一個固定的位置,它需要被添加到tableView/collectionView的超級視圖,而不是滾動視圖本身。
之所以沒有發生在UICollectionViewController
是因爲self.view
實際上是一個UICollectionViewControllerWrapperView
對象。這是一個私人班,但從名字來看,我認爲這是一個UIView
,包裝UICollectionView
。
實現你想要的最明智的方法是使用custom container view (child view controller)這將是包含分隔視圖和tableView/collectionView控制器的UIViewController
子類。
如果你不想添加一個子視圖控制器,那麼另一種方法就是像你說的那樣,創建一個UIViewController
子類並在視圖控制器視圖中添加分隔視圖和tableView作爲子視圖,但是如果你不願意不使用UITableViewController
你會失去獎勵功能,如自動調整tableView的contentInsets以獲得鍵盤外觀等。
您需要做同樣的事情 - 處理滾動視圖委託方法並在滾動表格時不斷更新子視圖的位置。 – rmaddy
@maddy在收集視圖中,我不需要更新子視圖的位置。在添加視圖時我將其設置了一次,並且在滾動時它從不移動。 –