UITableView以iOS 7中的偏移量开始

时间:2013-08-22 18:41:39

标签: uitableview ios7

我已经将一个简单的jane UITableView拖到了iOS 7中的UIViewController上。

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

enter image description here

有什么想法吗?

19 个答案:

答案 0 :(得分:106)

UIViewController 的新 iOS 7 实现有一组新选项,允许开发人员选择系统是否会自动为 UIScrollView添加插件 UITableView 和派生。

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

View Controller Inspector

更多详情:

  1. Submit your iOS 7 apps today.
  2. iOS 7 UI Transition Guide > Appearance and Behavior

答案 1 :(得分:81)

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

看起来你将它定位在44(可能是64)px以将其从导航栏下移出来,但它已经补偿了这一点,因此你会有很大的差距。

转到IB中的storyboard / xib并取消导航栏内容下的节目内容。

答案 2 :(得分:68)

From iOS7 transition guide:

  

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

   self.automaticallyAdjustsScrollViewInsets = NO;

答案 3 :(得分:34)

我遇到了类似的问题,在解除了一个viewController后,我的tableView中的contentOffset被改为(0,-64)。

我的解决方案有点奇怪,我尝试了所有其他答案但没有成功,解决我的问题的唯一办法就是在.xib的控件树中切换tableView位置

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

before

我在ImageView之后移动了tableView,它运行起来了:

after

似乎将表格视图放在第一个位置会导致麻烦,并将表格视图移动到另一个位置可以解决问题。

Pd积。我没有使用autoLayout和故事板

希望这可以帮助别人!

答案 4 :(得分:30)

它解决了我类似的问题:

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

答案 5 :(得分:13)

尝试使用此

tableView.separatorInset = UIEdgeInsetsZero;

显然,如果你支持的东西比iOS7少,你需要确保对象在调用之前响应这个选择器。

答案 6 :(得分:9)

说真的,改变contentOffset不是解决方案。你只是修补一个问题,而不是修复原因。我一直面临同样的问题,结果是分组 tableViews在顶部有一个填充。在我的情况下,将类型设置为 plain 已经成功了。

希望能节省几分钟。 ž。

答案 7 :(得分:8)

对于iOS 9,此页面的其他答案都不适用于我(即取消选中故事板中的框,将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); } )。

我的解决方法我真的不满意这是:

viewWillAppear

viewDidLoad=Graph Shared With (3)= {| class="wikitable" |- | '''ID''' | '''Name''' |- |115 sirajTest ahmad sirajTestsirajTest ahmad sirajTest |sirajTest ahmad sirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmad |- |15 sirajTest ahmad sirajTest |Test Marquard sirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmad |- |92sirajTest ahmad sirajTestsirajTest ahmad sirajTestsirajTest ahmad sirajTest |Ahtesham ul haqsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmadsirajTest ahmad |} 中的相同行无效。

答案 8 :(得分:5)

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

this

在过去,我只会重新创建所有内容,希望在一个干净的平板之后,约束条件变得正确。

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

enter image description here

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

enter image description here

答案 9 :(得分:4)

这对我有用:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

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

答案 10 :(得分:2)

如果你在UITableView之前添加一个空的UIView(或任何视图是可滚动的,如ScrollView和TextView),你可以运气好。

答案 11 :(得分:1)

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

垂直空间的大小似乎与导航栏的帧高和y偏移相匹配。该问题仅发生在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);
    }
}

答案 12 :(得分:1)

在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();
    }
}

答案 13 :(得分:0)

如果您转到故事板,可以通过选择表来更改偏移量,然后在“属性”检查器的“表视图”部分下,将左侧的“分隔符插入”更改为0。

答案 14 :(得分:0)

我认为真正的解决方案是在tableview上设置你的顶部和底部约束等于topMargin和bottomMargin。不是顶部布局指南和底部布局指南。这允许您将automaticAdjustsScrollViewInsets保持为真。

答案 15 :(得分:0)

Swift 3解决方案:

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

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

答案 16 :(得分:0)

如果在TableController或ContainerView中嵌入了TableViewController,You have to constraint to margins instead of top Layout guide in StoryboardCheck constraint to margins when you are doing the constraints没有其他方式可以帮助我。我无法评论,所以我只是重申Robert Chens的回答。

答案 17 :(得分:0)

我尝试了几个答案。更改故事板中的设置会导致从左侧弹出的叠加菜单出现涟漪问题。

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

我在UIViewController里面的UIView里面有一个UITableView也有同样的问题。也就是说,当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

答案 18 :(得分:0)

我在iOS 11和xib,UITableviewController中遇到了同样的问题,我解决了它,如下所示

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