2013-09-20 5 views
39

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

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

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

Кто-нибудь знает, как добраться до капитализации?

ответ

4

Одним из решений, которое я нашел, является использование 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; 
} 

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

57

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

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

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

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

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

С дополнительным поиском лучшим местом для изменения текста ярлыка был метод willDisplayHeaderView (предлагается в How to implement `viewForHeaderInSection` on iOS7 style?).

Таким образом, решение, которое я придумал довольно просто и просто делает преобразование строки текста ярлыка, после того, как он на самом деле было установлено 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]; 
    } 
} 

вы можете поместить в своем собственном «если» или положение «выключатель» там, как номер раздела также передается методе, так что надеюсь, это позволит вам показывать пользователь/имя клиента в заглавных словах выборочно.

Ben.

__

я перестал положить занятную Sigs в SO «, потому что я был единственный, чтобы найти их забавными.

+0

Super! Я скопировал метод yourDisplayHeaderView в свой код UITableViewController, и он сразу сработал. Tx! – gbroekstg

+0

Это не работает, если вы хотите отобразить целое предложение, поскольку оно заглаживает каждое слово. – moon4e

+0

Raaah, @ moon4e, будьте творческими! Например, 'название = [NSString stringWithFormat: @ "% @% @", [[название substringToIndex: 1] uppercaseString], \t \t \t \t [[название substringFromIndex: 1] lowercaseString]];' – Martin

19

решение, которое я нашел, добавить заголовок в методе «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; 
} 
+0

добавлены методы titleForHeaderInSection и willDisplayHeaderView. Спасибо –

0

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

3

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

13

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

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

В Swift,

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

С RubyMotion/RedPotion, вставьте в ваш TableScreen:

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

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

3

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

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

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

Что такое объект заголовка? – mimic

+0

это объект UITableViewHeaderFooterView –

+0

Недостаточно, вам нужно предоставить реальный код, чтобы ваш образец работал. – mimic

0

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

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

Swift 3.x:

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

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