web-dev-qa-db-ja.com

インデックス付きのUITableViewでサイドアルファベットの色を変更するにはどうすればよいですか?

アルファベット順のインデックスが付いたテーブルビューがあり、サイドアルファベットを使用してリストをすばやく確認しています。馴染みのない人のために、これを使用します:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

私の問題は、私のアプリケーションのスキンが黒くなっていることです。そして今、側面のアルファベットを見るのは難しいです。

アルファベットの色を変更する方法がわかりません。できれば「白」にしたいです。

45
cmos

残念ながら、インデックスに表示されるテキストの色をカスタマイズすることはできません。最も近いのは、インデックスの背景色とフォントを変更することです。

EricTableonによるiPhone Developersクックブックには、UITableViewIndexビュー(ドキュメントに記載されていないクラス)にアクセスする方法を示すコードがいくつかあります。参照がある場合は、本の175ページを参照してください。背景色とフォントにアクセスできます。このクラスに関連する非公式のドキュメント here を見ることができます。

[〜#〜] warning [〜#〜]これは、ドキュメントに記載されていないクラスのドキュメントに記載されていない使用であるため、使用には注意が必要です。

以下は、小さな変更を加えたクックブックのコードスニペットです。

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {    

  for(UIView *view in [tv subviews])
  {
    if([[[view class] description] isEqualToString:@"UITableViewIndex"])
    {

      [view setBackgroundColor:[UIColor whiteColor]];
      [view setFont:[UIFont systemFontOfSize:14]];
    }
  }

  //rest of cellForRow handling...

} 

これは、UITableViewIndexビューにアクセスして、いくつかの点で変更する方法を示しています。ビューにはサブビューがないように見えるため、インデックスタイトルの配列を使用してカスタム描画を行っている可能性があります。

それは完璧ではありませんが、うまくいけば少し役立つでしょう。

ポール

32
paulthenerd

最小iOSバージョンが6.0より新しい場合は、sectionIndexColorUITableViewプロパティを使用できます。

テーブルビューのインデックステキストに使用する色。

@property(nonatomic、retain)UIColor * sectionIndexColor

討論:

テーブルビューでは、ビューの横にインデックスを表示できるため、ユーザーがテーブルのコンテンツをすばやくナビゲートしやすくなります。このプロパティは、この領域に表示されるテキストに使用する色を指定します。


更新日2014.1.13

オープンソースのサードパーティライブラリを見つけます。 GDIIndexBar は、インデックスの外観をカスタマイズするのに役立ちます。

61
sunkehappy

これは、UITableViewのインターフェイスビルダーで簡単に変更できます。ドキュメント化されていないクラスを使用する必要はありませんか?

フォントの色と背景色も変更できるので、下のスクリーンショットをご覧ください。仕事は良いことです!

21
Jim Tierney

IOS7以降の場合:

self.tableView.sectionIndexColor = [UIColor whiteColor];
self.tableView.sectionIndexBackgroundColor = [UIColor clearColor];
16
Pau Senabre

私は同じ問題を抱えていて、これを行う方法を見つけましたが、これは文書化されていないクラスとメソッドを使用しているので、App Storeにアップロードする前にもう1回考える必要があります。私はこれをiOS5で試しただけなので、以前のバージョンで動作するかどうかわかりません。

Erica Saundersクックブックの例を借りて変更し、テキストの色を赤に変更しました。

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {    

  for(UIView *view in [tv subviews])
  {
    if([[[view class] description] isEqualToString:@"UITableViewIndex"])
    {
      [view performSelector:@selector(setIndexColor:) withObject:[UIColor redColor]];
    }
  }

  //rest of cellForRow handling...

}
11
Martin_G

次のコードを正常に使用しました。

for(UIView *view in [tableView subviews]) {
    if([view respondsToSelector:@selector(setIndexColor:)]) {
        [view performSelector:@selector(setIndexColor:) withObject:[UIColor whiteColor]];
    }
}

これは正常に機能します。これはMooglasの回答と非常によく似ていますが、「UITableViewIndex」という単語の使用は控えています。

11
Magnus

TableViewの色合いを設定できます。

[[UITableView appearance] setTintColor:[UIColor purpleColor]];
8
JMestre

インデックスアルファベットの色を変更する方法があります。

ヘッダーファイルで、UITableViewをプロパティとして宣言します。

@property (weak, nonatomic) IBOutlet UITableView *mainTable;

次に、実装ファイルのviewDidAppearで、次の行を使用します。

//Change the color of the UITableView index color
_mainTable.sectionIndexColor = [UIColor blackColor];

これが、サイドのインデックスバーの背景色を調整するために見つけた最良の解決策です。それはiOS7とおそらくiOS6で動作します。

これをviewDidLoadに追加します

if ([_tableView respondsToSelector:@selector(setSectionIndexColor:)]) {
    _tableView.sectionIndexBackgroundColor = [UIColor clearColor];
    _tableView.sectionIndexTrackingBackgroundColor = [UIColor whiteColor];
}

最初の色はデフォルトの色、2番目はスクロール時の背景色です。

3
Kinoli

Swift 4.1およびXcode 9.4:

tableView.sectionIndexColor = .red
tableView.sectionIndexBackgroundColor = .clear
2
atereshkov

代替タイトルラベルを含む可変配列を作成します。

-(NSArray * )sectionIndexTitlesForTableView:(UITableView * )tableView

@ ""の配列を返します。引用符の間のスペースの数によって、ハイライトされたスクローラーの幅が決まります。 「sectionIndexTitlesForTableView」でラベル更新関数を呼び出します。その関数で、以前に作成した配列のすべてのラベルをスーパービューから削除します。次に、作成して追加しますが、多くのラベルが必要です。次に、それらをテーブルのスーパービューに追加します。

これらは、ラベルを適切な場所に配置するために必要な線です。

rect.Origin.x = table.frame.Origin.x+table.frame.size.width-rect.size.width-2;
rect.Origin.y = 5+table.frame.Origin.y+counter *(280-rect.size.height-([customIndexLabels count]-1))/([customIndexLabels count]-1);
if ([customIndexLabels lastObject]==thisLabel)
{
   rect.Origin.y-=10;
}

お役に立てば幸いです。それは完璧ではありません私はそれを自分で修正するのに十分気にしません。主な問題は、最後のラベルの間隔が均一でないことです。

1
Johnathon Smith