1

iPadUIViewControllerのように (xib ファイル)をポップアップすることはできますか?UIPopOverControl

にリンクされている別の NIB ファイルがありますUIViewController。カスタマイズされたサイズ(200,200)で押されたボタンとともにそのNIBファイルをポップアップしたい。

これは可能ですか?

私はiPhoneでこのようなものを手に入れようとしています - http://www.freeimagehosting.net/c219p

4

2 に答える 2

3

次のカスタム クラスのいずれかを使用して、ポップアップを表示することもできます。

https://github.com/sonsongithub/PopupView

https://github.com/werner77/WEPopover

https://github.com/50pixels/FPPopover

FPPopover の例:

//the view controller you want to present as popover
YourViewController *controller = [[YourViewController alloc] init]; 

//our popover
FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller]; 

//the popover will be presented from the okButton view 
[popover presentPopoverFromView:okButton]; 

//release if you arent using ARC
[controller release];
于 2012-12-02T20:57:59.577 に答える
2

はい、そうです。必要な時点で pOpOver コントローラーを遅延してロードします。そのビューをサブビューとして追加します (追加をアニメーション化できます)。フレームサイズを必要なサイズにし、pOpOverコントローラーの背景サブビューとして表示した画像を、ポップアップに必要な他のコントロールとともに追加します。

幸運を

アップデート:

よし、ii は私のアプリLucid Reality Check (展開ターゲット iOS4.3) でこれを行う方法を示します。

UIPopoverController を使用して、別のコントローラー ビューを表示できます。ii が最初に行うことは、ii がデバイスの現在の向きを常に認識していることを確認することです。これにより、ii は回転時にポップアップを再配置できます (これは iOS6 で単独で動作するのでしょうか?)。したがって、私のベースコントローラー(ポップアップを表示したい場所から)には、次のようなインスタンス変数があります。

  UIInterfaceOrientation toOrientation;

また:

  UIPopoverController *popover;
  UIButton            *popover_from_button;
  BOOL                 representPopover;

popoverはすべてのポップアップで再利用され、popover_from_buttonはポップアップが開始されるボタンを保持します。

次に、次のコードがベース コントローラーに入ります。

- (void)popoverWillRotate {
  if ([popover isPopoverVisible]) {
      [self dismissPopover];
      representPopover = YES;
  }
}

- (void)popoverDidRotate {
  if (popover && representPopover) {
      representPopover = NO;
      [self representPopover];
  }
}

これら 2 つのメソッドは、次のように、デバイスが回転するたびに呼び出す必要があります。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
  //DLOG(@"willRotateTo %i", toInterfaceOrientation);
  toOrientation = toInterfaceOrientation;
      if ([Kriya isPad ]) {
          [self popoverWillRotate];
      }
}

ご覧のとおり、最初に方向がキャプチャされ、次にpopoverWillRotateが呼び出されます。これにより、向きのアニメーション中にポップオーバーが非表示になります。回転後、ポップオーバーを次のように再表示する必要があります。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
        //DLOG(@"didRotateFrom %i", fromInterfaceOrientation);
    //[self layout:toOrientation]; //do some layout if You need 
    if ([Kriya isPad]) {
        [self popoverDidRotate];
    }
}

- (void)layout:(UIInterfaceOrientation)toInterfaceOrientation {
    //one can do view layout here, and call other controllers to do their layout too
}

向きの変更が完了したので、ポップオーバーを表示するためのコードは次のようになります。

#pragma mark Popovers
- (void)presentPopoverWith:(id)controller fromButton:(UIButton*)button {
    if (popover)
       [popover release];
    if (popover_from_button)
        [popover_from_button release];
    popover_from_button = [button retain];
    popover = [[UIPopoverController alloc] initWithContentViewController:controller];
    [popover setDelegate:self];
    [self representPopover];
}

- (void)representPopover{
    if (popover) {
        UIPopoverArrowDirection arrowDirection = UIPopoverArrowDirectionAny;
        UIViewController *vc = (UIViewController*)[popover contentViewController];
        CGSize contentSize = [vc contentSizeForViewInPopover];

        if (contentSize.width > 0 && contentSize.height > 0) {
            [popover setPopoverContentSize:contentSize animated:NO];
        }
        //DLOG(@"representPopover rect:%@", [Kriya printRect:popover_from_button.frame]);
        [popover presentPopoverFromRect:CGRectOffset(popover_from_button.frame, 0, popover_from_button.frame.size.height + 7.0)  inView:self.view permittedArrowDirections:arrowDirection animated:YES];   
    }
}

- (void)dismissPopover {
    if (popover) {
        [popover dismissPopoverAnimated:YES];
   }
}

最後に、ポップオーバーが閉じられたときに通知を受け取りたい場合は、ベース コントローラーにデリゲート メソッドを実装する必要があります。

#pragma mark UIPopoverControllerDelegate
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    //do something important here like drink some water
}

ベースコントローラーをヘッダーで UIPopoverControllerDelegate にすることを忘れないでください。

ポップアップを行うこの方法の使用例は、次のようになります。

- (void)takeImage {    
    UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
    [picker setDelegate:self];
    [picker setAllowsEditing:NO];
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        [picker setSourceType:UIImagePickerControllerSourceTypeCamera];         
        if ([Kriya isPad]) {            
            [self presentPopoverWith:picker fromButton:backgroundImageButton];
        } else {
            //modals on iPhone/iPod
            //DLOG(@"takeImage addSubview picker");
            [self presentModalViewController:picker animated:YES];
        }
    } else {
        //DLOG(@"no camera");
    }
}

これは、ポップアップのコンテンツとして画像ピッカーを使用しますが、有効なビューを持つ任意のコントローラーを使用できます。これを行うだけです:

[self presentPopoverWith:popupsContentController fromButton:tappedButton];

不足している情報があってはなりません:)、方法[Kriya isPad]は次のとおりです。

+ (BOOL)isPad {
  #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
    // iPad capable OS
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
            //this is an iPad
            return YES;
        }else {
            //this is an iPod/iPhone
            return NO;
        }
  #else
      //can not pissible be iPad
          return NO;
  #endif
  }

楽しい!

于 2012-12-02T17:52:09.273 に答える