2013-10-31 98 views
0

Figure 1維護子視圖相對位置

我的應用程序是建立在有一個UIImageView子視圖和其他各種子視圖一個UIScrollView。當我旋轉到橫向時,我更改滾動視圖的contentSize並按比例調整圖像視圖的大小以利用增加的橫向寬度。高度的增加意味着保持比例。

我的問題是,在顯示藍色子視圖的情況下,我需要做些什麼來重新定位它,以便它在旋轉後保持它的相對位置,因爲它的超級視圖不再是相同的大小?我已經嘗試過convertRect:toView:和converPoint:toView :,但我似乎無法完全正確。

+0

爲了回答這個問題,我想我們需要知道你是否打算在輪換之後調整藍色方塊的大小(保持內容區域按比例,但平方比例在橫向上比例較小)。 – hatfinch

回答

1

您在使用自動佈局?如果是這樣,在許多情況下,即使在從風景轉向縱向的情況下,明智地使用約束也可以將該子視圖保留在正確的位置和正確的大小。但是你必須分享更多關於這個觀點的更多細節,讓我們更具體。

如果不使用自動佈局,通常可以設置視圖的自動調整掩碼,以便它移動到正確的位置。但是,在一個滾動視圖子視圖的情況下,你可能有你的視圖控制器可以到viewWillLayoutSubviews響應,更新滾動視圖的contentSize和子視圖的frame移動,因此:

- (void)viewWillLayoutSubviews 
{ 
    // update the contentSize of the scroll view for the width of the root view, but I'm assuming the 
    // height won't change 

    self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.scrollView.contentSize.height); 

    // adjust the frame of the subview you want to move so that it is a certain offset from the bottom 
    // left corner of the scroll view's `contentSize` (in this case, 10 points from bottom, 10 points from right) 

    self.subviewToMove.frame = CGRectMake(self.scrollView.contentSize.width - self.subviewToMove.frame.size.width - 10, 
              self.scrollView.contentSize.height - self.subviewToMove.frame.size.height - 10, 
              self.subviewToMove.frame.size.width, self.subviewToMove.frame.size.height); 
} 

的細節有所不同根據(a)您是否使用自動佈局的細節; (b)是否以編程方式創建子視圖;和(c)您在視圖中看到的其他內容以及從縱向到橫向和背面的更改是否導致滾動視圖的垂直高度發生任何更改。

+0

我按照你的建議添加了代碼,並在willAnimateRotationToInterfaceOrientation中添加了一些NSLog語句:我確實看到原點現在正在改變,但視圖看起來仍然在同一位置。藍色子視圖是uiscrollview的子項,我確實調用了layoutsubviews。無法弄清楚爲什麼它不移動? – skantner

+0

@skantner我推斷你沒有使用自動佈局?在這種情況下,我可能只是迴應'viewWillLayoutSubviews',這是您對'frame'座標等進行最後一刻調整的機會。查看修訂答案中的代碼示例。 – Rob

+0

你是對的,我沒有使用自動佈局。我的應用程序早於它,我從來沒有轉換。你的方法基本上是我需要做的。我做了一些粗略的測試,我可以看到它會起作用。謝謝! – skantner

0

要重新定位視圖,請更新其框架。框架屬性的類型是CGRect,它是大小(CGSize)和原點(CGPoint)的組合。如果藍色視圖的大小沒有改變,那麼只有原點應該更新。

的iOS座標系統從左上角開始:

ios coordinate system

對於你的藍視你算算這是從右下角的起源,那就是

origin = contentSize - blueViewSize - padding 

單獨做此xy座標,使CGRect具有更新的原點,並更新藍色視圖的框架。

UP:這是你如何做手工,但你可以(和更好的應該)讓UIKit的自動重新定位子視圖爲你 - 瞭解在Xcode的界面生成器自動尺寸和自動佈局和Developer manuals