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