Tôi đánh giá cao đây là câu hỏi cũ. Nhưng tôi đã tìm thấy câu trả lời với thông tin sai lệch một phần và đoạn trích không rõ ràng. Vì vậy, đối với những gì nó vẫn còn giá trị, đây là cách tôi thêm một "nổi" xem dưới cùng của quan điểm của tôi UITableViewController
của. Có, bạn có thể làm điều đó, ngay cả khi các câu trả lời được chấp nhận nói rằng bạn không thể.
Trong phương thức -viewDidLoad
của bạn, bạn có thể tạo chế độ xem mà chúng tôi sẽ đặt tên là bottomFloatingView. Điều này cũng được thiết lập như là một tài sản.
Hãy chắc chắn thêm nội dung vào dưới cùng của chế độ xem bảng, điều này sẽ tránh ẩn bất kỳ nội dung nào của bảng với chế độ xem nổi của bạn.
Tiếp theo, bạn nên sử dụng UIScrollViewDelegate
để cập nhật khung của chế độ xem nổi.
Ảo giác sẽ là chế độ xem của bạn bị kẹt ở dưới cùng. Trong thực tế, chế độ xem này đang di chuyển mọi lúc bạn đang di chuyển và luôn được tính để xuất hiện ở dưới cùng. Chế độ xem cuộn rất mạnh mẽ! Và có lẽ là một trong những lớp UIKit bị đánh giá thấp nhất mà tôi nghĩ.
Vì vậy, đây là mã của tôi. Lưu ý thuộc tính, chèn nội dung trên chế độ xem bảng và thực hiện phương thức ủy quyền -scrollViewDidScroll:
. Tôi đã tạo chế độ xem nổi trong bảng phân cảnh của mình, đó là lý do tại sao bạn không thể thấy thiết lập đó.
Cũng đừng quên bạn có lẽ cũng nên sử dụng KVO để quan sát các thay đổi đối với khung của bảng. Có thể để thay đổi theo thời gian, cách dễ nhất để kiểm tra đó là bằng cách bật và tắt thanh trạng thái cuộc gọi trong trình mô phỏng.Điều cuối cùng, nếu bạn đang sử dụng chế độ xem phần tiêu đề trong chế độ xem bảng, các chế độ xem đó sẽ là chế độ xem nhiều nhất trong chế độ xem bảng, vì vậy bạn cũng sẽ muốn đưa chế độ xem nổi lên phía trước, thực hiện việc này khi bạn thay đổi khung của nó.
@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
ghi chú ... http://stackoverflow.com/questions/8258216/position-a-uiview-relative-to-the-bottom-of-the-parent-view/20287309#20287309 – Fattie
Tôi nghĩ tất cả các câu trả lời dưới đây đều bị nhầm lẫn. Những gì bạn làm là thêm chế độ xem của bạn vào phần giám sát của chế độ xem bảng. Đơn giản như thế. – Jonny