Я ценю, что это старый вопрос.Но я нашел ответы либо с ложной информацией частично и неясными фрагментами.Итак, для чего это все еще стоит, вот как я добавил «плавающее» представление в конец моего UITableViewController
представления.Да, вы можете сделать это, даже если в принятых ответах сказано, что вы не можете.
В вашем методе -viewDidLoad
вы можете создать представление, которое мы назовем bottomFloatingView.Это также настраивается как свойство.
Обязательно добавьте вставку содержимого в конец представления таблицы, это позволит избежать скрытия любого содержимого таблицы в плавающем представлении.
Затем вы должны использовать UIScrollViewDelegate
для обновления фрейма плавающего вида.
Иллюзия будет заключаться в том, что ваш взгляд застрял на дне.В действительности это представление движется все время, пока вы прокручиваете, и всегда вычисляется, чтобы появиться внизу.Представления прокрутки очень мощные!И, наверное, один из самых недооцененных классов UIKit, я думаю.
Так вот мой код.Обратите внимание на свойство, вставку содержимого в табличном представлении и реализацию метода делегата -scrollViewDidScroll:
.Я создал свой плавающий вид в раскадровке, поэтому вы не можете видеть это при настройке.
Также не забывайте, что вам, вероятно, следует также использовать KVO для наблюдения за изменениями фрейма табличного представления.Это может измениться со временем, самый простой способ проверить это, включив и выключив строку состояния входящего вызова в симуляторе.
Последнее, если вы используете представления заголовков разделов в своей таблицеВ этом представлении эти представления будут самыми верхними в представлении таблицы, поэтому вам также понадобится перевести плавающее представление вперед, сделайте это при изменении его фрейма.
@interface MyTableViewController ()
@property (strong, nonatomic) IBOutlet UIView *bottomFloatingView;
@end
@implementation MyTableViewController
static NSString *const cellIdentifier = @"MyTableViewCell";
- (void)dealloc
{
[self.tableView removeObserver:self forKeyPath:@"frame"];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView addSubview:self.bottomFloatingView];
self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, CGRectGetHeight(self.bottomFloatingView.bounds), 0.0);
self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, CGRectGetHeight(self.bottomFloatingView.bounds), 0.0);
[self.tableView addObserver:self
forKeyPath:@"frame"
options:0
context:NULL];
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 20;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
return cell;
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self adjustFloatingViewFrame];
}
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if([keyPath isEqualToString:@"frame"]) {
[self adjustFloatingViewFrame];
}
}
- (void)adjustFloatingViewFrame
{
CGRect newFrame = self.bottomFloatingView.frame;
newFrame.origin.x = 0;
newFrame.origin.y = self.tableView.contentOffset.y + CGRectGetHeight(self.tableView.bounds) - CGRectGetHeight(self.bottomFloatingView.bounds);
self.bottomFloatingView.frame = newFrame;
[self.tableView bringSubviewToFront:self.bottomFloatingView];
}
@end