2013-07-26 107 views
2

我有一個很好地使用自動佈局設置的視圖。該視圖包含從頂部到底部堆疊的一系列標籤。我允許這些標籤的固有尺寸來確定視圖的大小。UIImageView和自動佈局

的最後一步是從圖像中添加背景。我開始在UIColor上嘗試colorWithPatternImage方法,但這並不是我所期待的。我不想平鋪圖像,但我不能保證它始終大於視圖的固有尺寸。

同樣,添加uiImageView視圖本身完全不是那麼回事。當我想根據標籤保留內在尺寸時,視圖將展開以適應圖像。

我猜我期待的是以下幾點。

1)背景應該對視圖的大小沒有影響。 2)圖像應該縮放以填充視圖,但是它的原始縱橫比(如果需要的話裁剪邊緣)。

任何想法讚賞。

回答

0

在界面生成器中,添加一個UIImageView作爲第一子視圖的視圖。確保其大小始終與視圖匹配。

然後,在界面生成器或代碼,設置contentMode

backgroundImageView.contentMode = UIViewContentModeScaleAspectFill; 
+0

謝謝 - 但我如何確保大小匹配使用約束(我不使用IB)?如果我設置了一個約束,使得視圖的大小==,視圖只是展開以滿足該約束(而不是圖像縮小)。不幸的是,我無法硬編碼視圖的固定高度,因爲大小取決於內容。 –

+0

您可以覆蓋'layoutSubviews'並確保背景圖像視圖的大小相同。 – Mundi

+0

我想我們應該調用'layoutIfNeeded' – onmyway133

0

這是我會怎麼處理這個。希望它有幫助。 :)

CGRect  contentFrame  = CGRectMake(0, 0, self.view.frame.size.width, 0);  // This will be the frame used to create the background image view. 
UIEdgeInsets contentInsets = UIEdgeInsetsMake(20, 20, 20, 20);  // The margins by which the labels will be inset from the edge of their parent view. 
CGFloat  labelHeight  = 21; 
CGFloat  verticalGap  = 8;      // The vertical space between labels 
CGFloat  y    = contentInsets.top; 
int   numberOfLabels = 10; 

for (int i = 0; i < numberOfLabels; i++) { 

    CGRect frame = CGRectMake(contentInsets.left, y, self.view.frame.size.width - (contentInsets.left + contentInsets.right), labelHeight); 
    UILabel *label = [[[UILabel alloc] initWithFrame: frame] autorelease]; 

    // customize the label here 

    [self.view addSubview: label]; 
    contentFrame = CGRectUnion(contentFrame, label.frame); 

    y += labelHeight + verticalGap; 
} 

contentFrame.size.height += contentInsets.bottom; 

UIImageView *backgroundImageView = [[[UIImageView alloc] initWithFrame: contentFrame] autorelease]; 
[backgroundImageView setClipsToBounds: YES]; 
[backgroundImageView setContentMode: UIViewContentModeScaleAspectFill]; 
[backgroundImageView setImage: [UIImage imageNamed: @"background_image.png"]]; 
[self.view insertSubview: backgroundImageView atIndex: 0]; 
+0

我試圖獨佔地使用自動佈局。也許我可以應用相同的邏輯。 –

5

就我而言,我需要它爲UIImageViewUITableViewCell一個動態大小的視圖中,但圖像拒絕收縮低於其instristic大小,而是擔任最小尺寸限制的上海華。我能得到它忽略intristic大小的唯一方法是通過降低在它被強制執行的優先級,創造了細胞之後:

[imageView setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; [imageView setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisVertical];

在此之後,我的所有約束奇蹟般地開始工作。在OP的情況下,根據Mundi的回答,還需要設置UIViewContentModeScaleAspectFill

+0

設置XIB內容壓縮性&內容抱死爲UIImageViiew到249(249 <解決問題 – john07

+0

爲uitalbeviewcell地方所有元件到單一視圖250) - >視圖到內容查看 – john07

+0

我採用在具有動態高度今天插件的相同溶液中。謝謝。 –