Як встановити висоту заголовка таблиці в UITableView?


77

Я переглянув документи Apple про клас UITableView та посилання делегатів, але не зміг знайти спосіб явного встановлення висоти заголовка таблиці.

Я встановив висоту комірки таблиці, використовуючи такий делегат:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

і встановити висоту верхнього / нижнього колонтитула розділу, використовуючи наступні делегати.

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

Хтось може допомогти мені встановити висоту верхнього / нижнього колонтитула таблиці?

Дякую.


1
це не працює, якщо ви повертаєте 0; але коли я повертаю 0,1f, це справді спрацьовує для мене
— igrek

Відповіді:


65

Просто встановіть властивість frame таблиціHeaderView.


Я це вже роблю. Я встановив для свого зображення таблицю viewhead. Я не можу змінити висоту заголовка таблиці. Річ у тому, що розмір HeaderImaze становить 640x88, і його масштаб перетворюється на 320x88, що неправильно, тому я хочу встановити висоту заголовка моєї таблиці на 44, коли вказана ширина роздільної здатності зображення становить 640.
— applefreak

1
Привіт Роджере, я думаю, твоя ідея повинна спрацювати. Я намагався встановити властивість кадру, використовуючи "plainTableView.tableHeaderView.frame = CGRectMake (0,0,320,44);" але нічого не відбувається. Зверніть увагу, що мій розмір зображення, якщо 640x88, і я призначаю його tableHeaderView.
— applefreak

Наступне працювало у мене. Мені не вдалося змінити висоту таблиці, але я скинув висоту зображення. if (headerImage.bounds.size.width == 640) [headerImage setFrame: CGRectMake (0, 0, headerImage.bounds.size.width, headerImage.bounds.size.height / 2)];
— applefreak

62

Я знайшов хороший хак. Додайте рядок нижче після модифікації властивостей кадру

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

Фокус у (я думаю), що UITableView кешує висоту (насправді фрейм), коли ви призначаєте подання властивості tableHeaderView. Наведений вище рядок просто знову призначає висоту.


Однак, якщо ви намагаєтеся оживити зміни, це, здається, працює лише у напрямку зменшення.
— Гуджамін,

1
Анімація чи ні, це найшвидше рішення. Ідеально :)
— iPhoneNoob

Не можу повірити, що це було рішення! Це працює для зменшення та збільшення заголовка. Для Swift, який я роблю - tableView.tableHeaderView! .Frame = CGRectMake (0, 0, self.view.frame.size.width, 100) tableView.tableHeaderView = self.tableView.tableHeaderView
— Майкл Маккенна

39
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    sizeHeaderToFit()
}

private func sizeHeaderToFit() {
    let headerView = tableView.tableHeaderView!

    headerView.setNeedsLayout()
    headerView.layoutIfNeeded()

    let height = headerView.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
    var frame = headerView.frame
    frame.size.height = height
    headerView.frame = frame

    tableView.tableHeaderView = headerView
}

Детальніше тут


1
Приголомшливо Велике спасибі Кріс. Ваша функція все ще чудово працює у viewDidAppear. Це буде краще, ніж viewDidLayoutSubviews, який викликається багато разів.
— truongky

1
@truongky Ні, viewDidLayoutSubviews працюватиме, наприклад, при повороті або при зміні розміру вікна (наприклад, розділений екран iPad); бажане, щоб розмір змінився після нього, viewWill / DidAppear ніколи не оновить, і це буде виглядати неправильно.
— Vive

2
Це призводить до зависання через нескінченні петлі макета для мене станом на iOS 12.4
— Trev14,

10

Якщо вам це все ще потрібно, чи намагалися ви встановити властивість

self.tableView.tableHeaderView 

Якщо ви обчислите потрібну висоту та встановите новий вигляд для tableHeaderView:

CGRect frame = self.tableView.tableHeaderView.frame;
frame.size.height = newHeight;

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:frame];

Це має спрацювати.


7

Це працює зі мною лише в тому випадку, якщо я спочатку встановив для колонтитула / заголовка табличного перегляду значення nil:

self.footer = self.searchTableView.tableFooterView;
CGRect frame = self.footer.frame;
frame.size.height = 200;
self.footer.frame = frame;
self.searchTableView.tableFooterView = nil;
self.searchTableView.tableFooterView = self.footer;

Переконайтеся, що self.footer є надійним посиланням для запобігання виведенню нижнього колонтитула


self.searchTableView.tableFooterView = self.searchTableView.tableFooterView;працює також.
— superarts.org

4

Swift 4 - ви можете управляти висотою за допомогою HEIGHT_VIEW, просто додайте ці коди, він працює

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let HEIGHT_VIEW = 60
    tableView.tableFooterView?.frame.size = CGSize(width: tblView.frame.width, height: CGFloat(HEIGHT_VIEW))

    tableView.tableHeaderView?.frame.size = CGSize(width:tblView.frame.width, height: CGFloat(HEIGHT_VIEW))
}

Найкраща відповідь
— Michał Ziobro

2
Хороше рішення, але цей "tblView" - це удар у вічі! : 'D
— Алессандро Франкуччі

2

Просто створіть Footer Wrapper View за допомогою конструктора, UIView(frame:_) тоді, якщо ви використовуєте файл xib для FooterView, створіть подання з xib і додайте як subView до подання обгортки. потім присвоїти обгортку tableView.tableFooterView = fixWrapper.

    let fixWrapper = UIView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 54)) // dont remove
    let footer = UIView.viewFromNib("YourViewXibFileName") as! YourViewClassName
    fixWrapper.addSubview(footer)
    tableView.tableFooterView = fixWrapper
    tableFootterCostView = footer

Для мене це чудово працює! суть полягає у створенні подання нижнього колонтитула за допомогою конструктора (frame:_). Навіть якщо ви створюєте UIView () і призначаєте властивість кадру, це може не спрацювати.


2

Якщо додати подання як подання заголовка таблиці в IB, встановіть кадр цього подання в IB на вкладці 5 (інспектор розмірів)


1

Якщо ви використовуєте XIB для основного заголовка tableView, ви можете встановити XIB як вільну форму, встановивши Height, як хочете, і зніміть клавіші Autoresizing верхній, нижній блоки та верхню, нижню стрілки. Будуть вибрані лише горизонтальні фрагменти. .


1

Ви можете створити UIView з бажаною висотою (ширина повинна бути такою, як UITableView), і всередині нього ви можете розмістити UIImageView із зображенням відповідних розмірів: вони не розтягуватимуться автоматично.

Ви також можете вказати поле над і під внутрішнім UIImageView, надавши більшу висоту подання контейнера.

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


1

Якщо ви програмуєте програму tableHeaderView, просто встановіть її всередині viewDidLayoutSubviews.

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupTableViewHeader()
    }

    private func setupTableViewHeader() {
        // Something you do to set it up programatically...
        tableView.tableHeaderView = MyHeaderView.instanceFromNib() 
    }

Якщо ви не встановили його програмно, вам потрібно зробити подібне до того, що відповів @Kris на основі цього посилання

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        sizeHeaderToFit()
    }

    private func sizeHeaderToFit() {
        if let headerView = tableView.tableHeaderView {
            headerView.setNeedsLayout()
            headerView.layoutIfNeeded()

            let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
            var frame = headerView.frame
            frame.size.height = height
            headerView.frame = frame

            tableView.tableHeaderView = headerView
        }
    }


1

Відповідь @kris корисна для мене, якщо хтось хоче її в Objective-C.

Ось код

-(void)viewDidLayoutSubviews{
     [super viewDidLayoutSubviews];
     [self sizeHeaderToFit];
}

-(void)sizeHeaderToFit{
     UIView *headerView = self.tableView.tableHeaderView;
     [headerView setNeedsLayout];
     [headerView layoutIfNeeded];
     CGFloat height = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
     CGRect frame = headerView.frame;
     frame.size.height = height;
     headerView.frame = frame;
     self.tableView.tableHeaderView = headerView;
}

0

У Xcode 10 ви можете встановити верхній і нижній колонтитули висоти розділу на вкладці "Інспектор розмірів"

Заголовок Інспектора розмірів


-1

За допомогою авторозкладки ви можете зробити щось на зразок:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = <your-header-height>

або якщо ваші заголовки різної висоти, виконайте:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return <your-header-height>
}

ОП попросив заголовок tableView, а не заголовок розділу;)
— Climbatize

-1

Якщо ви змінили висоту headView tableView, просто скиньте фрейм headerView, а потім скиньте headerView таблиціView:

self.headerView.frame = newFrame;
self.tableView.tableHeaderView = self.headerView;

Це робить набагато більше, ніж потрібно. Не використовуйте його для такого простого завдання. Простого setNeedsLayout достатньо на випадок, якщо ви описуєте.
— Vive

-2

Використовувати властивість за замовчуванням для подання таблиці:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 35.0;
}

Дякую


1
Ні, це не працює. Я спробував. Він змінює розмір лише для верхнього / нижнього колонтитула розділу, а не для верхнього / нижнього колонтитула таблиці. Мені чогось не вистачає?
— applefreak

42
Ми не обговорюємо заголовка SEction. йдеться про заголовок
— tableView

-2
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
}

або ви також можете використовувати, як це

tableView.estimatedSectionHeaderHeight 

Ми не обговорюємо заголовка SEction. мова йде про заголовок tableView
— Артур Гарза,

Я використовую верхній і нижній колонтитули розділів як верхній і нижній колонтитули таблиці. Отже, це дійсно для мене і було корисно. Я знайшов це простіше, ніж інші рішення.
— Девід Дж.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.