2014-11-09 3 views
2

Я знаю, что iOS 8 теперь возвращает правильные размеры экрана для текущей ориентации интерфейса. Чтобы получить ширину устройства для ориентации в iOS 7, вам нужно было вернуть высоту, если ориентация является альбомной или шириной, если ориентация - портретная, но вы всегда можете вернуть ширину в iOS 8. Я уже принял это во внимание для Приложение, которое я разрабатываю, будет поддерживать iOS 7 и 8. (См. код ниже)Размер основных границ экрана зависит от iOS 7 и iOS 8 при вызове willRotateToInterfaceOrientation

Однако я заметил еще одно различие. Если я назову этот метод и передам его ориентацию (полученную от willRotateToInterfaceOrientation), то на iOS 7 он вернет правильную ширину, которая будет, но на iOS 8 она вернет ширину для старой (текущей) ориентации.

Как получить ширину экрана, когда я знаю ориентацию, в которой он сейчас находится, или будет на iOS 8 и iOS 7?

Хотя я мог бы просто поменять ширину и высоту для iOS 8, это вернет неправильное значение, когда эта функция вызывается, пока устройство не переходит к новой ориентации. Я мог бы создать два разных метода, но я ищу более чистое решение.

- (CGFloat)screenWidthForOrientation:(UIInterfaceOrientation)orientation 
{ 
    NSString *reqSysVer = @"8.0"; 
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) { 
     return [UIScreen mainScreen].bounds.size.width; 
    } 

    CGRect screenBounds = [UIScreen mainScreen].bounds; 
    CGFloat width = CGRectGetWidth(screenBounds); 
    CGFloat height = CGRectGetHeight(screenBounds); 

    if (UIInterfaceOrientationIsPortrait(orientation)) { 
     return width; 
    } else if (UIInterfaceOrientationIsLandscape(orientation)) { 
     return height; 
    } 
    return width; 
} 

Прецеденты:

IPad погонных IOS 7:

  • призывающие [self screenWidthForOrientation:[UIApplication sharedApplication].statusBarOrientation] в viewDidAppear возвращает правильную ширину
  • призывающую [self screenWidthForOrientation:toInterfaceOrientation] в willRotateToInterfaceOrientation:toInterfaceOrientation:duration возвращает правильную ширину

IPad погонный IOS 8:

  • призывающих [self screenWidthForOrientation:[UIApplication sharedApplication].statusBarOrientation] в viewDidAppear возвращает правильную ширину
  • призывающей [self screenWidthForOrientation:toInterfaceOrientation] в willRotateToInterfaceOrientation:toInterfaceOrientation:duration возвращает неправильную ширину (что в настоящее время, прежде чем происходит вращение)

ответ

2

Здесь это мой код для расчета правильной ширины и высоты для iOS7/iOS8 перед применением ограничений.

- (void) applyConstraints:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    CGFloat heightOfScreen; 
    CGFloat widthOfScreen; 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { 
     // iOS 8.0 and later code here 
     if ([UIApplication sharedApplication].statusBarOrientation == toInterfaceOrientation) { 
      heightOfScreen = screenSize.height; 
      widthOfScreen = screenSize.width; 
     } else { 
      heightOfScreen = screenSize.width; 
      widthOfScreen = screenSize.height; 
     } 
    } else { 
     if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) { 
      heightOfScreen = screenSize.width; 
      widthOfScreen = screenSize.height; 
     } else { 
      heightOfScreen = screenSize.height; 
      widthOfScreen = screenSize.width; 
     } 
    } 
    //Applying new constraints 
    ... 
} 

Это не так красиво, но это работает =)

0

В прошивке 8, вся природа вращения и система координат полностью изменилась. Вы не должны использовать такие события, как willRotate; они устарели. Все приложение вращается, включая экран. Больше нет преобразований вращения; все приложение (экран, окно, корневой режим) становится все шире и суше, и именно так вы знаете, что что-то произошло (или вы можете зарегистрироваться, чтобы услышать о том, что строка состояния меняет ориентацию). Если вы хотите знать координаты , независимо от вращения, это то, для чего предназначены новые координатные пространства экрана (fixedCoordinateSpace - это тот, который не вращается).

Смежные вопросы