为什么我的UITableView顶部有额外的填充,iOS7中的样式为UITableViewStyleGrouped
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的UITableView顶部有额外的填充,iOS7中的样式为UITableViewStyleGrouped相关的知识,希望对你有一定的参考价值。
从ios7开始,我的UITableView
顶部有一个额外的空间,有一个风格UITableViewStyleGrouped
。
这是一个例子:
tableview从第一个箭头开始,有35个像素的无法解释的填充,然后绿色标题是由UIView
返回的viewForHeaderInSection
(其中该部分为0)。
任何人都可以解释这个35像素的数量来自何处以及如何在不切换到UITableViewStylePlain
的情况下摆脱它?
以下是我的帮助:
YouStoryboard.storyboard> YouViewController>属性检查器>取消选中 - 调整滚动视图插入。
根据Apple的transition guide for iOS7,滚动视图的内容插入会自动调整。 automaticAdjustsScrollViewInsets的默认值设置为YES。
具有UITableView的UIViewController应将此属性设置为NO。
self.automaticallyAdjustsScrollViewInsets = NO;
这样就可以了。
编辑1:
也可以试试 -
self.navigationController.navigationBar.translucent = YES;
这也消除了顶部的额外填充。
使用分组TableView时,使用此方法可以避免在viewWillAppear中进行边框切割
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
以上很多以前的答案太过于苛刻。如果Apple决定解决这一意想不到的行为,他们将来会在任何时候破产。
问题的根源:
- 一个
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;
这样的事情会在某些时候导致问题(通常在滚动之后):
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
故事板:
只需取消选中:View Controller的选项中的Adjust Scroll View Insets
码:
self.automaticallyAdjustsScrollViewInsets = false
这是使用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
}
就我而言,这对我有所帮助。我也支持ios6。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
只需将以下内容添加到VC中的viewDidLoad:
self.automaticallyAdjustsScrollViewInsets = NO;
所以我在这里尝试了所有方法,而这一次都没有帮助。我的情况是在iOS 9上的分组表视图。我真的不知道为什么以及如何找到这个,但对我来说,设置tableViewHeader
与UIView
至少0.01
高度计算出来。 CGRectZero
没有帮助,没有任何帮助:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
Swift:iOS我在滚动视图上有tableview ..当我在同一个屏幕上点击“Back”时。滚动视图在顶部占用更多空间..解决这个我用过:
self.automaticallyAdjustsScrollViewInsets = false
一个布尔值,指示视图控制器是否应自动调整其滚动视图插入。默认值为true,允许视图控制器调整其滚动视图插入以响应状态栏,导航栏和工具栏或选项卡栏消耗的屏幕区域。如果要自己管理滚动视图插入调整,则设置为false,例如在视图层次结构中有多个滚动视图时。
感谢@Aurelien Porte的回答。这是我的解决方案
这个问题的原因: -
- UITableView不喜欢高度为0.0的标题。如果你要做的是拥有一个高度为0的标题,你可以跳转到解决方案。
- 即使稍后您为标题指定了非0.0高度,UITableView也不希望首先为其指定高度为0.0的标题。
在ViewDidLoad中: -
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
不需要这样的东西: -
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
在heightForHeaderInSection
代表: -
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
在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
}
我玩了一下它似乎这是设置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)];
我喜欢这个解决方案比设置一个有点任意的contentInset.top
更好,因为我也动态地使用contentInset.top
。每当我重新计算contentInset.top
时,必须记住删除额外的35px是乏味的。
我的答案将是更一般的答案,但也可以应用于此。
如果根视图(ViewController)或根视图的第一个子视图(子视图)是UIScrollView(或UIScrollView本身)的子类,如果
self.navigationController.navigationBar.translucent = YES;
框架将自动设置预先计算的contentInset。
为了避免这种情况你可以做到
self.automaticallyAdjustsScrollViewInsets = NO;
但在我的情况下,我无法做到这一点,因为我正在实现具有UIView组件的SDK,可供其他开发人员使用。该UIView组件包含UIWebView(其中UIScrollView作为第一个子视图)。如果将该组件添加为UIViewController视图层次结构中的第一个子组件,则系统将应用自动插入。
我在添加UIWebView之前通过添加带有框架(0,0,0,0)的虚拟视图来修复此问题。
在这种情况下,系统没有找到UIScrollView的子类作为第一个子视图,并且没有应用insets
我假设这只是新的UITableViewStyleGrouped
造型的一部分。它位于所有分组表视图中,似乎没有任何直接的方法来控制该空间。
如果该空间由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];
}
}
这是通过Storyboard在iOS 11和Xcode 9.1中轻松修复的方法:
选择“表视图”>“大小检查器”>“内容插入:从不”
我和arielyz有同样的解决方法。一旦我将UITableView移动到不是父视图的第一个子视图,它就消失了。我的空间是20像素,而不是35像素。
我无法在肖像xib中重新创建它,只有一个风景xib。如果我可以在一个简单的演示应用程序中重现它,我将在稍后提交雷达错误。
我认为制作UIEdgeInsets -35 0 0 0很乏味。在我的例子中,我实现了tableView:heightForHeaderInSection:方法,它有可能返回0。
当我将0改为0.1f时,问题就消失了。
使用这一个我认为这有帮助......
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
override func viewWillAppear(animated: Bool) { self.edgesForExtendedLayout = UIRectEdge.None // OR self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0); //OR self.automaticallyAdjustsScrollViewInsets = false }
以上是关于为什么我的UITableView顶部有额外的填充,iOS7中的样式为UITableViewStyleGrouped的主要内容,如果未能解决你的问题,请参考以下文章UITableView 充满 CoreData 结果加上额外的单元格?
UITableView 在重新加载页面时在单元格顶部显示额外的分隔线