2014-02-17 98 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