かなりイレギュラーなUIですが、iPad対応をしているときに2つのUITableViewのスクロールを同期させるということをやったのでメモ。
親となるViewControllerにコンテナを2つ用意して
それぞれに同じクラスのUIViewControllerを設定しました。
UIViewControllerの継承クラスであるHogeViewControllerにUITableViewを持たせていたので
それぞれのUIViewControllerにもう片方のUITableViewの contentSize と contentOffset を監視させて同期する。
親ViewControllerでUITableViewを監視する設定をする
HogeViewController* vc1 = self.childViewControllers[0];
HogeViewController* vc2 = self.childViewControllers[1];
[vc1.tableView addObserver:vc2
forKeyPath:@"contentSize"
options:NSKeyValueObservingOptionNew
context:NULL];
[vc2.tableView addObserver:vc1
forKeyPath:@"contentSize"
options:NSKeyValueObservingOptionNew
context:NULL];
[vc1.tableView addObserver:vc2
forKeyPath:@"contentOffset"
options:NSKeyValueObservingOptionNew
context:NULL];
[vc2.tableView addObserver:vc1
forKeyPath:@"contentOffset"
options:NSKeyValueObservingOptionNew
context:NULL];
そして、HogeViewControllerで変更を検知したら同期するようにします。
HogeViewControllerで同期処理をする
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentSize"]) {
UITableView* changedTableView = (UITableView*)object;
if(!CGSizeEqualToSize(self.tableView.contentSize,changedTableView.contentSize)){
self.tableView.contentSize = changedTableView.contentSize;
}
}
else if ([keyPath isEqualToString:@"contentOffset"]) {
UITableView* changedTableView = (UITableView*)object;
if(!CGPointEqualToPoint(self.tableView.contentOffset,changedTableView.contentOffset)){
self.tableView.contentOffset = changedTableView.contentOffset;
}
}
}
この方法だとユーザーが操作していない方のUITableViewにスクロールバーが表示されないのが難点ですが
とりあえず2つのUITableViewのスクロールを同期させる。ということは実現出来ました。