2014-02-17 75 views
1

所以我必须设置包含一个UIScrollView(和子内容视图),有是一系列的成长UILabels和UIViews,并根据内容中包含的收缩子视图一个UIView他们都使用Storyboard中的AutoLayout。这工作时,我有像标签 - 标签 - 标签 - 视图没有任何问题,但是如果我把两个标签之间插入一个空的UIView和UIView插入子视图,我看不到结果我期待。我有一个故事板布局如下:自动布局约束不能按预期工作

enter image description here

...其中的蓝绿色和蓝色的观点是长到无限高度和橙色视图(方式选择)标签是一个空的UIView,我后来注入子观看。窗口上的其他东西是UILabels和UISegment控件。在每行视图之间,我有一个常量为8的垂直空间约束。这一切都运行良好,直到我不得不放入空的UIView并以编程方式注入子视图。我预期的那样工作会是这样的代码(方式选择是彩色的UIView橙色)...

optionsPanel.translatesAutoresizingMaskIntoConstraints = YES; 
    NSArray *options = [product objectForKey:@"options"]; 
    lastTop = 10; 
    for(int i=0;i<options.count; i++) { 
     NSDictionary *option = [options objectAtIndex:i]; 
     NSArray *values = [option objectForKey:@"values"]; 

     if([self hasNoneValue:values] && values.count == 2) { 
      NSDictionary *value = [self notNoneValue:values]; 

      M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]]; 
      optionCheck.frame = CGRectMake(0, lastTop, 280, 25); 
      [optionsPanel addSubview:optionCheck]; 

      lastTop += 25; 
     } else {} 
    } 

...其中橙色的UIView会奇迹般地成长,一切只想避开相应推,但是这是我所看到的:

no height uiview

...橙色的UIView完全不生长,而其他两个顶部的UIView什么地方去了屏幕。所以,我的下一个猜测是,关闭屏蔽自动调整大小使用...

optionsPanel.translatesAutoresizingMaskIntoConstraints = NO; 

...但我发现这里的一切似乎是工作,但橙色的UIView(方式选择)没有高度的任何结果原因看起来像:

enter image description here

这是越来越接近我所期望的,所以我想我会用这样的代码强制橙色的UIView的高度...

frame = optionsPanel.frame; 
frame.size.height = lastTop; 
optionsPanel.frame = frame; 

...但这似乎对任何事情都没有影响。

纯属猜测,我发现这个代码几乎工作,如果我随意设置optionPanel的起源到的东西比所需要的空间大得多....

optionsPanel.translatesAutoresizingMaskIntoConstraints = YES; 
    NSArray *options = [product objectForKey:@"options"]; 
    lastTop = 10; 
    for(int i=0;i<options.count; i++) { 
     NSDictionary *option = [options objectAtIndex:i]; 
     NSArray *values = [option objectForKey:@"values"]; 

     if([self hasNoneValue:values] && values.count == 2) { 
      NSDictionary *value = [self notNoneValue:values]; 

      M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]]; 
      optionCheck.frame = CGRectMake(0, lastTop, 280, 25); 
      [optionsPanel addSubview:optionCheck]; 

      lastTop += 25; 
     } else {} 
    } 

    lastTop += 10; 

    frame = optionsPanel.frame; 
    frame.size.height = lastTop; 
    frame.origin.y += 300; //some arbitrarily‎ large number 
    optionsPanel.frame = frame; 

..这给出了这样的结果:

enter image description here

...但显然自动版式已决定将名称标签需要占用额外的空间。它是一种丑陋的方法,但如果我能够弄清楚我需要多少空间,那么如果必须的话,我可以推动一切。在两个动态大小的标签之间建立一个动态UIView的秘诀是什么?

+0

我发现另一种黑客工具,工作是做这样的事情: NSLayoutConstraint *约束= [NSLayoutConstraint constraintWithItem:priceLabel属性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:方式选择属性:NSLayoutAttributeTop乘数:1不变:lastTop]。 constraint.priority = UILayoutPriorityRequired; [contentView addConstraint:constraint]; 我在其中将定价标签的顶部设置为选项面板的顶部,其中常数是选项面板的高度,这会将所有内容压低。这不是理想的,但工作。 –

+0

实际上,这并不起作用,optionsPanel的高度仅为〜20像素,所以其他复选框不可触摸。 –

+0

您需要在选项面板和其子视图之间建立约束关系,以强制选项面板增长以适应内容。你不是免费的。当你以编程方式添加一个子视图时,默认的自动调整大小掩码是'UIViewAutoresizingNone',它基本上说“保持帧不变”,并且这被转换成自动布局约束并不会影响超级视图的大小。 –

回答

2

由于@Timothy说,你需要的,如果你想基于其内容的视图默认不做到这一点,以调整手动添加约束橙色视图的子视图。

一般来说,如果你在一个窗口中使用自动布局,你永远不应该是手动设置的任何视图的框架。Autolayout会覆盖您在每次调用时设置的任何帧,因此即使您设法手动让它工作一秒钟,它也会在下次触发布局时失败。

+0

SizeToFit不应该让UIView调整自己? –

+0

我实际上不确定一个UIView是否调整自己以适合它的子视图(我是一个OS X的家伙),但是子视图没有任何约束(而只是有帧),没有任何UIView能够使用。这些框架不计入自动布局,仅限于约束。 –

1

对于在代码中创建的视图,只要它们的translatesAutoresizingMaskIntoConstraints属性为YES(默认顺便),就可以设置它们的帧。

但是,对于在故事板或笔尖中实例化的视图,不能将其translatesAutoresizingMaskIntoConstraints设置为YES