Свойство 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 заранее.
Ответы
Ответ 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
![Экран с детской площадки]()