Подтвердить что ты не робот

UITableView titleForHeaderInSection показывает все колпачки

Я использую titleForHeaderInSection, чтобы показать заголовок для раздела UITableView. Он отлично работал с SDK iOS6, но IOS7 SDK показывает заголовок во всех CAPS.

Я предполагаю, что это часть обновленных руководств по человеческому интерфейсу Apple; все примеры там показывают заголовки во всех шапках. Кроме того, все заголовки разделов в настройках моего iPhone находятся во всех шапках.

Однако, интересно, есть ли способ обойти это. Обычно я бы не пропустил показов, если это улучшит согласованность, но когда мне нужно показывать имена людей в заголовке раздела, это немного неудобно.

Кто-нибудь знает, как обойти капитализацию?

4b9b3361

Ответ 1

Да, у нас была очень похожая проблема, и мое собственное решение было следующим:

Документация Apple UITableViewHeaderFooterView (ссылка на нее раздражающе длинна, но вы можете легко ее найти с помощью вашей любимой поисковой системы) говорит, что вы можете получить доступ к текстовому элементу заголовка без необходимости форматировать свой собственный вид с помощью метода viewForHeaderInSection.

textLabel Основная текстовая метка для представления. (Только для чтения)

@property (nonatomic, readonly, сохранить) UILabel * textLabel Обсуждение Доступ к значению в этом свойстве приводит к тому, что представление создает по умолчанию для отображения текстовой строки с подробным описанием. Если вы управляете содержимое представления самостоятельно, добавив subviews в contentView свойство, вы не должны получить доступ к этому свойству.

Метка имеет размер, подходящий для области просмотра содержимого наилучшим образом возможно в зависимости от размера строки. Его размер также скорректирован в зависимости от наличия текстовой метки детали.

С дополнительным поиском лучшим местом для изменения текста ярлыка был метод willDisplayHeaderView (предложенный в Как реализовать` viewForHeaderInSection` в стиле iOS7?).

Итак, решение, которое я придумал, довольно простое и просто преобразует строку текстовых меток после того, как она была фактически установлена ​​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" там, где номер раздела также передается методу, поэтому, надеюсь, он позволит вам выборочно отображать имя пользователя/клиента в заглавных словах.

Бен.

__

Я прекратил вкладывать забавные палочки в СО, потому что я был единственным, кто нашел их забавными.

Ответ 2

которое я нашел, добавляет Title в метод "titleForHeaderInSection"

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

а затем вызовите метод willDisplayHeaderView для обновления:

- (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;
}

Ответ 3

Если вы хотите просто сохранить строку как есть, вы можете просто сделать это:

- (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)
    }
}

Ответ 4

В Swift,

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

Ответ 5

Одно из найденных решений - использовать UITableViewHeaderFooterView.

Вместо

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

Do

- (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;
}

Мне действительно не нравится форматы жесткого кодирования (вставка) таким образом, как это может сломаться в будущей версии. Если у кого-то есть лучшее решение, чтобы получить/установить высоту заголовка, я все уши.

Ответ 6

Спасибо @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.

Ответ 7

Простейшее решение для ниже: Swift 2.x

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

        header.textLabel?.text = header.textLabel?.text?.capitalizedString
}

Ответ 8

В дополнение к посту @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-го раздела. Если вы хотите просмотреть все свои разделы, вам нужно добавить поддержку для них

Ответ 9

Swift 3.x:

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

Ответ 10

Решение, которое работало для меня, состояло в создании простой 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). Возможно, вам придется учитывать несколько разделов...

Ответ 11

Одно решение для линейки, основанное на ответе @Dheeraj D:

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

Ответ 12

СВИФТ

В процессе реализации я обнаружил, что вам нужно указать текст заголовка раздела в titleForHeaderInSection и Функция willDisplayHeaderView, в противном случае заголовок скрывается.

    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
        }

    }

Ответ 13

С RubyMotion/RedPotion вставьте это в свой TableScreen:

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

Я думаю, что происходит то, что где-то там текст устанавливается на ВСЕ CAPS. Этот маленький трюк Сбрасывает текст обратно к тому, что было изначально. Работает как очарование для меня!