2013-07-17 140 views
4

我可以很容易地花幾個小時(如果不是天)試圖弄清楚這一點(我已經好幾個小時了進去!)的UIView會自動調整大小

我有一個包含子視圖(見附件圖)和一個UIView是在它甚至作爲子視圖添加到任何東西之前構建的。

enter image description here

在某一個時間點,我將其添加爲子視圖以一個UITableViewCell。我叫

[tableViewCell.contentView addSubview:mySubview] 
    //.... 
[mySubview setBounds:tableViewCell.contentView.bounds] 

,當我初始化我的子視圖我有:

[self setAutoresizesSubviews:YES] 

從我的圖片,你可以看到我假設僅在寬度上的變化。我必須做些什麼才能讓mySubview的右側子視圖在保持原始原點的同時展開爲全寬度?

我可以很容易地接近這一切在我的思想錯誤,我歡迎任何建議!

編輯 非常感謝您的幫助,慶阮

所以,正如我前面所說,當我初始化V1,(和,顧名思義V2)我不知道V1的尺寸。

當我知道我想將V1在我假設我可以做這樣的事情的界限:

[v1 setBounds:(some CGRECT)]; 
v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 

或CI只設置V2的autoresizingMask只要我初始化它(當我仍然不知道V1的尺寸)?

+0

一些問題:1.您是否使用自動佈局?你確定你沒有使用自動佈局? – Andrea

+0

感謝@Andrea的回覆。我可以告訴你的是,我沒有使用xib文件的故事板(所有內容都是以編程方式完成的),我還沒有在我的代碼中聲明使用(或不使用)自動佈局。 – Adam

+0

您是否設置了託管視圖(mySubview)的autoresingmask? – Andrea

回答

1

如果你有一個視圖v1,其子視圖v2和要v2已固定的左邊緣,而其寬度發生變化時v1調整大小(即v1的右邊緣和v2的右邊緣之間的距離是恆定的) ,使用此:

v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 

對於斯威夫特:

v2.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleBottomMargin] 

默認情況下,autoresizesSubviews是YES。你不需要設置它。

編輯

每個視圖的尺寸爲,即使你不知道它(只是做一個NSLog,如果你想知道的話)。如果視圖剛剛被初始化,它的尺寸可能是(0,0)。 autoresizesSubviews工程即使在那種情況下,只要你知道你需要多少間距你需要在子視圖和超視圖之間。

例如,你想v2v1 10px的左緣和20像素的右緣,下面將做

// v1 has been initialized, and its dimensions are unknown (to you) 
// It's probably (0, 0), but that doesn't matter 
// 30px = 10px + 20px 
v2.frame = CGRectMake(10, 0, v1.bounds.size.width - 30, 100); 
v2.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 

注意第三行,v2.frame將被設置爲一些負數,如果v1有最初爲零大小,但後者當v1的幀被設置爲其合適的大小(由您或UITableViewCell),v2將相應地調整大小(因爲自動調整限制)併成爲您想要實現的。

+0

這可能有所幫助,尚不確定。我在做的是在v1的某些未知上下文中的子視圖v2上的initWithFrame。當我最終來到v1上做setBounds時,v2會自動變寬嗎?請記住,在超幀的定義之前,我做了一個initWithFrame:CGRectMake(110,10,super.frame.size.width,super.frame.size.height)。 – Adam

+0

您需要知道調用此行的時刻'v1'和'v2'的確切大小。在該行之後,對'v1'寬度的更改將傳播到'v2'。 –

+0

看我的編輯Khanh – Adam