首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IBAction UIViewController弹出UIViewController

使用IBAction UIViewController弹出UIViewController
EN

Stack Overflow用户
提问于 2012-12-03 00:40:53
回答 2查看 932关注 0票数 1

是否可以在iPad中弹出类似UIPopOverControlUIViewController (xib文件)?

我有一个单独的链接到UIViewController的NIB文件。我想要弹出的NIB文件与按钮按下一个自定义的大小(200,200)。

这个是可能的吗?

我正在尝试在iPhone - http://www.freeimagehosting.net/c219p上获得类似这样的东西

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-03 01:52:09

是的。在需要的时候延迟加载你的pOpOver控制器。将其视图添加为子视图(您可以对添加操作进行动画处理)。使其帧大小符合您的需要,并将已显示为pOpOver控制器的背景子视图的图像与您希望在弹出窗口中显示的其他控件一起添加。

祝好运

更新:

好的,我将向你展示如何在我的应用程序Lucid Reality Check (部署目标iOS4.3)中做到这一点。

可以使用UIPopoverController来显示另一个控制器视图。我首先要做的是确保我总是知道设备的当前方向,这样我就可以在旋转时重新定位弹出窗口(也许这在iOS6上可以自己工作?)。所以在我的基本控制器中(我想从那里显示一个弹出窗口),我有一个实例变量,如下所示:

代码语言:javascript
复制
  UIInterfaceOrientation toOrientation;

还有:

代码语言:javascript
复制
  UIPopoverController *popover;
  UIButton            *popover_from_button;
  BOOL                 representPopover;

popover_from_button将在所有弹出窗口中重复使用popover,并保持启动弹出窗口的按钮。

然后,下一段代码进入基本控制器:

代码语言:javascript
复制
- (void)popoverWillRotate {
  if ([popover isPopoverVisible]) {
      [self dismissPopover];
      representPopover = YES;
  }
}

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

每次旋转设备时都必须调用这两个方法,如下所示:

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

可以看到,首先捕获方向,然后调用popoverWillRotate。这将隐藏方向动画过程中的弹出。旋转后,必须重新显示弹出窗口,如下所示:

代码语言:javascript
复制
- (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
}

现在已经确定了方向更改,显示弹出窗口的代码如下所示:

代码语言:javascript
复制
#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];
   }
}

最后,如果希望在弹出窗口关闭时收到通知,则基本控制器必须实现一个委托方法:

代码语言:javascript
复制
#pragma mark UIPopoverControllerDelegate
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    //do something important here like drink some water
}

别忘了在标头中将基本控制器设置为UIPopoverControllerDelegate。

这样做弹出窗口的用例将如下所示:

代码语言:javascript
复制
- (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]就是这样:

代码语言:javascript
复制
+ (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
  }

享受吧!

票数 2
EN

Stack Overflow用户

发布于 2012-12-03 04:58:00

您也可以使用这些自定义类之一来显示弹出窗口:

https://github.com/sonsongithub/PopupView

https://github.com/werner77/WEPopover

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

FPPopover示例:

代码语言:javascript
复制
//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];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13671335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档