Як встановити висоту заголовка таблиці в 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.