ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

UITableViewで一番上の区切り線を表示したい

はじめに

UITableViewの区切り線は、一番上に限りドラッグしないと表示されません。基本こいつは画面全体を占拠して使うケースが多いんで、ヘッダーとかと上手く組み合わさって気にならないのですが

  • UITableViewと親ビューが同じ色
  • 親ビューの中途半端な位置に置く

ような実装をしたい場合、割と気になります。

どこからテーブルが始まってるのかわかりませんね。これを以下のように実装した話をします。

実装

上で見せた完成図ですが、実はUITableViewの上に色をDeveloper>controllHighlightColorに設定した縦幅1pxのUIViewを置いているだけです。しかしそれだけだと、ドラッグしたときに現れる区切り線でおかしくなります。

なのでスクロールした時はこいつを消して、終わったときにはまた表示してあげなければいけません。

- (BOOL)isHiddenForFakeSeparator
{
    return 0 < self.myTableView.contentOffset.y;
}

#pragma mark - UIScrollViewDelegate

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    self.fakeSeparator.hidden = true;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        if (![self isHiddenForFakeSeparator]) {
            self.fakeSeparator.hidden = false;
        }
    }
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    self.fakeSeparator.hidden = true;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if (![self isHiddenForFakeSeparator]) {
        self.fakeSeparator.hidden = false;
    }
}

これで

  • ドラッグとかスクロールしている時
  • セルが表示領域を超えて存在する場合に途中で止めた時

に消えてくれます。ドラッグしないと加速もしないんだからscrollViewWillBeginDecelerating:はいらないかなーとも思ったけど、コードでスクロールさせる場合(セクションスキップとか)は何か起きるかもしれないと思い処理を入れています。

さいごに

デフォルトで一番上の区切り線表示する設定とかあれば教えてください。ただこういうケースってあんまりないよね。