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

Свойство tableFooterView не фиксирует нижний колонтитул внизу таблицы.

Я устанавливаю представление нижнего колонтитула в методе viewDidLoad:

UIView *fView = [[UIView alloc] initWithFrame:CGRectMake(0, 718, 239, 50)];
fView.backgroundColor =[UIColor yellowColor];
self.table.tableFooterView = fView;

К сожалению, нижний колонтитул не рисует указанную выше (x,y), указанную выше, но она прикрепляется к ячейкам, поэтому, если в представлении таблицы есть 4 ячейки, нижний колонтитул будет нарисован в 5-й ячейке.

Я даже пробовал метод протокола, tableView:viewForFooterInSection

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{

UIView *fView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 239, 50)];
fView.backgroundColor =[UIColor yellowColor];
    return fView;
}

проблема не решена, я уверен, что свойство tableFooterView должно иметь вид нижнего колонтитула внизу таблицы, но я не уверен, что мне здесь может не хватать? Thanx заранее.

4b9b3361

Ответ 1

Поскольку ваша цель состоит в том, чтобы нижний колонтитул оставался фиксированным в нижней части экрана, а не прокручивался вместе с таблицей, вы не можете использовать нижний колонтитул таблицы. На самом деле вы даже не можете использовать UITableViewController.

Вы должны реализовать свой контроллер представления как UIViewController. Затем вы добавляете свой собственный вид таблицы в качестве подзаголовка. Вы также добавляете нижний колонтитул в виде подсмотра представления контроллера вида, а не вида таблицы. Удостоверьтесь, что вы занимаете размер стола, поэтому его нижняя часть находится в верхней части нижнего колонтитула.

Вам необходимо, чтобы ваш контроллер просмотра соответствовал протоколам UITableViewDataSource и UITableViewDelegate и подключил все, чтобы реплицировать функции UITableViewController.

Ответ 2

В нижней части содержимого всегда добавляется представление нижнего колонтитула.
Это означает, что нижний нижний колонтитул секции будет добавлен под ячейками секции, а нижний колонтитул стола - внизу всех разделов - независимо от положения, которое вы задали в своем представлении.

Если вы хотите добавить "статический" контент, вам следует рассмотреть возможность добавления представления за пределами представления таблицы (супервизор), что невозможно, если вы используете UITableViewController - или используете [self.table addSubView:view] и отрегулируете положение/преобразование к представлению таблицы contentOffset в методе делегата scrollViewDidScroll: (UITableView является подклассом UIScrollView, поэтому вы также получаете его делегированные вызовы), как в этом коде:

@implementation YourTableViewController {
    __weak UIView *_staticView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIView *staticView = [[UIView alloc] initWithFrame:CGRectMake(0, self.tableView.bounds.size.height-50, self.tableView.bounds.size.width, 50)];
    staticView.backgroundColor = [UIColor redColor];
    [self.tableView addSubview:staticView];
    _staticView = staticView;
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    _staticView.transform = CGAffineTransformMakeTranslation(0, scrollView.contentOffset.y);
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // this is needed to prevent cells from being displayed above our static view
    [self.tableView bringSubviewToFront:_staticView];
}

...

Ответ 3

Другим способом является использование UITableViewController в раскадровке и встраивание его в UIViewController в виде контейнера. Затем вы можете использовать автоматический макет, чтобы установить связь между нижним колонтитулом и видом контейнера, который содержит UITableView

Ответ 4

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

[self.navigationController setToolbarHidden:NO];

Ответ 5

Мне удалось получить ярлык, который будет привязан к нижней части моего статического UITableViewController. Не идеальное решение для всех сценариев, но работало для моих простых потребностей.

UIView* v = [[UIView alloc] initWithFrame:self.view.bounds];
CGFloat labelHeight = 30;
CGFloat padding = 5;
UILabel* l = [[UILabel alloc] initWithFrame:CGRectMake(0, v.frame.size.height - labelHeight - padding, self.view.frame.size.width, labelHeight)];
l.text = @"Hello World";
[v addSubview:l];
[self.tableView setBackgroundView:v];

Ответ 6

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

Добавьте self.footerView к self.tableView в качестве подзаголовка в -viewDidLoad: или где-то в этом роде, затем установите делегат для self.tableView, обновите вставку содержимого таблицы view до self.tableView.contentInset = UIEdgeInsetsMake(0, 0, CGRectGetHeight(self.footerView), 0); и настройте следующее методы:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
  [self updateFooterView];
}

- (void)updateFooterView
{
  CGRect sectionFrame = [self.tableView rectForSection:0];
  CGFloat bottomSpace = self.tableView.contentOffset.y + CGRectGetHeight(self.tableView.frame) - CGRectGetMaxY(sectionFrame);
  CGFloat footerHeight = CGRectGetHeight(self.footerView.frame);
  CGFloat transformY = self.tableView.contentOffset.y + footerHeight - MIN(bottomSpace,footerHeight);

  CGRect footerFrame = self.footerView.frame;
  footerFrame.origin.y = self.tableView.bounds.size.height - footerFrame.size.height + transformY;
  self.footerView.frame = footerFrame;
}

Всякий раз, когда вам нужно обновить нижний колонтитул (т.е. после добавления новой строки), просто вызовите -updateFooterView, и вы должны быть хорошими

Ответ 7

Если вы хотите сделать нижний колонтитул неподвижным внизу, вы должны создать пользовательский footerView и изменить нижний колонтитул при изменении размера содержимого таблицы:

-(void)changeCustomTableFooterYPositionWithTableFrame:(CGRect)tableFrame tableContentSize: (CGSize) tableContentSize {
    CGFloat originalTableViewTopEdgeInset = self.tableView.contentInset.top;
    CGFloat originalTableViewBottomEdgeInset = self.tableView.contentInset.bottom - self.tableFooterView.frame.size.height;

    CGFloat footerViewYPositionByContentSize = tableContentSize.height;
    CGFloat footerViewYPositionByTableSize = tableFrame.size.height - self.tableFooterView.frame.size.height - originalTableViewTopEdgeInset - originalTableViewBottomEdgeInset;
    CGFloat tableFooterViewYPosition = MAX(footerViewYPositionByContentSize, footerViewYPositionByTableSize);

    self.tableFooterView.frame = CGRectMake(self.tableFooterView.frame.origin.x, tableFooterViewYPosition, self.customTableFooterView.frame.size.width, self.customTableFooterView.frame.size.height);
}

Чтобы определить, когда был изменен contentSize, добавьте observer в contentSize:

 [self addObserver: self forKeyPath: @"tableView.contentSize" options: NSKeyValueObservingOptionNew + NSKeyValueObservingOptionOld context: ContentSizeContext];

Не забудьте изменить tableView.edgeInsets при вставке нижнего колонтитула:

self.tableView.contentInset = UIEdgeInsetsMake(self.tableView.contentInset.top, self.tableView.contentInset.left, self.tableView.contentInset.bottom + self.customTableFooterView.frame.size.height, self.tableView.contentInset.right);

Вы можете увидеть унаследованный класс и пример по ссылке ниже: TableViewWithFooterAtBottom

Ответ 8

Вы можете использовать это, чтобы таблица выглядела меньше в зависимости от того, сколько у вас строк:

    let tblView =  UIView(frame: CGRectZero)
    tableView.tableFooterView = tblView
    tableView.tableFooterView!.hidden = true
    tableView.backgroundColor = UIColor.clearColor()

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

Ответ 9

Похоже, что что-то подобное ниже работает достаточно хорошо:

import PlaygroundSupport
import UIKit

let testVC = UITableViewController(style: .grouped)
testVC.view.frame = CGRect(x: 0, y: 0, width: 400, height: 700)
testVC.view.backgroundColor = .white

class TableViewDataSourceDelegate : NSObject {
    var rows = 2
}

extension TableViewDataSourceDelegate : UITableViewDataSource, UITableViewDelegate {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return rows
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.backgroundColor = .red
        return cell
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {

        let tableViewHeight = tableView.bounds.size.height
        let varticalMargin: CGFloat
        if #available(iOS 11.0, *) {
            varticalMargin = tableView.directionalLayoutMargins.bottom + tableView.directionalLayoutMargins.top
        } else {
            varticalMargin = tableView.layoutMargins.bottom + tableView.layoutMargins.top
        }

        let verticalInset: CGFloat
        if #available(iOS 11.0, *) {
            verticalInset = tableView.adjustedContentInset.bottom + tableView.adjustedContentInset.top
        } else {
            verticalInset = tableView.contentInset.bottom + tableView.contentInset.top
        }
        let tableViewContentHeight = tableView.contentSize.height - varticalMargin


        let height: CGFloat
        if #available(iOS 11.0, *) {
            let verticalSafeAreaInset = tableView.safeAreaInsets.bottom + tableView.safeAreaInsets.top
            height = tableViewHeight - tableViewContentHeight - verticalInset - verticalSafeAreaInset
        } else {
            height = tableViewHeight - tableViewContentHeight - verticalInset
        }

        if (height < 0) {
            return 0
        } else {
            return height
        }
    }

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        let extraButtonSpace = UIView()
        extraButtonSpace.backgroundColor = .clear
        return extraButtonSpace
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row == 0 {
            tableView.beginUpdates()
            rows += 1
            tableView.insertRows(at: [indexPath], with: .automatic)
            tableView.endUpdates()
        } else if indexPath.row == 1 {
            tableView.beginUpdates()
            rows -= 1
            tableView.deleteRows(at: [indexPath], with: .automatic)
            tableView.endUpdates()
        } else {
            tableView.beginUpdates()
            tableView.endUpdates()
        }
    }
}


let controller = TableViewDataSourceDelegate()
testVC.tableView.delegate = controller
testVC.tableView.dataSource = controller
testVC.tableView.reloadData()

let extraButtonSpace = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 80))
extraButtonSpace.backgroundColor = .yellow
testVC.tableView.tableFooterView = extraButtonSpace

PlaygroundPage.current.liveView = testVC.view

Экран с детской площадки