2015-07-02 4 views
0

Я просто долгое время боролся с этим, поэтому запишу это для других.Перемещение UIVIewController модально вверх, когда клавиатура появляется независимо от вращения с помощью iOS7

Вот проблема, с которой я столкнулся. С iPad-приложением, поддерживающим iOS7, у меня есть modal view controller, у которого есть текстовое поле в нижней части модального. Таким образом, когда появляется клавиатура, я хотел бы переместить этот модальный текст так, чтобы текстовое поле все еще было видимым с присутствующей клавиатурой. С iOS8 эта проблема имеет довольно чистое решение (например, см. Moving a modally presented UIViewController up when keyboard appears on iPad with iOS8). С iOS7 я использовал self.myNavController.view.superview.center для репозиционирования, но столкнулся с проблемами при попытке переместить модальность, учитывая внешний вид клавиатуры. Координированные корректировки CGPoint, которые я использовал, не будут перемещать модальный в правильном направлении со всеми четырьмя поворотами/ориентациями iPad.

Проблема частично заключается в том, как iOS7 выполняет поворот - с преобразованиями. Однако я не смог решить проблему с помощью CGPointApplyAffineTransform или преобразовать точки, используя представления (например, convertPoint: fromView :).

ответ

0

Решение, которое я нашел в этой задаче участвуют несколько шагов:

1) Я счел необходимым изменить центр модального (присвоения self.myNavController.view.superview.center) по отношению к центр экрана. Я вычислил центр экрана на основе [UIScreen mainScreen] .bounds.size. Для некоторого примера кода я использовал метод screenCenter ниже.

// Adapted from: http://stackoverflow.com/questions/24150359/is-uiscreen-mainscreen-bounds-size-becoming-orientation-dependent-in-ios8 
+ (CGSize) screenSize; 
{ 
    CGSize screenSize = [UIScreen mainScreen].bounds.size; 
    CGSize rotatedSize; 

    if ([UIDevice ios7OrEarlier] && [[SMRotation session] isLandscape]) { 
     rotatedSize = CGSizeMake(screenSize.height, screenSize.width); 
    } 
    else { 
     rotatedSize = screenSize; 
    } 

    return rotatedSize; 
} 

+ (CGPoint) screenCenter; 
{ 
    CGSize size = [self screenSize]; 
    CGPoint center = CGPointMake(size.width/2.0, size.height/2); 
    return center; 
} 

2) Теперь, учитывая, что вы рассчитали сумму, которую вы должны переместить модальную вверх (например, учитывая высоту клавиатуры и ваша модальная высоту и положение текстового поля на модальном), вызов это количество dy. В следующий раз я счел нужным, чтобы приложение было перевернутым вращением (перевернутый портрет или пейзаж), чтобы изменить знак dy перед тем, как применить его к центральной позиции CGPoint, которую я вычислял. Что-то вроде этого:

CGPoint newCenter = [SMRotation screenCenter]; 
if ([SMRotation session].isInverted) { 
    dy = -dy; 
} 
newCenter.y += dy; 

С некоторыми из кода isInverted здесь:

- (BOOL) isInverted; 
{ 
    switch (self.interfaceOrientation) { 
     case UIInterfaceOrientationPortraitUpsideDown: 
     case UIInterfaceOrientationLandscapeRight: 
      return YES; 

     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationUnknown: 
      return NO; 
    } 
} 

3) Затем, если приложение было в ландшафтном я счел необходимым поменять координаты х и у. Что-то вроде этого:

if ([SMRotation session].isLandscape) { 
     newCenter = CGPointMake(newCenter.y, newCenter.x); 
    } 

4 Наконец, я сделал назначение, чтобы обновить центр модального:

self.myNavController.view.superview.center = newCenter;