我有一个新项目,我可以使用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
将根据需要调整大小(没有压缩阻力,如果我们看不到表格,我不在乎)。
什么行不通:AutoLayout
和ChildControllers
然后为了简单起见,我选择使用ChildControllers
(执行自定义UIFont设置所需的很多插座,太糟糕的XCode还无法处理它们!)。
我做了以下修改:
HomeTopViewController
的根容器配置为 200px 高度。view
插座。然后我将设置代码更新为以下内容:
-(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)
。
我确实将布局大小配置为“自由格式”或“无”。
我想尽可能避免的事情
我不想在View
和HomeTopViewController
上创建其他插座然后HomeTableViewController
并将初始帧/高度存储到UIViewController属性中。
问题
答案 0 :(得分:0)
如果您使用故事板,这会更容易。您可以向主控制器的视图添加容器视图,并根据需要调整它们的大小,并自动获取嵌入在这些容器视图中的视图控制器,这些视图控制器设置为正确的大小。这些容器视图(在对象列表中的常规UIView旁边)仅可从故事板中获得,而不是xib。这几乎不需要代码,您可能不必手动添加任何约束。