esi*_*ver 616 uitableview ios ios7
从iOS7开始,我的顶部UITableView有一个额外的空间,有一个风格UITableViewStyleGrouped.
这是一个例子:

tableview从第一个箭头开始,有35个像素的无法解释的填充,然后绿色标题是UIView返回的viewForHeaderInSection(其中该部分为0).
任何人都可以解释这个35像素的数量来自何处以及如何在不切换的情况下摆脱它UITableViewStylePlain?
Ale*_*der 857
以下是我的帮助:
YouStoryboard.storyboard> YouViewController>属性检查器>取消选中 - 调整滚动视图插入.
Mr.*_*. T 314
我玩了一下它,似乎这是设置tableView的副作用tableHeaderView = nil.
因为我的tableView有一个动态出现tableHeaderView,当我需要隐藏tableHeaderView,而不是做self.tableView.tableHeaderView = nil;,我做:
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
Run Code Online (Sandbox Code Playgroud)
我喜欢这个解决方案比设置一些任意更好,contentInset.top因为我也contentInset.top动态使用它.每当我重新计算时,必须记住删除额外的35px contentInset.top是乏味的.
yea*_*xon 178
对于IOS 7,如果要在视图控制器中分配tableview,可以查看
self.edgesForExtendedLayout = UIRectEdgeNone;
Run Code Online (Sandbox Code Playgroud)
你的问题似乎与我的相似
更新:
iOS 9.x中的Swift:
self.edgesForExtendedLayout = UIRectEdge.None
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
Run Code Online (Sandbox Code Playgroud)
nvr*_*rst 171
尝试更改继承的contentInset属性.UITableViewUIScrollView
self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
这是一种解决方法,但它确实有效
小智 133
self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)
试试,你可以处理它!
Lev*_*dze 94
iOS 15 的解决方案:
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
Run Code Online (Sandbox Code Playgroud)
要修复整个项目:
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0
}
Run Code Online (Sandbox Code Playgroud)
注意:这仅适用于UITableView.Style.plain.
Lig*_*Man 74
你可以检测你的应用程序是否运行iOS7或更高版本,并在表视图委托中添加这两个方法(通常在你的UIViewController代码中)
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
Run Code Online (Sandbox Code Playgroud)
这可能不是一个优雅的解决方案,但对我有用
Swift版本:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
Run Code Online (Sandbox Code Playgroud)
esi*_*ver 52
我找到了原始bug的原因并创建了一个展示它的示例项目.我相信有一个iOS7错误.
从iOS7开始,如果您使用Grouped样式创建UITableView,但在第一个布局上没有设置委托,那么您设置委托并调用reloadData,顶部将有一个35px的空间永远不会消失.
看到我做的这个项目展示了这个bug:https://github.com/esilverberg/TableViewDelayedDelegateBug
特别是这个文件:https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
如果第24行有效,
[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];
Run Code Online (Sandbox Code Playgroud)
顶部会有额外的35像素空间.如果第27行处于活动状态且24被注释掉,
self.tableView.delegate = self;
Run Code Online (Sandbox Code Playgroud)
顶部没有空间.这就像tableView在某处缓存结果而不是在设置委托并调用reloadData后重绘自身.
Mik*_*ill 45
另一个快速评论......即使在XCode 6.1中,也存在一个垂直空间出现在顶部的错误UIScrollViews,UITextViews和UITableViews.

有时,解决此问题的唯一方法是进入故事板并拖动问题控件,使其不再是页面上的第一个子视图.

(感谢Oded指点我这个方向......我发布这条评论,只是为了添加一些截图,以展示症状和解决方法.)
gir*_*_vr 40
根据Apple的iOS7过渡指南,滚动视图的内容插入会自动调整.automaticAdjustsScrollViewInsets的默认值设置为YES.
具有UITableView的UIViewController应将此属性设置为NO.
self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)
这样就可以了.
编辑1:
也可以试试 -
self.navigationController.navigationBar.translucent = YES;
Run Code Online (Sandbox Code Playgroud)
这也消除了顶部的额外填充.
Aqi*_*taz 38
While using grouped TableView use this to avoid border cutting in viewWillAppear
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
Aur*_*rte 35
以上很多以前的答案太过于苛刻.如果Apple决定解决这一意想不到的行为,他们将来会在任何时候破产.
问题的根源:
a UITableView不喜欢高度为0.0的标题.如果你要做的是拥有一个高度为0的标题,你可以跳转到解决方案.
即使稍后您为标题指定了非0.0高度,UITableView也不希望首先为其指定高度为0.0的标题.
解:
然后,最简单可靠的修复是确保在将表头视图分配给表视图时标题高度不为0.
像这样的东西会起作用:
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;
Run Code Online (Sandbox Code Playgroud)
这样的事情会在某些时候导致问题(通常在滚动之后):
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Run Code Online (Sandbox Code Playgroud)
Bar*_*zyk 29
故事板:
只需取消选中:Adjust Scroll View Insets在View Controller的选项中

码:
self.automaticallyAdjustsScrollViewInsets = false
Run Code Online (Sandbox Code Playgroud)
And*_*kas 21
这是使用Swift 3的iOS 10的解决方案:
您可以通过实现以下方法来摆脱顶部和底部填充UITableViewDelegate.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
Run Code Online (Sandbox Code Playgroud)
Luk*_*kas 14
就我而言,这对我有所帮助.我也支持ios6.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
Run Code Online (Sandbox Code Playgroud)
jud*_*ira 14
只需将以下内容添加到VC中的viewDidLoad:
self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)
sun*_*ejr 14
所以我在这里尝试了所有方法,而这一次都没有帮助.我的情况是在iOS 9上的分组表格视图.我真的不知道为什么以及如何找到这个,但对我来说,设置至少高度的tableViewHeadera .没有帮助,没有任何帮助:UIView0.01CGRectZero
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
Run Code Online (Sandbox Code Playgroud)
Vip*_*mar 14
这段代码对我有用,对我来说最好的答案是在上面写的,objective-C所以我把它转换成 Swift。
对于 Swift 4.0+
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: .leastNonzeroMagnitude))
Run Code Online (Sandbox Code Playgroud)
只需将其写入其中viewDidLoad(),它就会像魅力一样发挥作用。
Vin*_*shi 10
Swift:iOS我在滚动视图上有tableview ..当我在同一个屏幕上点击"Back"时.滚动视图在顶部占用更多空间..解决这个我用过:
self.automaticallyAdjustsScrollViewInsets = false
Run Code Online (Sandbox Code Playgroud)
一个布尔值,指示视图控制器是否应自动调整其滚动视图插入.默认值为true,允许视图控制器调整其滚动视图插入以响应状态栏,导航栏和工具栏或选项卡栏消耗的屏幕区域.如果要自己管理滚动视图插入调整,则设置为false,例如在视图层次结构中有多个滚动视图时.
Ash*_*sey 10
感谢@Aurelien Porte的回答.这是我的解决方案
这个问题的原因: -
在ViewDidLoad中: -
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
Run Code Online (Sandbox Code Playgroud)
不需要这样的东西: -
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
在heightForHeaderInSection代表中: -
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
Run Code Online (Sandbox Code Playgroud)
在viewForHeaderInSection代表中: -
if section == 0
{
// Note CGFloat.min for swift
// For Objective-c CGFLOAT_MIN
let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min))
return headerView
}
else
{
// Construct your other headers here
}
Run Code Online (Sandbox Code Playgroud)
我认为这只是新UITableViewStyleGrouped造型的一部分.它位于所有分组表视图中,似乎没有任何直接的方法来控制该空间.
如果该空间由a表示UIView,则可以搜索所有subviews这些空间UITableView以查找该特定视图并直接编辑它.但是,在标题和单元格开始之前,该空间也可能只是一个硬编码的偏移量,并且没有任何方法可以对其进行编辑.
要搜索所有子视图(我会在表没有单元格时运行此代码,以使其更容易阅读输出):
- (void)listSubviewsOfView:(UIView *)view {
// Get the subviews of the view
NSArray *subviews = [view subviews];
// Return if there are no subviews
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSLog(@"%@", subview);
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}
Run Code Online (Sandbox Code Playgroud)
我的答案将是更一般的答案,但也可以应用于此.
如果根视图(ViewController)或根视图的第一个子视图(子视图)是UIScrollView(或UIScrollView本身)的子类,如果
self.navigationController.navigationBar.translucent = YES;
Run Code Online (Sandbox Code Playgroud)
框架将自动设置预先计算的contentInset.
为了避免这种情况你可以做到
self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,我无法做到这一点,因为我正在实现具有UIView组件的SDK,可供其他开发人员使用.该UIView组件包含UIWebView(其中UIScrollView作为第一个子视图).如果将该组件添加为UIViewController视图层次结构中的第一个子组件,则系统将应用自动插入.
我在添加UIWebView之前通过添加带有框架(0,0,0,0)的虚拟视图来修复此问题.
在这种情况下,系统没有找到UIScrollView的子类作为第一个子视图,并且没有应用insets
这行代码会让你高兴的。
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = CGFloat(0)
}
}
Run Code Online (Sandbox Code Playgroud)
我和arielyz有同样的解决方法.一旦我将UITableView移动到不是父视图的第一个子视图,它就消失了.我的空间是20像素,而不是35像素.
我无法在肖像xib中重新创建它,只有一个风景xib.如果我可以在一个简单的演示应用程序中重现它,我将在稍后提交雷达错误.
我认为制作UIEdgeInsets -35 0 0 0很乏味.在我的例子中,我实现了tableView:heightForHeaderInSection:方法,它有可能返回0.
当我将0改为0.1f时,问题就消失了.
小智 6
使用这一个我认为这有帮助......
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
Run Code Online (Sandbox Code Playgroud)
override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None
// OR
self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
//OR
self.automaticallyAdjustsScrollViewInsets = false
}
Run Code Online (Sandbox Code Playgroud)
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
Run Code Online (Sandbox Code Playgroud)
这就是所有人!
唯一对我有用的是:
斯威夫特:
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
Run Code Online (Sandbox Code Playgroud)
Objective-C:
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
Run Code Online (Sandbox Code Playgroud)
另外,第一部分还有一个额外的空间.那是因为我tableHeaderView错误地使用了这个属性.修正了以下内容:
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Run Code Online (Sandbox Code Playgroud)
小智 6
我们有多个答案.
1)您可以在view didload添加UIImageview
UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];
Run Code Online (Sandbox Code Playgroud)
2)您可以设置页眉和页脚高度0.1
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
Run Code Online (Sandbox Code Playgroud)
3)您可以添加高度为0.1的页眉和页脚视图
tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
Run Code Online (Sandbox Code Playgroud)
小智 6
Swift 4代码:对于没有节头的tableview,您可以添加以下代码:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
Run Code Online (Sandbox Code Playgroud)
并将标题空间设置为0。
如果您想要特定身高的标头,请传递该值:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
Run Code Online (Sandbox Code Playgroud)
以及来自viewForHeaderinSection委托的视图。
具体来说,要从顶部删除tableviewHeader空间,我做了以下更改:
YouStoryboard.storyboard> YouViewController>选择TableView>大小检查器>内容插入 - 将其设置为never.
你只要这样做
tableView.contentInsetAdjustmentBehavior = .never
Run Code Online (Sandbox Code Playgroud)
这些天表视图有一个非常奇怪的行为:
在带有缺口(XR 等)的设备上,它不会告诉您添加更多插图,但前提是表格从屏幕的物理顶部开始。
如果你不是从屏幕顶部开始,它不会那样做,但是
这两种情况都 >> 无关 << to safeAreaInsets....... 这很令人困惑
所有这些都是完全没有记录的......你可以浪费几个小时来弄清楚这一点。
如果您确实需要从屏幕/表格顶部开始实际测量,
实际上只需去:
tableView.contentInsetAdjustmentBehavior = .never
Run Code Online (Sandbox Code Playgroud)
一个很好的例子显然是当您在桌子顶部添加某种横幅或类似的东西时,这在当今很常见,并且您只需将桌子的顶部插入设置为您的横幅/等在运行时的高度。
为此,您必须使用
tableView.contentInsetAdjustmentBehavior = .never
Run Code Online (Sandbox Code Playgroud)
称呼 :/
不要忘记,现在几乎总是在动态加载一些信息(用户图片、描述等),因此在信息到达之前您无法将这些值设置为最终需要的值。另一个陷阱。:/
所以你会有这样的代码:
func setTableOffsetOnceFlagAreaSizeIsKnown() {
tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
setTableOffsetOnceFlagAreaSizeIsKnown()
}
Run Code Online (Sandbox Code Playgroud)
小智 5
斯威夫特3
如果您使用分组表,请执行以下操作。这将删除顶部空间。
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
self.tableView.tableHeaderView = UIView(frame: frame)
self.tableView.tableFooterView = UIView(frame: frame)
Run Code Online (Sandbox Code Playgroud)
如果您仍然遇到此问题,那么默认情况下它将删除从顶部偏移的内容。
[从不设置内容插入]
https://i.stack.imgur.com/fjxOV.png
Swift 4 answer...
If the table view is selected in interface builder and in the attributes inspector the style "Grouped" is selected, enter the following code in your view controller to fix the extra header space issue.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
242137 次 |
| 最近记录: |