gpt4 book ai didi

iOS 8 - 最初从 View 中隐藏 UITableView 的 headerView

转载 作者:行者123 更新时间:2023-11-29 12:29:18 24 4
gpt4 key购买 nike

就像在 native iOS 邮件应用程序中一样,当我将 UITableViewController 推到 UINavigationController 上时,我想让 UITableView 最初看起来略微向下滚动,从而在导航 Controller 的导航栏下方遮挡它的 headerView。

同时,即使所有单元格的高度都小于表格 View 的高度,用户也应该可以上下滚动以再次显式显示或隐藏标题 View 。

按照这种逻辑,对于此实现似乎有两个考虑因素:

1) 确保表格 View 的最小内容大小至少为表格 View 框架的高度 + 标题 View 的高度。

2) 最初呈现表格 View 时,内容偏移量会增加标题 View 的高度。

我已经尝试在“viewWillAppear”中手动设置表格 View 的 contentOffset 和 contentSize 属性,但这似乎没有效果(表格 View 可能会在该点之后重新加载)。尝试在“viewDidAppear”中设置它们会起作用,但为时已晚,因为只有在“推送”动画完成后才会调用它。

虽然以前的 iOS 版本曾问过此类问题,但我无法让它们中的任何一个在 iOS 8 中工作。此外,它们都处理更改偏移量,但不处理 TableView 的 contentSize。

以前有人在 iOS 7 和/或 8 中遇到过这种行为吗?

最佳答案

更新 - (30/1/2015)

好的。昨晚这对我来说不是很好,所以我又玩了一次,我找到了一个更好更干净的解决方案。

我发现 UITableViewControllertableView 属性不是 readonly。因此,在 UITableView 子类中简单地管理 contentSize 属性,然后将该子类分配回 UITableViewController 实际上更有意义。

@implementation TOCustomTableView

- (void)setContentSize:(CGSize)contentSize
{
CGFloat scrollInset = self.contentInset.top + self.contentInset.bottom;
CGFloat height = (CGRectGetHeight(self.bounds) - scrollInset) + CGRectGetHeight(self.tableHeaderView.frame);
contentSize.height = MAX(height, contentSize.height);
[super setContentSize:contentSize];
}

@end

---

@implementation TOCustomTableViewController

- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [[TOCustomTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
}

@end

这样, TableView 的最小 contentSize 始终明确设置为 TableView 的高度 + headerView 大小,以零抖动实现所需的效果。 :)


原始答案

技巧 14 为我指明了正确的方向。所以我最终得到了正确运行的代码。

- (void)resetTableViewInitialOffset
{
CGPoint contentOffset = self.tableView.contentOffset;
contentOffset.y = self.tableView.contentInset.top + CGRectGetHeight(self.headerView.frame);
self.tableView.contentOffset = contentOffset;
}

- (void)resetTableViewContentSize
{
CGSize contentSize = self.tableView.contentSize;
CGFloat scrollInset = self.tableView.contentInset.top + self.tableView.contentInset.bottom;
CGFloat height = (CGRectGetHeight(self.view.bounds) - scrollInset) + CGRectGetHeight(self.headerView.frame);
contentSize.height = MAX(height, contentSize.height);
self.tableView.contentSize = contentSize;
}

- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];

if (!self.headerBarInitiallyHidden) {
[self resetTableViewContentSize];
[self resetTableViewInitialOffset];
self.headerBarInitiallyHidden = YES;
}
}

我还确保每次在 TableView 上执行“reloadData”时调用“resetTableViewContentSize”。

关于iOS 8 - 最初从 View 中隐藏 UITableView 的 headerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com