11

それほど複雑であってはならないことをしようとしていますが、わかりません。UITableView を表示する UIViewController があります。ユーザーが行を押したときにコンテキスト メニューを表示したい。これを、ラベルとボタンを使用した半透明のビューにしたいと考えています。AlertView を使用することもできますが、ラベルとボタンのフォーマットを完全に制御したいので、Interface Builder を使用したいと考えています。

そこで、250x290 の小さなビューを作成し、アルファを .75 に設定し、さまざまなユーザー イベントを処理するアウトレットを備えたビュー コントローラーを作成しました。

では、紹介したいと思います。presentModalViewController を使用すると、2 つの (望ましくない) ことが起こります。1) ビューが画面全体 (ただし、ステータス バー) をカバーします。2)半透明ですが、「背後」にあるのは親ビューではなく、アプリケーションのルートビューです。

サブビューとして追加しようとしましたが、何も起こらないので、正しいことをしていません:

RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];

私がやりたいことをすることは可能ですか?前もって感謝します。

ゴンソウ

4

5 に答える 5

11

私は似たようなものをコーディングしています。私のアプローチには....が含まれます。

  1. dismissModalViewControllerAnimatedおよびpresentModalViewController:animatedを使用していません。

  2. IBでカスタマイズされたフルサイズのビューを設計します。viewDidLoadメッセージ本文で、背景色をclearColorに設定して、コントローラーでカバーされていないビューのスペースが透明になるようにします。

  3. フローティングビューのコントローラーの下にUIImageViewを配置しました。UIImageViewには、角が丸く、背景が透明に設定されているフォトショップ画像が含まれています。この画像ビューはコンテナとして機能します。

  4. CoreAnimationを使用して、モーダルビュースタイルでフローティングビューを表示/非表示にします:(FloatingViewController.m)

    -  (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.view setBackgroundColor:[UIColor clearColor]];
    
        [UIView beginAnimations:nil context:nil];
        [self.view setFrame:CGRectMake(0, 480, 320, 480)];
    
        [UIView setAnimationDuration:0.75f];
        [self.view setFrame:CGRectMake(0, 0, 320, 480)];
        [UIView commitAnimations];
    }
    
于 2009-06-14T22:58:21.590 に答える
3

ワンギイ

それは私が見つけた解決策のほとんどです。loadNibNamedを使用してビューをロードしてから、次のようにaddSubViewを使用してビューを追加します。

//Show a view on top of current view with a wait indicator. This prevents all user interactions.
-(void) showWaitView{
    NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"WaitView" owner:self options:nil];
#ifdef __IPHONE_2_1
    waitView = [ nibViews objectAtIndex: 0];
#else
    waitView = [ nibViews objectAtIndex: 1];
#endif          
    CGFloat x = self.view.center.x - (waitView.frame.size.width / 2);
    CGFloat y = self.view.center.y - (waitView.frame.size.height / 2);
    [waitView setFrame:CGRectMake(x,y,waitView.bounds.size.width,waitView.bounds.size.height)];
    [self.view addSubview:waitView];    
}

ポイント3と4について詳しく教えてください。

ビューに丸い長方形のアスペクトを与えるために私がしたことは、丸い長方形のボタンの中にそれを置くことです。

このコードを使用すると、実際には小さなフローティングビューを作成できますが、ビューが親よりも小さい場合、ユーザーは親の表示部分を操作できます。

最終的には同じサイズでビューを作成しますが、念のためコードを保持します。

ゴンソ

于 2009-06-16T12:42:08.343 に答える
2

サブビューをオーバーレイするのではなく、ナビゲーションコントローラーを使用してサブビューをスライドさせることを強く検討します。これは予想されるモデルであり、独自の方法でそれを行うことで得られると思われる小さな利点は、(最小の) 驚きの原則によって大幅に相殺されます。

本当にこの方法で行う必要がある場合は、最初のテーブル ビューをビュー コントローラーが保持する透過的な「保持」ビューのサブビューとして追加するのがコツだと思います。次に、新しいサブビューをその別のサブビューとして追加します。

于 2009-05-27T12:11:27.423 に答える
1

私がしたことは、アプリ デリゲートの UINavigation コントローラーの上に UIViewController を作成し、便宜上それをシングルトン オブジェクトのプロパティにしたことです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

//--- create root navigation controller
self.window.rootViewController = self.navigationController;

//--- create view controller for popups:
popupViewController = [[BaseViewController alloc] init];
popupViewController.view.backgroundColor = [UIColor clearColor];
popupViewController.view.hidden = true; //for rendering optimisation
[self.window addSubview:popupViewController.view];
[AppState sharedInstance].popupViewController = self.popupViewController;

//--- make all visible:
[self.window makeKeyAndVisible];

return YES;

}

アプリの任意の時点で、たとえば呼び出すことができます

MyViewController * myVC = [[UIViewController alloc] init];
//... set up viewcontroller and its view...
// add the view of the created view controller to the popup view:
[AppState sharedInstance].popupViewController.view.hidden = false;
[[AppState sharedInstance].popupViewController.view addSubview:myVC.view];

上部で使用される BaseViewController は、UIViewController から継承され、フルスクリーン ビューをセットアップします。

//----- in BaseViewController implementation
- (void)loadView {
   //------- create root view:
   CGRect frame = [[AppState sharedInstance] getScreenFrame]; 
   rootView = [[VCView alloc] initWithFrame:frame];
   rootView.backgroundColor = [UIColor whiteColor];
   self.view = rootView;
}
于 2011-08-03T10:16:39.087 に答える