1. 程式人生 > >UIScrollView(UITableView、UICollectionView)Autolayout橫屏frame自動變動

UIScrollView(UITableView、UICollectionView)Autolayout橫屏frame自動變動

描述下問題出現的場景
【1】 ViewControllerA 是豎屏的VC,VC中有一個CollectionView。ViewControllerB是橫屏的VC。
【2】跳轉方式為 present

通過- (void)scrollViewDidScroll:(UIScrollView *)scrollView檢視到,當VCA跳轉到VCB的時候,collection view的frame、contentSize、contentOffset都發生了變化

跳轉前
content size—>414.000000,2406.000000

跳轉到VCB後
content size—>736.000000,1898.000000


可以得出的結論,這次變化是由橫屏引起的。

通過調查,我發現引起這個的原因是Autolayout的方式設定View的約束在螢幕變化的時候會引起Frame的變化,即使你當前的VC是隻支援豎屏。

於是我首先用手動管理frame代替了Autolayout

self.collectionView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 40);

然後由於跳轉VCB的時候又操作了status bar的隱藏,導致系統也會自動計算frame。

於是在VC中去掉了自動調整的部分

self.automaticallyAdjustsScrollViewInsets = NO;

最終frame變成:
self.collectionView.frame = CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT - 40 - 64);


不過到此為止還是會有一點小問題,當VCA跳轉VCB,status bar 被收起,頁面還沒完全跳轉到VCB的時候,collection view 與 navigation bar 的中間會有20px的空白哦,暫時還沒有解決,如果有同學解決了希望留言。

參考資料:
Autolayout is changing UIScrollView’s contentOffset on rotation