UITableView 从 iOS7的偏移量开始

我在 iOS7中将一个普通的 jane UITableView 拖到了 UIViewController 上。

现在在第一个单元格开始之前有一个垂直的空间偏移量。我怎么才能摆脱它?我希望第一行更接近 UITableView 实际开始的顶部边缘。我没有要求大的补偿,是吗?

enter image description here

有什么想法吗?

100304 次浏览

默认情况下,表格视图控制器会在导航栏下方填充内容,这样你就可以在导航栏下方滚动内容,然后在导航栏/工具栏下方以模糊状态看到内容。

Looks like you're positioning it at 44 (maybe 64)px to move it out from under the nav bar, but it already compensates for this so you get a big gap.

转到 IB 中的 Storyboard/xib,在导航条下取消显示内容。

UIViewController的新 IOS7实现有一组新的选项,允许开发人员选择系统是否会自动添加 UIScrollViewUITableView和派生的插入。

要禁用此行为,请在 InterfaceBuilder 中取消选中所有需要的 UIViewController,在 UIViewController选中的对象检查器上:

View Controller Inspector

更多细节:

  1. 今天就提交你的 iOS7应用程序。
  2. IOS7用户界面过渡指南 > 外观和行为

它解决了我的类似问题:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

用这个试试

tableView.separatorInset = UIEdgeInsetsZero;

显然,如果您支持任何小于 iOS7的选择器,那么您需要确保对象在调用它之前响应这个选择器。

来自 iOS7过渡指南:

如果您不希望滚动视图的内容自动插入 调整后,将自动调整 ScrollViewInsets 设置为 NO 值为 YES)

   self.automaticallyAdjustsScrollViewInsets = NO;

If you go to storyboard, you can change the offset by selecting the table and under the Table View section in the Attributes inspector you just change the Separator Insets on the left to 0.

THis works for me:

- (void)loadView
{
[super loadView];


[self setAutomaticallyAdjustsScrollViewInsets:YES];


self.edgesForExtendedLayout = UIRectEdgeNone;
self.view.frame = CGRectZero;
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

i had a similar problem, after dismissing a viewController, the contentOffset from my tableView was changed to (0, -64).

my solution was a little weird, i tried all the other answers but had no success, the only thing that fixed my problem was to switch the tableView position in the controls tree of the .xib

它是父视图中的第一个控件,如下所示:

before

我把 tableView 移到了 ImageView 之后,它工作了:

after

似乎把表格视图放在第一个位置会引起问题,而把表格视图移到另一个位置就解决了问题。

警察,我没有使用自动布局,也没有使用故事板

希望这个能帮到别人!

我在容器视图中嵌入了一个 UITableViewController。为了摆脱不必要的64点垂直空间,我需要取消选中“调整滚动视图插入”的 Interface Builder,并在我的 UITableViewController 的 viewWillAppear 中设置 UITableView 的 contentInset,如下所示。

The size of the vertical space appears to match the navigation bar's frame height and y offset. The problem only occurred on iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
[super viewWillAppear:animated];


if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
const CGRect navBarFrame = self.navigationController.navigationBar.frame;
const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
}
}

Seriously, changing contentOffset is not the solution. You're just patching a problem and not fixing the cause. I've been facing the same problem and it turns out that 分组 tableViews have a padding on the top. In my case setting the type to 平淡无奇 has done the trick.

希望能为某人节省点时间。 Z.

在 Xamarin iOS 中,在前台模式对话框被取消之后,我在背景 UITableViewController 上遇到了这个问题。在向前台移动的过程中,UITableViewController 设置了插入(在 iOS 的某个地方) :

这门课解决了这个问题

public class UITableViewControllerWithBugFix : UITableViewController {
public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
}


public override void ViewWillLayoutSubviews() {
if (TableView.ContentInset.Top != 0.0f)
TableView.ContentInset = UIEdgeInsets.Zero;
if (TableView.ScrollIndicatorInsets.Top != 0.0f)
TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;


base.ViewWillLayoutSubviews();
}
}

From time to time I get back to this awful situation, and I notice that it's still quite unknown. So, for future memory...

最近,我在用这个变通方法解决问题。

  1. 在 UITableView 顶部添加一个子视图,像素高度为零。
  2. 如果我感到自信: ——我移除了这个虚假的视图,修复了顶部的约束,然后它就神奇地起作用了。

不要问我为什么,我仍然认为这是一个错误深在 UIKit。

如果您在 UITableView 之前添加了一个空的 UIView (或者任何视图都是可滚动的,如 ScrollView 和 TextView) ,那么您可能很幸运。

有时,当 UIViewController嵌入到导航控制器中时,我会在表格视图的顶部看到一个 64高度差。

enter image description here

在过去,我只是重新创建一切,希望约束变成正确的后,一个干净的石板。

TIL: 如果您不想对 Top Layout Guide进行垂直约束,可以按住 Option键来访问 Container Margin

enter image description here

然后确保 Top Space to Superview常数设置为 0。这至少对我有用。

enter image description here

在 iOS9中,这个页面的其他答案对我来说都不起作用(例如,取消选中 Storyboard 中的复选框,将 automaticallyAdjustsScrollViewInsets设置为 NO)。

我真正不满意的解决办法是这样的:

- (void)viewDidAppear:(BOOL)animated {
self.tableView.contentOffset = CGPointMake(0.0, 0.0);
self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

viewWillAppearviewDidLoad中同样的细胞系无效。

I think the real solution is to set up your top and bottom constraints on the tableview be equal to the topMargin and bottomMargin. Not the top layout guide and bottom layout guide. This allows you to keep automaticallyAdjustsScrollViewInsets to be true.

迅捷3解决方案:

class PaddingLessTableView : UITableView
{
override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}


override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
}

如果将 TableViewController 嵌入到 NavigationController 或 ContainerView 中,则为 You have to constraint to margins instead of top Layout guide in Storyboard。对我来说没有其他办法了。我不能发表评论,所以我只是重复罗伯特 · 陈的回答。

我试了几个答案。更改故事板中的设置会导致从左边弹出的覆盖菜单产生连锁反应。

我在故事板中只有一个空白的 UIViewController,否则一切都是通过编程生成的。

我在 UIViewController 中的 UIView 中遇到了同样的问题。也就是说,当 UIViewController 嵌入到导航控制器中时,部分标题开始得太低了。导航控制器一切正常。

为了解决这个问题,我创建了一个 UILabel 并使用约束将 UILabel 底部约束 = UIView 的顶部约束(因此它不会显示在屏幕上)。现在有了这个附加控件(新的 Label) ,TableView 就可以正常工作了。

    inputsContainerView.addSubview(titleLabel)
inputsContainerView.addSubview(tableView)


// inputsContainerView
///////////////////////////////////////
inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true


// tableView
///////////////////////////////////////
tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true


// titleLabel - inserted to stop bad section header behavior
///////////////////////////////////////
titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

我在 iOS11和 xib、 UITableviewController 中也遇到过同样的问题,我按照下面的方法解决了它

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];

如果上述答案都不起作用,请尝试将表视图样式从分组更改为纯文本

enter image description here