2010-11-20 3 views
29

私はモーダルビューコントローラを提示しています。重要な場合は、下からスクロールしています。どのように画面のどの部分を占有するのかを制御するにはどうすればよいですか?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]; 
} 

答えて

38

あなたは、ビューコントローラのフレームを変更することができますが、のUIViewControllerの-presentModalViewController使用している場合:これは想定して(方法あなたのモーダルビューが画面上にアニメーション終了すると、背後にあるビューがアンロードされます。アニメーションをあなたはiPhone上にいます)、あなたのバックグラウンドビューが存在するはずの白い画面が表示されます。 iOSでは、モーダルビューコントローラがフルスクリーンのビューコントローラになり、メモリを節約するためにもう一方のビューがダンプされることが前提です。

実際に画面の一部にビューを表示したい場合は、現在のUIViewControllerのビューにUIView(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]; 

を、あなたはUIViewのアニメーションブロックの前に

myHalfView.alpha = 0.0; 

を設定することにより、ビューをフェードインでき、 centerプロパティをアニメーション化した後にブロック内に

myHalfView.alpha = 1.0; 

を設定します。

この操作が完了したら、似たような操作を行うことができますが、逆の操作で画面を画面外にスライドさせることができます。 UIViewアニメーションブロックにanimationDidStopセレクタを追加して、ビューが画面外にスライドしたときに通知され、ビュー階層から削除できるようにすることができます。

ビューのスライドを上げることが標準的な動作であり、ビューが通常のビューのように見えるが途中で止まると、ユーザーは気になるはずです)は、アプリがフリーズしています。彼らはそれを理解するでしょうが、慎重に扱わなければあなたのアプリについて悪い気持ちを残します。主に、私はあなたのビューの最上部にUINavigationControllerを含むような標準的なフルスクリーンキューを使用することを避け、ユーザーが何が起こっているのかを理解するのを助けます。ハーフシートはiPhone上でUIActionSheetsになる傾向がありますので、その方向に考えてください。

+1

これは、iPadで動作するようになります。 –

+1

+1、素敵な解決策!簡単なもの:最後の行に左括弧「[」がありません。 – pille

+1

良いキャッチ、ありがとう! – atticus

26

これは、ModalViewsのように感じるsubViewsを提示するための素晴らしいハックを説明していますが、iPadの場合はどうでしょうか、スクリーン全体をカバーしないmodalViewControllerを実際に与えることができます。

iPadの場合、私は下のビューがアンロードされるとは思わない。 (スクリーン全体を覆わないiPadsのmodalViewを表示できるオプションがあるので)

最後のModalViewControllerはコントローラそのものであり、他のコントローラと同様に、プロパティを編集できるルートビューを持っています。もし私たちがそれを握ることができれば。

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. 
20

私はモーダルビューのスーパーは、ランドスケープモードでその座標系を回転させるようには見えないこと@ DSAWの答えに追加します。ここでは

はあなたにModalViewのカスタムフレームを与えるものです。ここで私は自分のアプリケーションで使用されるコードは次のとおりです。

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を回転させた場合、正しいことを行うと、中心のモーダルビューを保つように見えるんモーダルビューを示します。

+1

素晴らしいですが、そのようなビューが消えると、親ビューのどのメソッドが呼び出されますか?親のビューviewdidは例えば呼び出されません。 – user944351

+0

これは私のためにうまくいきました。私はカスタムサイズのモーダルビューで見たベストソリューションです。あまりにも悪いことに、セグーではできません(私が集める限り、私はいくつか実験しました)。 –

+0

こんにちは、私は同じことをしてViewControllerだけでうまく動作しますが、ViewControllerではナビゲーションはそうではありません。私の質問にお答えください@ http://stackoverflow.com/questions/15802633/presenting-a-view-controller-of-custom-size-with-navigation – satheeshwaran