モーダルビューコントローラーを提示しています。問題がある場合は、下から上にスクロールしています。画面のどの部分を占有するかをどのように制御できますか?
編集:モーダルビューコントローラーに次のものが含まれています。それは役に立たない。
- (void)viewDidLoad {
TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest];
self.view = trv;
trv.frame = CGRectMake(0, 320, 320, 160);
[trv release];
[super viewDidLoad];
}
ビューコントローラーのフレームを変更できますが、UIViewControllerの-presentModalViewController:animated:メソッドを使用している場合、モーダルビューが画面にアニメーション表示されると、背後のビューがアンロードされます(これは、iPhoneを使用していることを前提としています)。バックグラウンドビューがあるはずの場所に白い画面が表示されます。 iOSでは、モーダルビューコントローラーがフルスクリーンビューコントローラーであると想定し、メモリを節約するために他のビューをダンプします。
画面の一部にビューを表示したい場合は、代わりに、UIView(UIViewControllerなし)を現在のUIViewControllerのビューにサブビューとして追加し、自分で画面上でアニメーション化する必要があります。ビューを表示するUIViewControllerクラスでは、次のようなものが機能すると思います。
// Add the view as a subview and position it offscreen just below the current view
UIView *myHalfView = [[UIView alloc] initWithFrame:someAppropriateFrame];
[self.view addSubview:myHalfView];
CGRect offScreenFrame = myHalfView.bounds;
offScreenFrame.Origin = CGPointMake(0.0, CGRectGetMaxY(self.view.frame));
// Now animate the view upwards
[UIView beginAnimations:nil context:nil];
// Move the view upwards the height of your sliding view so it's entirely onscreen
myHalfView.center = CGPointMake(myHalfView.center.x, myHalfView.center.y - myHalfView.bounds.size.height);
[UIView commitAnimations];
[myHalfView release];
ボーナスポイントについては、設定することでビューをフェードインできます
myHalfView.alpha = 0.0;
uIViewアニメーションブロックの前、および設定
myHalfView.alpha = 1.0;
センタープロパティをアニメーション化した後のブロック内。
完了したら、似たようなことを行いますが、逆にビューを画面外にスライドできます。ビューが画面からスライドオフしたときに通知されるように、UIViewアニメーションブロックにanimationDidStopセレクターを追加して、ビュー階層から削除することができます。
美的観点から見ると、ビューを上にスライドさせるのは標準的な動作であるため、これを行う方法にも注意する必要があります。ビューが通常のビューのように見えても途中で止まる場合、ユーザーは(短時間でも)アプリに凍った。彼らはそれを理解しますが、注意深く処理しないと、アプリに不快感を残します。主に、ビューの上部にUINavigationControllerを含めるなどの標準的なフルスクリーンキューを使用して、ユーザーが何が起こっているのかを理解できるようにすることは避けます。ハーフシートはiPhoneのUIActionSheetsになる傾向があるため、その方向で考えます。
それはニースです、上記の受け入れられた答えはModalViewsのように感じるsubViewsを提示するためのニースハックを説明しますが、それがiPadである場合はどうでしょうか。
IPadの場合、下のビューがアンロードされるとは思いません。 (iPadでmodalViewを表示できるオプションがあり、画面全体を覆わないため)
最後のModalViewControllerはコントローラー自体であり、他のコントローラーと同様に、ルートビューを取得できます。
ModalViewのカスタムフレームは次のとおりです。
MyViewController *viewController = [[MyViewController alloc] init];
viewConroller.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:viewController animated:YES];
//superView of viewController's view is modalViewController's view, which we were after
viewController.view.superview.frame = CGRectMake(x,y,w,h);
//x y w h - can have desired values.
@dsawの回答に、モーダルビューのスーパービューが横向きモードで座標系を回転させていないように見えることを付け加えます。これが私が自分のアプリで使用したコードです:
MyViewController* modalVC = [[MyViewController alloc] init];
modalVC.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:modalVC animated:NO];
CGRect r = CGRectMake(self.view.bounds.size.width/2 - 236,
self.view.bounds.size.height/2 - 130,
472, 260);
r = [self.view convertRect:r toView:modalVC.view.superview.superview];
modalVC.view.superview.frame = r;
IPadでスーパービュー自体が回転しない場合がありますが、モーダルビューを表示した後にiPadを回転すると、正しい動作をし、モーダルビューを中央に維持するように見えます。