我只是挣扎了很长一段时间,所以会把它记录下来。
这是我遇到的问题。有了支持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 :)。
答案 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;