当键盘出现与iOS7的旋转无关时,移动UIVIewController模式

时间:2015-07-02 23:11:47

标签: objective-c ipad ios7 auto-rotation

我只是挣扎了很长一段时间,所以会把它记录下来。

这是我遇到的问题。有了支持iOS7的iPad应用,我有一个模态视图控制器,在模态底部附近有一个文本字段。因此,当键盘出现时,我想将该模态向上移动,以便在键盘存在的情况下仍然可以看到文本字段。对于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 :)。

1 个答案:

答案 0 :(得分: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。我接下来发现有必要,如果应用程序是倒置旋转(颠倒的肖像或横向),在将其应用到我正在计算的CGPoint中心位置之前更改dy的符号。像这样:

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)然后,如果应用程序处于横向状态,我发现有必要交换x和y坐标。像这样:

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

4最后,我完成了更新模态中心的任务:

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