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 上只需设置modalPresentationStyle
和 modalTransitionStyle
属性,不要更改其他值。
@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 中的弹出窗口