使用UIViewController中的UITableViewController以编程方式Autolayout

时间:2014-05-20 07:12:47

标签: ios7 autolayout nslayoutconstraint

对于我的简单问题,我祸害了所有的Autolayout问题:

我在UINavigationController中显示了一个UIViewController。那个UIViewController里面有一个UITableViewController。这是代码:

FirstViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *contentView = [UIView new];
    contentView.translatesAutoresizingMaskIntoConstraints = NO;
    self.view = contentView;
    [self.view setBackgroundColor:[UIColor redColor]];
    firstTable=[[FirstTableViewController alloc] initWithStyle:UITableViewStylePlain];
    [self.view addSubview:firstTable.tableView];

}

现在,当我运行时,我在FirstViewController的顶部和tableViewController(其中没有位置代码)之间存在差距。

enter image description here

所以使用viewDidLayoutSubviews方法我尝试了各种约束

-(void) viewDidLayoutSubviews
{
[firstTable.tableView layoutIfNeeded];
//[firstTable.tableView pinEdge:NSLayoutAttributeTop toEdge:NSLayoutAttributeTop ofView:self.view inset:0.0]; 
// CRASHES
[firstTable.tableView addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0.0]]; 
// CRASHES: A constraint cannot be made that sets a location equal to a constant. Location attributes must be specified in pairs'

}

我上面尝试过几种不同的方法

我只想将tableView的顶部与ViewController的视图相匹配。设置框架的问题是我遇到了全屏视图(视频播放器)的问题,推迟了这个差距。

如何匹配此tableViewController的顶部以消除此差距?以编程方式,NOt使用IB使用iOS 7 Autolayout功能请!

解决方案

Sir Lord Stack Master @jrturton指出了我正在考虑的方向,一般来说上面的结构就是问题所在。我将尝试他的一般指针,但我认为它是一个结构问题,并将委托和数据源功能从原始VC中移出并将其带入UITableViewController,这就是它的用途!

1 个答案:

答案 0 :(得分:2)

  1. self.view中设置viewDidLoad是......奇怪的。调用该方法时,已经设置了self.view。
  2. 视图控制器的主视图属性不需要对其自动调整大小的蒙版或任何其他内容执行任何操作。如果我手动构建视图,我通常只在self.view = [UIView new];中执行loadView
  3. 如果您要添加子视图控制器,请确保将其添加为子视图控制器,不要只添加视图
  4. 如果要使用autolayout布置子视图控制器,则需要在子视图控制器的视图中将translatesAutoresizingMaskIntoConstraints设置为NO
  5. viewDidLayoutSubviews不是创建约束的好地方。添加子视图时应添加固定约束,因此您应该在loadView中执行所有操作 - 一旦您按照上述建议操作,只需将表视图固定到顶部,左侧和右侧边缘(并设置)一个高度,如果它没有完全向下,否则也会固定到底部,但如果你这样做,我不知道为什么它是一个子视图控制器)。