Doceniam to stare pytanie. Ale znalazłem odpowiedzi albo z fałszywymi informacjami w części i niejasnymi fragmentami. Tak więc to, co wciąż warte jest, oto, jak dodałem widok "pływający" na dole mojego widoku UITableViewController
. Tak, możesz to zrobić, nawet jeśli zaakceptowane odpowiedzi mówią, że nie możesz.
W swojej metodzie -viewDidLoad
można utworzyć widok, który nazwiemy bottomFloatingView. Jest to również ustawione jako właściwość.
Pamiętaj, aby dodać zawartość do dolnej części widoku tabeli, aby uniknąć ukrywania zawartości tabeli w widoku swobodnym.
Następnie należy użyć UIScrollViewDelegate
, aby zaktualizować ramkę widoku pływającego.
Iluzja będzie taka, że widok utknie na dole. W rzeczywistości ten widok porusza się cały czas, przewijając i zawsze jest obliczany, aby pojawiać się na dole. Widoki przewijania są bardzo potężne! I prawdopodobnie jedna z najbardziej niedocenianych klas UIKit, jak sądzę.
Oto mój kod. Zanotuj właściwość, zawartość w widoku tabeli i implementację metody delegatów metody -scrollViewDidScroll:
. Stworzyłem mój pływający widok w moim scenopisie, dlatego nie widzisz, że jest on ustawiony.
Pamiętaj także, że prawdopodobnie powinieneś używać KVO do obserwowania zmian w ramce widoku tabeli. Jest możliwe, że to się zmieni z biegiem czasu, najprostszym sposobem na sprawdzenie jest to, przełączając i wyłączając pasek stanu połączenia w symulatorze.
Ostatnia rzecz, jeśli używasz widoków nagłówka sekcji w widoku tabeli, te widoki będą najwyższym widokiem w widoku tabeli, więc możesz również przenieść widok pływający z przodu, zrób to, gdy zmieniasz jego ramkę.
@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
notatki ... http://stackoverflow.com/questions/8258216/position-a-uiview-relative-to-the-bottom-of-the-parent-view/20287309#20287309 – Fattie
myślę wszystkie poniższe odpowiedzi są zdezorientowane. To, co robisz, to dodanie widoku do podglądu widoku tabeli. Proste. – Jonny