从iOS7开始,在我的UITableView顶部有额外的空间它有一个UITableViewStyleGrouped样式。
这里有一个例子:
tableview从第一个箭头开始,有35个像素的无法解释的填充,然后绿色的头是一个由viewForHeaderInSection返回的UIView(其中section为0)。
有人能解释一下这个35像素的数量是从哪里来的吗?我如何才能在不切换到UITableViewStylePlain的情况下摆脱它?
更新(回答):
在iOS 11及更高版本中:
tableView.contentInsetAdjustmentBehavior = .never
这段代码对我来说很有用,对我来说最好的答案是用objective-C写的,所以我把它转换成Swift。
针对Swift 4.0+
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: .leastNonzeroMagnitude))
只需将其写入viewDidLoad(),它就会像一个咒语一样工作。
对于iOS 15+,上面的一个将不起作用,所以使用这个:-
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
对于iOS 15+,如果你想为你的整个项目应用更改,那么使用这个:-
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0.0
}
}
对于第一部分,我们需要像这样设置tableHeaderView:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: .leastNonzeroMagnitude))
对于其他section,我们应该像这样设置highightforfooterinsection:
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return .leastNonzeroMagnitude
}
我的回答将是更一般的答案,但也可以应用在这个问题上。
如果根视图(ViewController的)或根视图的第一个子视图(子视图)是UIScrollView(或UIScrollView本身)的子类,并且如果
self.navigationController.navigationBar.translucent = YES;
框架将自动设置预先计算的contentInset。
为了避免这种情况,你可以这样做
self.automaticallyAdjustsScrollViewInsets = NO;
但在我的情况下,我不能这样做,因为我正在实现SDK,其中有UIView组件,可以由其他开发人员使用。那个UIView组件包含UIWebView(它有UIScrollView作为第一个子视图)。如果该组件被添加为UIViewController的视图层次结构中的第一个子组件,自动嵌入将被系统应用。
在添加UIWebView之前,我已经通过添加frame(0,0,0,0)来修复这个问题。
在这种情况下,系统没有找到UIScrollView的子类作为第一个子视图,并没有应用insets
我有一个VC与容器在它(btw是一个导航控制器的一部分),并嵌入其中是一个TableVC。
选择我的TableVC,查看属性面板:
取消勾选自动调整滚动插入
取消检查顶部栏下的延伸边
然后我设置了容器相对于父视图的自动约束:
容器的观点。top = ParentView。顶边
这为我完成了以下任务:
保持桌面拉到顶部,但就在我的导航栏下面
刷新后,表返回到这个位置,而不是像以前那样在导航栏下向上+
在实际的底部滚动表底部后,不缺它
我用这个设置进行了大量的试验和错误,但我最终发现了lekksi @移除UITableView单元格前的空白空间发布的这些小细节