30

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

編集:モーダルビューコントローラーには次のものがあります。それは役に立ちません。

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

3 に答える 3

38

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

于 2010-11-20T04:03:22.197 に答える
26

それは素晴らしいです、上記の受け入れられた答えは、ModalViewsのように感じるサブビューを提示するための素晴らしいハックを説明していますが、それがiPadの場合はどうでしょうか、そして私は実際に画面全体をカバーしないmodalViewControllerを与えることができます。

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.
于 2011-07-15T10:16:06.270 に答える
20

@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 を回転させると、モーダル ビューが中央に配置されたままになるようです。

于 2011-11-15T21:30:19.363 に答える