Xcode:如何创建出现在另一个视图控制器中的弹出视图控制器

Posted

技术标签:

【中文标题】Xcode:如何创建出现在另一个视图控制器中的弹出视图控制器【英文标题】:Xcode: How To Create A PopUp View Controller That Appears In Another View Controller 【发布时间】:2011-09-14 04:50:06 【问题描述】:

基本上我想做的是,假设我有一个视图控制器,称为 V1,它内部有一个常规视图和一个按钮。现在,当您点击该按钮时,我希望该按钮创建一个在同一个视图控制器 V1 中弹出另一个视图控制器(称为 V2)的操作。

V2 会缩小一些,使其不会填满整个屏幕,但您仍然可以看到 V2 后面的 V1 的第一层。所以基本上,你永远不会真正离开 V1。我希望这对我正在尝试做的事情有意义。我知道 MTV 应用程序有这个功能。我正在谈论的图像在这里:https://docs.google.com/leaf?id=0BzlCAVXRsIPcNWUxODM2MDAtNDE3OS00ZTc4LTk5N2MtZDA3NjFlM2IzNmZk&hl=en_US

示例代码或示例也是我正在寻找的。​​strong>

谢谢

【问题讨论】:

【参考方案1】:

您可以通过设置适当的属性类型modalPresentationStyle 来创建此类视图。请参阅下面的示例:

UIViewController *V2 = [[UIViewController alloc] init];
V2.modalPresentationStyle = UIModalPresentationFormSheet;
V2.modalTransitionStyle = UIModalTransitionStyleCoverVertical;     
[V1 presentViewController:V2 animated:YES completion:nil];
V2.view.superview.frame = CGRectMake(0, 0, 540, 620); //it's important to do this after presentModalViewController
V2.view.superview.center = V1.view.center;
[V1 release];

【讨论】:

@ChaseRoberts 它只能在 iPad 上运行。在 iPhone 上只需设置 modalPresentationStylemodalTransitionStyle 属性,不要更改其他值。 @Peter ios SDK 中没有这个功能。 @Nekto 非常老的线程谢谢!!!但帮了我很多,我忘记了 superview n 它救了我:) 这在 iOS 8+ 上对我不起作用。现在有一种不用设置 view.superview.frame 就可以做到这一点的不那么老套的方法。请参阅下面的答案。【参考方案2】:

试试这个:

V2 *d = [[V2 alloc]initWithNibName:@"V2" bundle:nil];//assuming V2 is name of your nib as well
d.delegate = self; //Optional:you only need this if you want to delegate

 //create popover and put V2 in the popover view
UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:d]; 
popoverController.delegate = self;  //optional
CGSize size = CGSizeMake(325, 75); // size of view in popover…V2
popoverController.popoverContentSize = size;
[d release];
[popoverController presentPopoverFromRect:yourButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

【讨论】:

我遇到了同样的问题,当我尝试这段代码时,它抛出了一个异常 - “[UIPopoverController initWithContentViewController:] 在 UIUserInterfaceIdiomPad 下未运行时被调用。” 此代码仅适用于 iPad 而不是 iPhone,因为在 iPhone 中没有名为UIPopoverController的类【参考方案3】:

如果您想在 iOS 8 中将其呈现为模式弹出窗口,其样式与 OP 的屏幕截图类似,我就是这样做的:

UIViewController *V2 = [[UIViewController alloc] init];  // V2 is the popup
V2.modalPresentationStyle = UIModalPresentationFormSheet;
V2.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
V2.preferredContentSize = CGSizeMake(325, 75); // size of popup view
[V1 presentModalViewController:V2 animated:YES]; // V1 is the current topmost view controller

我比使用 UIPopover 更喜欢这个,因为你不需要弄乱箭头方向,而且用户不能通过在弹出窗口之外点击来关闭它。

这些属性也可以通过设计器在故事板/笔尖中设置。要设置首选内容大小,请选中“使用首选显式大小”并设置值。

这仅适用于 iPad。

【讨论】:

【参考方案4】:

有一个非常好的库可以在 iPhone 上将视图控制器显示为 Popup 看这里https://github.com/martinjuhasz/MJPopupViewController

【讨论】:

好东西。也很实用。我一直在寻找完全一样的东西。感谢您的链接【参考方案5】:

如果您使用 Storyboard,则可以按照以下步骤操作:

    添加视图控制器 (V2),按照您想要的方式设置 UI

*基于您附加的图片

添加 UIView - 将背景设置为黑色,不透明度设置为 0.5 添加一个 UIImageView - 它将作为您的弹出窗口(请注意图像和视图不能具有相同的级别/层次结构。不要将图像视图作为视图的子视图,否则 uiview 的不透明度会影响uiImageView)

    以模态方式呈现 V2

    单击转场。在属性检查器中,将 Presentation 设置为 Over Full Screen。如果喜欢,请删除动画

    选择 V2。在属性检查器中,将 Presentation 设置为 Over Full Screen。检查定义上下文并提供上下文

    选择您的 V2 的 MainView(请检查图像)。将 backgroundColor 设置为 清除颜色

【讨论】:

【参考方案6】:

file .m --->这是实现文件

-(IBAction)anyAlert:(id)sender

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"A Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK!", @"Other Title", nil];
    [alert show];
    [alert release];

记得声明

-(IBAction)anyAlert:(id)sender; 

file .h ---> 头文件中

它对我有用,希望对你有用...

【讨论】:

这已被弃用,我不建议使用警报作为模态的替代品。【参考方案7】:

v2 创建UIView 并添加v1

- (void)viewDidLoad

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self 
                   action:@selector(aMethod:)
         forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Show View" forState:UIControlStateNormal];
        button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    [self.view addSubview:button];


- (void)aMethod:(id)sender 

    CGRect * imageFrame = CGRectMake(10, 90, 300, 300);
    V2 *v2 = [[V2 alloc] initWithFrame:imageFrame];
    [self.view addSubview:v2];

【讨论】:

以上是关于Xcode:如何创建出现在另一个视图控制器中的弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 MasterView 触发 DetailView 中的弹出窗口

在表格视图中选择项目后无法关闭弹出框

XCode5 中 UITableviewCell 的弹出视图

如何在 Swift iOS 中创建一个通用的弹出视图控制器

如何将参数传递给导航控制器内的弹出视图控制器

类似于 iMessage 的拆分视图控制器中的弹出视图控制器?