iOS 6 では、私の UITableView のセクション インデックスは、すべての項目をテーブル ビューの高さ全体に均等に分散させます。iOS 7 では、すべての項目が中央に集まってタップしにくくなっています。それらを離す方法はありますか?
7 に答える
ここで考えられる解決策の 1 つ - セクション インデックス タイトル配列に実際のタイトルを追加するたびに空の文字列を追加し、tableView: sectionForSectionIndexTitle: atIndex:
メソッドでインデックスを 2 で割った値を返すことです。
このトリックは、連続するタイトル間の距離をわずかに広げますが、この問題を完全に解決するわけではありません。
Anton の提案を完了する少し簡単な方法があります。また、セクションごとに任意の数のインデックスに拡張できます (Anton が提案したように 2 つだけではなく)。したがって、必要な数の追加のインデックス タイトルを追加します。この例では、4 を使用しました。
indexTitles
したがって、最初に配列に何かを追加しますviewDidLoad
。注:これは、コンテンツを tableView に非同期で追加する場合にも動的に実行できます。そのため、if ステートメントを追加しました。最初のステートメントでない限り、空の文字列をピリオドに置き換えます。これは、最後に迷走期が発生しないようにするためです
@property (nonatomic, strong) NSArray *indexTitles;
- (void) addIndexTitle:(NSString *) indexTitle {
if ([self.indexTitles count]) {
NSInteger last = self.indexTitles.count;
self.indexTitles[last - 1] = @".";
self.indexTitles[last - 2] = @"."; // Change the number of these depending
self.indexTitles[last - 3] = @"."; // on the number of lines in the index titles
}
[self.indexTitles addObject:indexTitle];
[self.indexTitles addObject:@""]; // Add different strings here for multiline
[self.indexTitles addObject:@""]; // index titles
[self.indexTitles addObject:@""];
}
これで、インデックス Title ごとの文字列の数に応じてモジュロ演算子を使用できます。
- (NSInteger) tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
index = index - index % 4; // This is the index of the section you want
NSInteger newIndex = index;
// do any other processing here (if need be) to determine the correct index here
return newIndex;
}
tableView のセクション インデックス タイトルを宣言することを忘れないでください。
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return self.indexTitles;
}
これは、コンテンツを動的にロードするように作成したものです。
私は回避策を見つけました:
- (void)setIndexUIForTableView:(UITableView*)tableView{
//UI the index view
for(UIView *view in [tableView subviews]) {
if([view respondsToSelector:@selector(setIndexColor:)]) {
[view performSelector:@selector(setIndexColor:) withObject:[UIColor clientblack]];
if ([view respondsToSelector:@selector(setFont:)]) {
[view performSelector:@selector(setFont:) withObject:[UIFont systemFontOfSize:15.0]];
[view performSelector:@selector(setBackgroundColor:) withObject:[UIColor clientsidebarGray]];
}
}
}
}
以下をメソッドに追加し、データがロードされた後に
[self setIndexUIForTableView:tableview];
[tableview reloadData];
これは私が遊んで動作するものです。Anton M のアドバイスに従い、Swift 2 と ios 9 を使用します。
次のセクション インデックスがあるとします。
let indexes: [String] = ["A", "B", "C", "D", "E"]
全員が同じページにいるように、A はインデックス 0、B はインデックス 1 などです。
インデックス間に 2 つのスペースが必要だとします。次に、セクション インデックスを次のように定義します。
let indexes: [String] = ["A", "", "", "B", "", "", "C", "", "", "D", "", "", "E"]
つまり、A はまだインデックス 0 ですが、B はインデックス 3、C は 6、D は 9、E は 12 です。
必要なのは、sectionForSectionIndexTitle のオフセットを把握することだけです。これはあなたのテーブルにあるものであるため、あなたが求めているのは実際のタイトルのインデックスです。したがって:
override func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int {
return index / 3
}
したがって、インデックス間に必要な余分なスペースごとに、上記の式の列挙子に 1 を追加する必要があります。これは Playground で簡単にテストできます。
Jatinさんに回避策を試してみましたが、結果はセクションインデックスの色とフォントの変更のみでした。垂直方向に圧縮され、中央に配置されたままになります。
これは iOS7 の新しい動作だと思います (ただし、これが最適な外観ではないと思います)。この動作は、Apple の次の公式ドキュメントでも確認できます: iOS ヒューマン インターフェイス ガイドライン - テーブル ビュー
この mod を試してみましたが、動作しますが、viewDidAppear メソッドでルーチンの呼び出しを設定する必要があるため、ビューが表示されるたびに、このルーチンを呼び出してからテーブルをリロードする必要があります。