IOS 8のtableViewHeader
でUITableView
の奇妙なバグに遭遇しました。削除ボタンを表示するためにセルをスワイプすると(標準のiOSのスワイプ-削除)、スワイプされているセルとともにtableViewHeader
が移動します。セルをスワイプすると、スワイプされているセルと同じようにヘッダーが移動します。テーブルビューの他のセルは移動されず、ヘッダーとスワイプされているセルのみが移動されます。 iOS 7でこれをテストしましたが、問題は発生していません。私には、これはiOS 8のtableViewHeader
のバグのように見えます。これは、このバージョンでのみ発生するものであり、発生しないはずの問題のようです。ヘッダーを削除するスワイプに含める理由はありません。
以下は単なるモックアップです。アプリ内の削除するスワイプはデフォルトのiOSであり、カスタムではありません。
フェリスの答えに基づいて、UITableViewCellをセクションヘッダーとして使用する最も簡単な方法は、viewForHeaderInSectionでセルのcontentViewを返すことです。コードは次のとおりです。
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
return cell.contentView
//cellSectionHeader is my subclassed UITableViewCell
}
これは、テーブルのヘッダーとしてUITableViewCellを使用していたために発生しました。スワイプの問題を解決するには、tableView.tableHeaderView = cell
を使用する代わりに、次を使用します。
UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView
これがなぜ問題を解決するのかはわかりませんが、特にiOS 7で機能するという点で、問題を解決するようです。
セルのcontentViewに想定されているように、すべてのビューをセルビューに追加してください。そうしないと、ボタンが応答しなくなります。
作品:
[cell addSubview:view];
または[self addSubview:view];
動作しません:
[cell.contentView addSubview:view]
または[self.contentView addSubview:view]
セルとともにヘッダーが移動するのを防ぐ方法は、viewForHeaderInSectionでセルのcontentViewを返すことです。 SectionHeaderTableViewCellという名前のサブクラス化されたUITableViewCellがある場合、これは正しいコードです。
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
//Do stuff to configure your cell
return cell.contentView;
}
Swift 3.テスト済みソリューション。 Objective-Cの最初の例で述べたように、キーポイントはcellではなくcell.contentViewを返すため、新しい形式の構文は次のようになります。
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
// HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")
cell.songLabel.text = "Your Section Name"
return cell.contentView
}
.contentViewメソッドで言及されていない問題の1つは、Table ViewセルがlayoutSubviewsを使用する場合、layoutSubviewsが呼び出されないため、希望する動作が得られない可能性があることです。最終的に、通常のセル操作とヘッダー操作の両方をサポートする完全に独立したUIViewサブクラスを作成し、それを使用する最小限のUITableViewセルクラスを作成しました。
このメソッドを実装して、スワイプをチェックするための適切な条件を与えてみてください。このメソッドがヘッダービューに対して呼び出される場合。
1.tableView:editingStyleForRowAtIndexPath:2.tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:3.tableView:shouldIndentWhileEditingRowAtIndexPath: