所以我必須設置包含一個UIScrollView(和子內容視圖),有是一系列的成長UILabels和UIViews,並根據內容中包含的收縮子視圖一個UIView他們都使用Storyboard中的AutoLayout。這工作時,我有像標籤 - 標籤 - 標籤 - 視圖沒有任何問題,但是如果我把兩個標籤之間插入一個空的UIView和UIView插入子視圖,我看不到結果我期待。我有一個故事板佈局如下:自動佈局約束不能按預期工作
...其中的藍綠色和藍色的觀點是長到無限高度和橙色視圖(方式選擇)標籤是一個空的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會奇蹟般地成長,一切只想避開相應推,但是這是我所看到的:
...橙色的UIView完全不生長,而其他兩個頂部的UIView什麼地方去了屏幕。所以,我的下一個猜測是,關閉屏蔽自動調整大小使用...
optionsPanel.translatesAutoresizingMaskIntoConstraints = NO;
...但我發現這裏的一切似乎是工作,但橙色的UIView(方式選擇)沒有高度的任何結果原因看起來像:
這是越來越接近我所期望的,所以我想我會用這樣的代碼強制橙色的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;
..這給出了這樣的結果:
...但顯然自動版式已決定將名稱標籤需要佔用額外的空間。它是一種醜陋的方法,但如果我能夠弄清楚我需要多少空間,那麼如果必須的話,我可以推動一切。在兩個動態大小的標籤之間建立一個動態UIView的祕訣是什麼?
我發現另一種黑客工具,工作是做這樣的事情: NSLayoutConstraint *約束= [NSLayoutConstraint constraintWithItem:priceLabel屬性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:方式選擇屬性:NSLayoutAttributeTop乘數:1不變:lastTop]。 constraint.priority = UILayoutPriorityRequired; [contentView addConstraint:constraint]; 我在其中將定價標籤的頂部設置爲選項面板的頂部,其中常數是選項面板的高度,這會將所有內容壓低。這不是理想的,但工作。 –
實際上,這並不起作用,optionsPanel的高度僅爲〜20像素,所以其他複選框不可觸摸。 –
您需要在選項面板和其子視圖之間建立約束關係,以強制選項面板增長以適應內容。你不是免費的。當你以編程方式添加一個子視圖時,默認的自動調整大小掩碼是'UIViewAutoresizingNone',它基本上說「保持幀不變」,並且這被轉換成自動佈局約束並不會影響超級視圖的大小。 –