2010-07-23 26 views
12

我有一個分頁UIScrollView,其中用戶通過圖像水平頁面,如Apple的Photos.app。這有效,但現在我試圖添加旋轉支持。在分頁中清理自動轉換UIScrollView

我已經看到旋轉正常,並設法正確設置contentSize,bounds和subviews的框架以適應不同的方向。所以在旋轉之前和之後,一切都很好。

但是,轉換本身很尷尬。第一個圖像完美旋轉,就像旋轉軸位於圖像的死點(滾動視圖框)一樣。第二個圖像「搖擺」,因爲旋轉軸位於相同的位置:第一個圖像的中心。我從第一幅圖像中得到的距離越遠,「鞦韆」就越快。

我可以通過在旋轉之前覆蓋一個不透明的UIView並隱藏它來掩蓋它。但這是一個黑客。必須有一個優雅的方式來做到這一點...

回答

38

坦率地說,我不知道你在做什麼,因爲你沒有向我們展示過多的東西。

但是!

我在滾動視圖中創建了一個帶有幾個視圖的示例項目,它工作正常。隨意按照你的意願挑選它。它通過創建5個視圖並將其添加到滾動視圖來工作。然後,在第一次設置這些視圖並且每次應用程序旋轉後,它會調用我的方法alignSubviews將它們放在正確的頁面位置,並使它們與滾動視圖的大小相同,同時更新滾動視圖的contentSize 。在旋轉發生之前,它會跟蹤滾動視圖當前所處的頁面,然後在旋轉過程中將其重置爲該頁面(因爲頁面大小必須更改)。

Download "Rotolling"!

screenshot http://cl.ly/43de79be29c5a03a1775/content

+0

很好的例子!我沒有發佈任何代碼,因爲我知道我有什麼需要報廢。這個故事的寓意是,如果我發現自己手動設置和重新設置全景視圖框架,我做錯了。 – alexantd 2010-07-28 20:17:26

+0

太好了。只是開箱即用。謝謝。 – Gerd 2012-01-10 14:29:05

+4

謝謝你的好例子。需要在iOS 6上成功啓動一個修復程序:[window setRootViewController:viewController];應用程序:didFinishLaunchingWithOptions方法。 – kaspartus 2012-11-16 14:05:00

1

這聽起來像你應用魔術,需要在正確的地方,在錯誤的方式獲得旋轉的版本在屏幕上。

由於您沒有共享任何代碼,因此以下僅僅是猜測。據推測,你應用旋轉和翻譯。它聽起來像你正在旋轉UIScrollView內容。做對這將是棘手的。如果沒有代碼,很難說出任何確鑿的結論,但如果你只有1次輪換和1次翻譯,那麼你做錯了。您需要將當前視圖轉換爲樞軸點,旋轉並翻譯回去。否則,翻譯將成爲輪換的一部分(因此是大擺幅)。

你最好旋轉UIScrollView本身。它將始終位於具有定義中心的定義位置(即:屏幕)。內容隨後會隨之旋轉。

7

我注意到這個信息,以供日後參考自己。 我用@jtvandes的解決方案來解決這個問題。 但是,就我而言,這些實現足夠了。強制佈局再次打破了我的觀點。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    currentPageOffset = [hostingScrollView contentOffset].x/[hostingScrollView bounds].size.width; 
} 
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    // Layout changed instantly at this time. 
    // So we have to force to set offset instantly by setting animation to NO. 
    [hostingScrollView setContentOffset:CGPointMake([hostingScrollView bounds].size.width * currentPageOffset, 0.0f) animated:NO]; 
} 
1

一個簡單的解決方案,效果很好當的的UIScrollView的contentSize改變的通知進行註冊,然後在那一刻更新contentOffset。

在你看來裝載方法添加此行:

[self addObserver:theScrollView forKeyPath:@"contentSize" options:0 context:nil]; 

在你看來卸載方法添加此行:

[self removeObserver:self forKeyPath:@"contentSize"]; 

趕上通知:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    theScrollView.contentOffset = page * theScrollView.bounds.width; 
}