LoginSignup
13
10

More than 5 years have passed since last update.

2つのUITableViewのスクロールを同期させる

Last updated at Posted at 2014-10-15

かなりイレギュラーなUIですが、iPad対応をしているときに2つのUITableViewのスクロールを同期させるということをやったのでメモ。

親となるViewControllerにコンテナを2つ用意して
それぞれに同じクラスのUIViewControllerを設定しました。

UIViewControllerの継承クラスであるHogeViewControllerにUITableViewを持たせていたので
それぞれのUIViewControllerにもう片方のUITableViewの contentSizecontentOffset を監視させて同期する。

親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のスクロールを同期させる。ということは実現出来ました。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10