Ответ 1
Я ценю, что это старый вопрос. Но я нашел ответы либо с ложной информацией в части, либо с нечеткими фрагментами. Итак, для чего он все же стоит, вот как я добавил "плавающий" вид в нижней части моего представления 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