2011-09-28 65 views
1

我想使用UIScrollView作爲我的應用程序的主要容器,使我能夠在子視圖之間來回滑動。要做到這一點,我創建了一個UIViewController子類有UIScrollViewIBOutlet中UIScrollView +改變方向=搞砸子視圖(iPad)

viewDidLoad方法我構建子頁面:

for (int i= 0; i< pageCount; i++) 
{ 
    CGRect frame = self.scrollView.frame; 
    frame.origin.x = frame.size.width * i; 
    frame.origin.y = 0; 

    UIWebView* aWebView= [[UIWebView alloc] initWithFrame:frame]; 

    [self.scrollView addSubview:aWebView]; 
} 

當啓動應用程序(肖像模式),一切正常。也就是說,UIWebViews與正確的尺寸並排放置,我可以在它們之間來回滑動。

當我旋轉到風景時,似乎scrollview尺寸和子視圖都沒有調整大小。

我不知道我應該怎麼做才能調整子視圖和scrollview本身的大小,或者我應該在代碼的哪一點做任何事情,而且我似乎找不到任何示例。

任何人都知道該怎麼辦?

[編輯]嘗試通過mahboudz的建議,調整大小:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * pageCount, self.scrollView.frame.size.height); 

    for (int i= 0; i< pageCount; i++) 
    { 
     CGRect frame = self.scrollView.frame; 
     frame.origin.x = frame.size.width * i; 
     frame.origin.y = 0; 

     UIWebView* view= [[self.scrollView subviews] objectAtIndex:i]; 

     view.frame= frame; 
    } 
} 

這種我想要做什麼,但有以下問題:

1),可以看到子視圖增長到正確改變屏幕尺寸時的屏幕尺寸

2)噹噹前頁面是例如第5頁的第2頁時,頁面在方向改變後並不完全可見,但是像40像素一樣離開屏幕

3)我得到這取決於應用程序是否在肖像或風景模式(模擬)推出奇怪的效果,虐待試圖解釋:

當應用程序在縱向模式下啓動:

  • 形狀/子視圖的邊框看起來很亂/屏幕外,見截圖:

http://i53.tinypic.com/21jr76x.png

  • 當我旋轉到風景,一切看起來不錯,滾動工作精湛。甚至當我轉回肖像,現在一切是偉大的:

http://i55.tinypic.com/if3iiw.png

當應用程序在橫向模式launchend:

  • 我得到同樣搞砸/屏幕外毛刺在人像模式下

  • 縱向和橫向之間來回切換修復此景觀模式

  • BUT:縱向模式將具有子視圖與風景模式的寬度,從而子視圖太寬

我試圖修復1)做上面的代碼中willRotateToInterfaceOrientation但是它完全弄亂了佈局。

// update the scroll view to the appropriate page 

CGRect frame = self.scrollView.frame; 
frame.origin.x = frame.size.width * self.currentPage; 
frame.origin.y = 0; 

[self.scrollView scrollRectToVisible:frame animated:NO]; 

注:

我加入以下代碼didRotateFromInterfaceOrientation固定2)當前頁面處於scrollViewDidScroll

確定我沒有任何想法如何解決3)

回答

0

你需要實施viewWillRotate/viewDidRotate並根據需要對我們的內容大小和方向進行調整。

+0

所以基本上我需要先設置contentSize(子幾何的新幾何*數量),然後循環子視圖並將框架屬性設置爲新幾何?我是否還必須觸發重新繪製視圖(setNeedsDisplay)或類似視圖,還是隻需設置frame和contentSize即可工作? – user944943

+0

我不認爲你需要setNeedsDisplay。我相當肯定你需要調整你的框架/界限和contentSize等。看看你是否可以通過使用InterfaceBuilder(或通過代碼)設置自動調整大小的標誌來獲得一些自動移動/調整大小的幫助。 – mahboudz

+0

添加了更多代碼並嘗試解決上述問題 – user944943

3

您需要重置幀大小,內容大小和內容偏移量,以便將子視圖放在適當的位置。

CGFloat screenHeight =[UIScreen mainScreen].bounds.size.height; 
CGFloat screenWidth =[UIScreen mainScreen].bounds.size.width; 
self.scrollView.frame = CGRectMake(0, 0, screenWidth, screenHeight); 
self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, self.scrollView.frame.size.height); 
self.scrollView.contentOffset = CGPointMake(visiblePageBeforeRotation * self.scrollView.bounds.size.width, 0); 

此代碼應放置在方法

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration 

檢查,以及對這個問題的答案: Clean autorotation transitions in a paging UIScrollView 它有一個名爲Rotolling與啓用旋轉分頁UIScrollView的很好的例子。

希望這會有所幫助。

P.S:我正面臨在旋轉時重新定位UIWebView中心的問題。