web-dev-qa-db-ja.com

UITableView titleForHeaderInSectionはすべてのキャップを表示します

TitleForHeaderInSectionを使用して、UITableViewセクションのヘッダーを表示しています。 iOS6 SDKでは正常に機能しましたが、iOS7 SDKはすべてのCAPSにヘッダーを表示します。

Appleの最新のヒューマンインターフェイスガイドラインの一部だと思います。そこにあるすべての例は、すべて大文字のヘッダーを示しています。また、私のiPhoneの設定のすべてのセクションヘッダーはすべて大文字です。

しかし、それを回避する方法はあるのでしょうか。通常、一貫性が向上する場合は大文字を表示しても構いませんが、セクションヘッダーに人の名前を表示する必要がある場合、少し厄介です。

誰かが大文字化を回避する方法を知っていますか?

44
gbroekstg

はい、これと非常によく似た問題がありました。私自身の解決策は次のとおりでした。

Apple UITableViewHeaderFooterViewのドキュメント(それへのリンクはいらいらさせますが、お気に入りの検索エンジンで簡単に見つけることができます)は、独自のビューをフォーマットせずにヘッダービューのtextLabelにアクセスできると述べていますviewForHeaderInSectionメソッド経由。

textLabelビューのプライマリテキストラベル。 (読み取り専用)

@property(nonatomic、readonly、retain)UILabel * textLabelディスカッションこのプロパティの値にアクセスすると、詳細テキスト文字列を表示するためのデフォルトのラベルがビューで作成されます。 contentViewプロパティにサブビューを追加して自分でビューのコンテンツを管理している場合、このプロパティにアクセスしないでください。

ラベルは、文字列のサイズに基づいて可能な限り最適な方法でコンテンツビュー領域に収まるようにサイズ設定されます。そのサイズは、詳細テキストラベルが存在するかどうかによっても調整されます。

ラベルテキストを変更するのに最適な場所は、追加の検索でwillDisplayHeaderViewメソッド( iOS7スタイルで `viewForHeaderInSection`を実装する方法? )でした。

したがって、私が思いついた解決策は非常にシンプルで、titleForHeaderInSectionによって実際に設定された後、テキストラベル文字列の変換を行うだけです。

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        //I have a static list of section titles in SECTION_ARRAY for reference.
        //Obviously your own section title code handles things differently to me.
    return [SECTION_ARRAY objectAtIndex:section];
}

次に、willDisplayHeaderViewメソッドを呼び出して、外観を変更します。

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){
        UITableViewHeaderFooterView *tableViewHeaderFooterView = (UITableViewHeaderFooterView *) view;
        tableViewHeaderFooterView.textLabel.text = [tableViewHeaderFooterView.textLabel.text capitalizedString];
    }
}

セクション番号もメソッドに渡されるので、そこに独自の「if」または「switch」句を入れることができます。したがって、ユーザー名/クライアント名を大文字で選択して表示できることを願っています。

ベン。

__

面白いsigをSO 'cosに入れるのをやめました。

69
Animal451

私が見つけた解決策は、「titleForHeaderInSection」メソッドにタイトルを追加することです

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
   return @"Table Title";
}

次に、willDisplayHeaderViewメソッドを呼び出してUpdateを実行します。

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
{
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    header.textLabel.textColor = [UIColor darkGrayColor];
    header.textLabel.font = [UIFont boldSystemFontOfSize:18];
    CGRect headerFrame = header.frame;
    header.textLabel.frame = headerFrame;
    header.textLabel.text= @"Table Title";
    header.textLabel.textAlignment = NSTextAlignmentLeft;
}
21
user3540599

文字列をそのままにしておきたい場合は、次のようにするだけです:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    if ([view isKindOfClass:[UITableViewHeaderFooterView class]] && [self respondsToSelector:@selector(tableView:titleForHeaderInSection:)]) {
        UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;
        headerView.textLabel.text = [self tableView:tableView titleForHeaderInSection:section];
    }
}

迅速なソリューション:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView, self.respondsToSelector(Selector("tableView:titleForHeaderInSection:")) {
        headerView.textLabel?.text = self.tableView(tableView, titleForHeaderInSection: section)
    }
}
17
tobihagemann

Swiftでは、

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let headerView = view as! UITableViewHeaderFooterView
    headerView.textLabel.text = "My_String"
}
15
Jeffrey Neo

私が見つけた解決策の1つは、UITableViewHeaderFooterViewを利用することです。

の代わりに

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"some title";
}

行う

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    static NSString *identifier = @"defaultHeader";
    UITableViewHeaderFooterView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:identifier];
    if (!headerView) {
        headerView = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:identifier];
    }
    headerView.textLabel.text = @"some title";
    return headerView;
}

面倒な欠点は、テーブルビューがセクションヘッダーの高さを自動的に調整しなくなることです。そのため、ヘッダーの高さが変化する場合は、次のようにする必要があります。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    id headerAppearance = [UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil];
    UIFont *font = [headerAppearance font];
    CGFloat viewWidth = CGRectGetWidth(tableView.frame);
    CGFloat xInset = 10;
    CGFloat yInset = 5;
    CGFloat labelWidth = viewWidth - xInset * 2;
    CGSize size = [sectionInfo.name sizeWithFont:font constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT)];
    return size.height + yInset * 2;
}

将来のバージョンで壊れる可能性があるため、このようにレイアウト情報(挿入図)をハードコーディングするのは本当に好きではありません。誰かがヘッダーの高さを取得/設定するより良いソリューションを持っているなら、私はすべて耳です。

4
Joseph Lin

ありがとう@ Animal451。これは、あらゆるタイプのヘッダー文字列で機能する、より一般的なソリューションです。

// We need to return the actual text so the header height gets correctly calculated
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return self.headerString;
}

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    [header.textLabel setText:self.headerString];       //String in the header becomes uppercase. Workaround to avoid that.

}

重複を避けるために、ヘッダー文字列はどこでも宣言できます。 -viewDidLoadメソッドで実行しました。

3
moon4e

最も簡単な解決策は以下でした:Swift 2.x

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

        header.textLabel?.text = header.textLabel?.text?.capitalizedString
}
3
Dheeraj D

@ Animal451の投稿に加えて。 Swift 3を使用できます

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
  guard section == 0 ,
    let tableViewHeaderFooterView = view as? UITableViewHeaderFooterView
    else { return }

  tableViewHeaderFooterView.textLabel?.text = "Your awesome string"
 }

そして無視-titleForHeaderInSection:

このコードは第1セクション専用であることに注意してください。すべてのセクションを確認する場合は、それらのセクションのサポートを追加する必要があります

3
KIO

Swift 3.x:

if let headerView = view as? UITableViewHeaderFooterView {
    headerView.textLabel?.text? = headerView.textLabel?.text?.capitalized ?? ""
}
2
Matt Bearson

Swift

実装では、titleForHeaderInSectionwillDisplayHeaderView関数の両方でセクションヘッダーテキストを指定する必要があることがわかりました。ヘッダーは非表示になります。

    extension ViewController: UITableViewDelegate, UITableViewDataSource {

        func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            let sectionHeader =  datasource[section].sectionHeader  

            // Header Title
            return sectionHeader 
        }

        func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

            guard let header = view as? UITableViewHeaderFooterView else { return }
            header.textLabel?.textColor = UIColor.darkGray
            header.textLabel?.font = UIFont.systemFont(ofSize: 20, weight: .semibold)
            header.textLabel?.frame = header.frame

            // Header Title
            header.textLabel?.text = datasource[section].sectionHeader
        }

    }
1
nikdange_me

私のために働いた解決策は、単純なUILabelインスタンス変数を作成して、セクションヘッダービューとして使用することでした。 (あなたのニーズは異なるかもしれませんが、私にとっては、ヘッダーにテキストを入れることだけが必要でした...)そして、viewForHeaderInSectionの中に、必要に応じてラベルを設定し、このラベルをヘッダービューとして返します。

その後、ヘッダーのテキストを更新するたびに、ラベルのテキストを直接変更します。

.hファイル内:

@property (nonatomic, retain)  UILabel  *sectionHeaderLabel;

その後、.mファイルで:

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [self    refreshMySectionHeaderLabel]; // I created this handy little method to update the header text
}


// Get the latest text for the section header...
-(UILabel   *)  refreshMySectionHeaderLabel   {
    // Initialise the first time.    
    if( sectionHeaderLabel   ==  nil )   {
        sectionHeaderLabel   =   [[UILabel   alloc] initWithFrame:   CGRectNull];
    }

    // ...
    // May also set other attributes here (e.g. colour, font, etc...)
    // Figure out the text...    
    sectionHeaderLabel.text   =   @"Your updated text here...";


    return sectionHeaderLabel;
}

セクションヘッダーを更新する場合は、次のように呼び出します。

[self refreshMySectionHeaderLabel];

...または単に呼び出すことができます:

sectionHeaderLabel.text = @"The new text...";

注:セクションは1つだけです(セクション0)。複数のセクションを考慮する必要がある場合があります...

1
Bob Cowe

@Dheeraj Dの回答に基づく1つのライナーソリューション:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
  (view as? UITableViewHeaderFooterView)?.textLabel?.text = (view as? UITableViewHeaderFooterView)?.textLabel?.text?.capitalized
}
1

RubyMotion/RedPotionを使用して、これをTableScreenに貼り付けます。

  def tableView(_, willDisplayHeaderView: view, forSection: section)
    view.textLabel.text = self.tableView(_, titleForHeaderInSection: section)
  end

何が起こっているのかと思いますが、そこのどこかでテキストがすべて大文字に設定されています。この小さなトリックは、テキストを元の状態にリセットします。私にとって魅力のように動作します!

0
Eli Duke