2013-07-16 40 views
5

我有我的應用程序中的滾動視圖,通過故事板初始化,我試圖改變框架。一切似乎都奏效,但如果框架和內容大小在設置後很短時間內訪問,但在我的方法返回後,它們就不同了!下面是代碼:UIScrollView神祕地改變框架和內容大小

CGFloat inputHeight = inputView.frame.size.height; 
originalContentHeight = self.scrollableContentView.frame.size.height; 
NSLog(@"%f", self.scrollableContentView.frame.size.height-inputHeight); 
[self.scrollableContentView setFrame:CGRectMake(self.scrollableContentView.frame.origin.x, self.scrollableContentView.frame.origin.y, self.scrollableContentView.frame.size.width, self.scrollableContentView.frame.size.height-inputHeight)]; 
NSLog(@"%f", self.scrollableContentView.frame.size.height); 
NSLog(@"%@", self.scrollableContentView); 

這些日誌的輸出均與預期一樣全部,那就是:

<UIScrollView: 0x808de00; frame = (0 0; 320 81); ... > 

但是,如果我在另一種方法設置斷點,由被調用的時候,記錄所述滾動視圖顯示了該:

<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... > 

另外,內容大小變化這樣的:

(width=320, height=416) 

(width=320, height=504) 

兩個值似乎被自動回覆到它們具有當所述視圖被第一中規定的值。我在滾動視圖的getter和setter中設置了斷點,並且找不到任何意外的訪問,所以我得出結論,必須在內部進行更改。這是一個合理的結論嗎?可能會出現什麼問題?

+0

您可以將自動調整彈簧設置爲可調節高度嗎? – Jamie

+0

我在哪裏可以找到? – Jumhyn

+0

這是因爲自動佈局。要麼關閉該功能,要麼通過調整約束而不是設置框架來更改滾動視圖的大小。 – rdelmar

回答

6

如果您使用自動佈局,您應該更改約束,而不是設置滾動視圖的框架。

查看我對類似問題的回答here。它有一些關於如何以編程方式設置約束的例子。

此外,您在哪種方法中設置framecontentSize?由於您使用的是故事板,如果它位於viewDidLoadviewWillAppear:,最好將此代碼移至viewDidLayoutSubviews

+0

我的確在'viewDidLayoutSubviews'中有代碼(按照我的問題歷史記錄)。我會在今天晚些時候嘗試。 – Jumhyn

+1

限制是要走的路。我實際上發現,最好的方法是在Interface Builder中爲約束添加一個出口,然後編輯'constant'屬性。 – Jumhyn

+0

@Jumhyn是的,我還發現如果它已經存在於故事板中,那麼這是一種簡單的方法來更改約束。真高興你做到了! –