UITableView titleForHeaderInSection показывает все колпачки
Я использую titleForHeaderInSection, чтобы показать заголовок для раздела UITableView. Он отлично работал с SDK iOS6, но IOS7 SDK показывает заголовок во всех CAPS.
Я предполагаю, что это часть обновленных руководств по человеческому интерфейсу Apple; все примеры там показывают заголовки во всех шапках. Кроме того, все заголовки разделов в настройках моего iPhone находятся во всех шапках.
Однако, интересно, есть ли способ обойти это. Обычно я бы не пропустил показов, если это улучшит согласованность, но когда мне нужно показывать имена людей в заголовке раздела, это немного неудобно.
Кто-нибудь знает, как обойти капитализацию?
Ответы
Ответ 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. Этот маленький трюк Сбрасывает текст обратно к тому, что было изначально. Работает как очарование для меня!