UIViewController viewDidLoad

时间:2013-01-03 17:29:54

标签: objective-c ios uiviewcontroller ios6 autolayout

我有一个新项目,我可以使用iOS 5+功能,因此我选择使用AutoLayout和UIViewController childControllers功能。

我正在尝试创建的屏幕很简单:  顶部区域有很多“复杂”的控件。  2.底部区域是一个可视化结果的桌面视图。

我想要什么

我希望控件区域占据所有必要的位置(即我在Interface Builder中提供的位置)。 TableView将根据需要缩小。

问题

从XIB加载时,UIViewController.view帧的大小始终为0x568。我被期望为0x200(如果200是我在Interface Builder中配置的大小)。

什么有效:使用AutoLayout

我用我的所有元素创建了一个XIB。我在“根视图”上做了插座,我做了插座和所有视图容器。

然后在我的viewDidLoad方法中添加了容器和配置的约束。

-(void) setupConstraints
{
    NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1];

    // Views dictionary.
    UIView *topView = self.topView;
    UIView *table   = self.tableTracks;
    NSDictionary *views = NSDictionaryOfVariableBindings(topView, table);

    // Views metrics.
    NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topView.frame.size.height];
    NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight);

    // Pin the topView to the top edge of the container.
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]];

    // Pin the topView edges to both sides of the container.
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]];

    // Pin the table edges to both sides of the container.
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]];

    [self.view addConstraints:constraints];
}

有了这个,我可以使用Interface Builder简单地调整topView视图的大小,TableView将根据需要调整大小(没有压缩阻力,如果我们看不到表格,我不在乎)。

什么行不通:AutoLayoutChildControllers

然后为了简单起见,我选择使用ChildControllers(执行自定义UIFont设置所需的很多插座,太糟糕的XCode还无法处理它们!)。 我做了以下修改:

  1. 创建了HomeTopViewController类+ XIB。创建了HomeTableViewController类+ XIB。
  2. 将所有视图从原点复制到正确的XIB。添加UIViewController引用+连接出口。
  3. HomeTopViewController的根容器配置为 200px 高度。
  4. 将我的容器连接到我孩子控制器的 view 插座。
  5. 然后我将设置代码更新为以下内容:

    -(void) _addChildViewControllersAndSetupConstraints {
        // Get required metrics variables
        NSNumber *topViewHeight = [NSNumber numberWithFloat:self.topViewController.view.frame.size.height];
    
        CFShow(self.topViewController.view);
        // log is : <UIView: 0xa209c20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xa2097e0>>
        NSLog(@"self.topViewController.view.frame.size.height = %f", self.topViewController.view.frame.size.height);
    
    
        // Informs controllers the ADD operation started
        [self addChildViewController:self.topViewController];
        [self addChildViewController:self.tableViewController];
    
        // Add view to the view's hierarchy
        self.topViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
        self.tableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
    
        [self.view addSubview:self.topViewController.view];
        [self.view addSubview:self.tableViewController.view];
    
    
        // Setup constraints
        NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:1];
    
        // Views dictionary
        UIView *topView = self.topViewController.view;
        UIView *table   = self.tableViewController.view;
    
        NSDictionary *views = NSDictionaryOfVariableBindings(topView, table);
    
        // Views metrics dictionary
        NSDictionary *metrics = NSDictionaryOfVariableBindings(topViewHeight);
    
        // Pin the topView to the top edge of the container.
        [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topView(==topViewHeight)][table]|" options:0 metrics:metrics views:views]];
    
        // Pin the topView edges to both sides of the container.
        [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topView]|" options:0 metrics:nil views:views]];
    
        // Pin the table edges to both sides of the container.
        [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:views]];
    
        // Adds constraints
        [self.view addConstraints:constraints];
    
    
        // Informs controllers the ADD operation ended
        [self.topViewController didMoveToParentViewController:self];
        [self.tableViewController didMoveToParentViewController:self];
    }
    

    问题

    无论我在HomeTopViewController中如何调整UIView容器的大小,行CFShow(self.topViewController.view);总是会在我预期200px时给我frame = (0 0; 320 568)

    我确实将布局大小配置为“自由格式”或“无”。

    我想尽可能避免的事情

    我不想在ViewHomeTopViewController上创建其他插座然后HomeTableViewController并将初始帧/高度存储到UIViewController属性中。

    问题

    1. 在加载时,屏幕上是否都调整了controller.view.frame属性的大小? (是3,5或4英寸)
    2. 我怎样才能解决这个问题,而无需在某处创建附加插座?

1 个答案:

答案 0 :(得分:0)

如果您使用故事板,这会更容易。您可以向主控制器的视图添加容器视图,并根据需要调整它们的大小,并自动获取嵌入在这些容器视图中的视图控制器,这些视图控制器设置为正确的大小。这些容器视图(在对象列表中的常规UIView旁边)仅可从故事板中获得,而不是xib。这几乎不需要代码,您可能不必手动添加任何约束。