web-dev-qa-db-ja.com

iOS-モーダルビューコントローラーのサイズをどのように制御しますか?

モーダルビューコントローラーを提示しています。問題がある場合は、下から上にスクロールしています。画面のどの部分を占有するかをどのように制御できますか?

編集:モーダルビューコントローラーに次のものが含まれています。それは役に立たない。

- (void)viewDidLoad {
    TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest];
    self.view = trv;
    trv.frame = CGRectMake(0, 320, 320, 160);
    [trv release];
    [super viewDidLoad];
}
30

ビューコントローラーのフレームを変更できますが、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になる傾向があるため、その方向で考えます。

38
atticus

それはニースです、上記の受け入れられた答えは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.
26
dsaw

@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を回転すると、正しい動作をし、モーダルビューを中央に維持するように見えます。

20
bugloaf