@PeterPurple の回答には同意しますが、実際に機能するコードを思い付くまでに時間がかかりました。私の例では、水平方向に中央に配置されたモーダル ビューを表示しますが、ビューがキーボードの邪魔にならないように画面の上部に配置します。もちろん、キーボードが表示されたときにビューを上に移動することもできますが、面倒です。とにかく、これが私がやった方法です。
カスタムのモーダル セグエを作成し、そのセグエで perform: メソッドを次のようにオーバーライドしました。
@implementation CustomSegue
static const CGFloat TOP_MARGIN = 40;
static const CGFloat SUPER_VIEW_GAP = 10;
- (void)perform {
UIView *destView = [self.destinationViewController view];
[self.destinationViewController setModalPresentationStyle:UIModalPresentationPageSheet];
[self.destinationViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
CGFloat x, y, width, height, yCenter;
CGSize contentSize = [self.destinationViewController contentSizeForViewInPopover];
x = destView.superview.frame.origin.x;
y = destView.superview.frame.origin.y;
width = contentSize.width;
height = contentSize.height;
yCenter = (height / 2.0) + TOP_MARGIN;
destView.superview.frame = CGRectMake(x + SUPER_VIEW_GAP, y + SUPER_VIEW_GAP, width - (SUPER_VIEW_GAP * 2), height - (SUPER_VIEW_GAP * 2));
destView.superview.autoresizingMask = UIViewAutoresizingNone;
destView.superview.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin;
destView.superview.center = CGPointMake([[self.sourceViewController view] center].x, yCenter);
destView.frame = CGRectMake(-SUPER_VIEW_GAP, -SUPER_VIEW_GAP, width, height);
}