3 回答

TA貢獻1829條經驗 獲得超7個贊
在iOS 8+中,您應該使用以下viewWillTransitionToSize:withTransitionCoordinator方法:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// You can store size in an instance variable for later
currentSize = size;
// This is basically an animation block
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Get the new orientation if you want
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
// Adjust your views
[self.myView setFrame:CGRectMake(0, 0, size.width, size.height)];
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
// Anything else you need to do at the end
}];
}
這將替換不推薦使用的動畫方法,該方法不提供有關大小的信息:
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration

TA貢獻1810條經驗 獲得超4個贊
您可以使用類似方法UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)來確定方向,然后相應地使用尺寸。
但是,在方向更改期間(如UIViewController的
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
使用傳入的方向,toInterfaceOrientation因為UIApplication的statusBarOrientation仍會指向舊的方向,因為它尚未更改(因為您位于will事件處理程序中)。
摘要
有幾個與此相關的帖子,但是似乎每個帖子都表明您必須:
看一下[[UIScreen mainScreen] bounds]尺寸
檢查您所處的方向,然后
考慮狀態欄的高度(如果顯示)
鏈接
iPhone:獲取當前視圖尺寸或屏幕尺寸
iPhone / iPad:如何以編程方式獲取屏幕寬度?
目標C-如何獲得當前的屏幕分辨率?
在iPhone或iPad中重新定向后,“框架” /窗口大小“不正確”
iPhone Dev SDK-獲取屏幕寬度
工作守則
我通常不會走那么遠,但是您激起了我的興趣。以下代碼可以解決問題。我在UIApplication上寫了一個Category。我添加了類方法來獲取currentSize或給定方向的大小,這就是您在UIViewController中調用的方法willRotateToInterfaceOrientation:duration:。
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
要使用代碼簡單調用[UIApplication currentSize]。另外,我運行了上面的代碼,因此我知道它可以工作并向各個方向報告正確的響應。請注意,我考慮了狀態欄。有趣的是,我必須減去狀態欄的高度和寬度的最小值。
希望這可以幫助。:D
其他想法
您可以通過查看UIWindow的rootViewController屬性來獲取尺寸。我過去已經看過它,并且類似地在縱向和橫向上報告了相同的尺寸,只是報告了具有旋轉變換:
(gdb) po [[[[[UIApplication sharedApplication] keyWindow] rootViewController]視圖]
<UILayoutContainerView:0xf7296f0; 幀=(0 0; 320480); 變換= [0,-1,1,0,0,0]; 自動調整大小= W + H; 層= <CALayer:0xf729b80 >>
(gdb) po [[[[[UIApplication sharedApplication] keyWindow] rootViewController]視圖]
<UILayoutContainerView:0xf7296f0; 幀=(0 0; 320480); 自動調整大小= W + H; 層= <CALayer:0xf729b80 >>
不確定應用程序的工作方式,但是如果您不使用某種導航控制器,則可以在主視圖下有一個具有最大父級高度/寬度的UIView并隨父級增大/縮小。然后,您可以這樣做:[[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]。一方面看起來很激烈,但是您明白了。
但是...最好在摘要下執行上述三個步驟。開始弄亂UIWindows,您會發現奇怪的東西,例如顯示UIAlertView將更改UIApplication的鍵窗口以指向由UIAlertView創建的新UIWindow。誰知道?我發現了一個依賴keyWindow的錯誤并發現它像那樣改變后才做了!
- 3 回答
- 0 關注
- 577 瀏覽
添加回答
舉報