若app支援rotation,那麼幾乎一定會涉及uiview的autosizing問題。
autosize有2種方法:
一是在NB的size inspectator property panel裡設定
一是用代碼設定uiview的autoresizingMask屬性
注意: 對於margin,在NB裡的設定和用代碼設定邏輯上是相反的。
例子:
要uiview基於螢幕左上方 (top & left) 的位置不變,
如果要代碼則應該是
subView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin |UIViewAutoresizingFlexibleRightMargin;
而對應的NB設定則是:
要uiview對於上下左右的margin都是flexible的 (即rotate時上下左右都要調整margin)
如果要代碼則應該是
subView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
而對應的NB設定則是:
要uiview對於上下左右的margin都是fix的 (如果你希望uiview旋轉時不需要autosizing,即手動寫代碼來設定位置和大小,那麼應該使用這個)
如果要代碼則應該是
subView.autoresizingMask = UIViewAutoresizingNone;
而對應的NB設定則是:
配合上面的設定,你可能還需要手動寫代碼來設定uiview的位置和大小,example
view1.frame=CGRectMake(10,10,
100, 100);
建議uiview frame的設定的代碼寫在willAnimateRotationToInterfaceOrientation裡 ,而shouldAutorotateToInterfaceOrientation方法則是用於設定支援哪些方向的rotation.
注意:willAnimateRotationToInterfaceOrientation在啟動app時不會調用,只有在rotation之後才會調用,而shouldAutorotateToInterfaceOrientation在啟動時也會調用,而且會調用超過一次!
Example:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ NSLog(@"shouldAutorotateToInterfaceOrientation"); return YES;}- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ NSLog(@"willAnimateRotationToInterfaceOrientation"); if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { view1.frame=CGRectMake(10, 10, 100, 100); } else { view1.frame=CGRectMake(50, 50, 50, 50); } }
ref links:
http://www.cnblogs.com/xingchen/archive/2012/02/29/2374798.html
http://www.techotopia.com/index.php/IOS_4_iPhone_Rotation,_View_Resizing_and_Layout_Handling
http://blog.csdn.net/yuquan0821/article/details/7596545
http://www.cocoachina.com/bbs/read.php?tid=98457
http://hi.baidu.com/rslhg/blog/item/c5338dbf03fa701318d81f64.html