在 Interface Builder 中为 Iphone 创建弹出视图控制器
Posted
技术标签:
【中文标题】在 Interface Builder 中为 Iphone 创建弹出视图控制器【英文标题】:Creating popover view controllers for Iphone in Interface Builder 【发布时间】:2013-03-28 14:57:38 【问题描述】:我该怎么做呢?我知道我必须给 popover 一个视图控制器,它从中构造它的视图,但我不知道如何在 Interface Builder 中构造这个视图(比如添加标签和按钮等等)。
我是否只是在普通情节提要中进行,并且有一个随机不与其他任何东西连接的情节提要,坐在角落里?
我要创建另一个故事板吗?
即使我的项目都是故事板,我是否创建 xib?
我是否以编程方式创建它?
【问题讨论】:
它会从您的应用中的多个地方呈现,还是仅从一个地方呈现? 【参考方案1】:由于您在问题中没有指定目标设备,所以我给了您 Ipad 答案
IPAD:
转到您的故事板拖放viewcontroller
或tableviewcontroller
由您决定。然后在情节提要上创建一个从所需的viewcontroller
到新拖放的viewcontroller
的segue。选择你的segue为popOver
。
确保您在 segue 设置中选择一个锚点,如上图。然后你需要编辑你的 popover 的大小。如果是uiviewcontroller
选择它的视图,如果它是tableviewcontroller
在界面生成器的左侧选择它的tableview 并编辑它的大小。
第一:
第二:
之后自定义您的弹出视图控制器(拖放视图控制器)添加按钮,标记任何您想要的。
如果您要在弹出窗口中执行其他操作: 不要忘记创建新文件 -> uiviewcontroller 或 uitableviewcontroller 的子类。然后将它与故事板上新创建的视图控制器相关联。
IPHONE:
iphone中没有Popover控制器
但您尝试使用第三方https://github.com/50pixels/FPPopover 解决方案,该解决方案通过使用QuartzCore
来模仿iphone 中的弹出框行为
我会尝试以下:
第一:
再次将uiviewcontoller
拖放到情节提要中,然后创建一个新文件-> uiviewcontroller
的子类。
这个新的uiviewcontroller
将位于您故事板的角落
然后将情节提要中的 uiviewcontroller 与 new Created file 相关联,假设您使用 YourViewController
创建了一个新文件名。给你的视图一个故事板ID并选择它的类名。
-(IBAction)buttonClicked:(UIButton*)okButton
//the view controller you want to present as popover
YourViewController *controller = [[YourViewController alloc] init];
//if [[YourViewController alloc] init]; doesn't work try this
// UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
//YourViewController *controller = [sb instantiateViewControllerWithIdentifier:@"YourViewController"];
//our popover
FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller];
//the popover will be presented from the okButton view
[popover presentPopoverFromView:okButton];
//no release (ARC enable)
//[controller release];
注意:我之前没有使用过 FPPopover,所以不知道如何安排屏幕大小,但必须在他们的文档中有进一步的解释,只是阅读它。
【讨论】:
太好了,谢谢。但是,如果我使用 FPPopover 库(iPad 弹出框的 iPhone 端口),它只需要弹出框的视图,我可以创建一个普通的 segue 吗?如果您不知道,我完全理解,我误以为两者都是一样的(大多数事情似乎都是)。 @DougSmith 是的,不是 ipad 和 iphone 的一切都是一样的,所以不,你不能在 Iphone Storyboard 中创建一个弹出框。当您尝试在 iphone (push,modal) 中执行 segue 时,segue 将替换当前视图,因此它不起作用。如果您尝试自定义 segue,您可能可以实现它,但我对此表示怀疑。所以你不能用 segue for Iphone 来做,我会试着编辑我的答案并为你提供一个可能的解决方案。 @DougSmith 试试我的 iphone 答案,但不确定它是否会起作用。 @SpaceDust 嗨,我已经完成了弹出视图。问题是我在弹出视图中有一个按钮。当我按下该按钮时,弹出视图应该被关闭。我尝试了一天,但找不到解决方案。你的任何想法都会对我很有帮助。非常感谢。 @Vino 在你的按钮方法中调用[self dismissViewControllerAnimated:YES completion:NULL];
如果这不起作用发布一个问题,我相信如果你显示你的代码人们会回答它【参考方案2】:
iPhone 解决方案
由于 ios 8.0 也可以为 iPhone 应用程序实现这一点!
目标视图控制器(应该出现在弹出框中的那个)需要符合“UIPopoverPresentationControllerDelegate”协议并且必须实现消息“adaptivePresentationStyleForPresentationController:traitCollection:强>'。除此之外,它的 'modalPresentationStyle' 应该是 'UIModalPresentationPopover' 并且控制器应该是他自己的 'UIPopoverPresentationController' 委托。
以这种方式准备好视图控制器后,只需从您的 UINavigationBarItem(或其他任何东西)到目标视图控制器创建一个故事板 segue(类型:'Present As Popover')。
实施:
@implementation TestViewController
/*
initWithCoder:
*/
- (instancetype)initWithCoder:(NSCoder *)pDecoder
//FLog;
if (self = [super initWithCoder:pDecoder])
self.modalPresentationStyle = UIModalPresentationPopover;
self.popoverPresentationController.delegate = self;
return self;
#pragma mark - POPOVER PRESENTATION CONTROLLER DELEGATE
/*
adaptivePresentationStyleForPresentationController:traitCollection:
*/
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)pController
traitCollection:(UITraitCollection *)pTraitCollection
//FLog;
return UIModalPresentationNone;
// ...
@end
当然委托协议也可以在其他类中实现,但这种方式是最简单的:-)
【讨论】:
【参考方案3】:我认为 iPhone 设备的更好方法是创建一个 View Controller,其 View 的背景颜色设置为清除。然后在这个视图中,您只需添加一个较小尺寸的视图,它会呈现一个弹出窗口的外观。
呈现这个视图控制器将给出一个弹出窗口的外观。这是我采取的方法。如果用户点击父视图上超出小视图边界的区域,您可以关闭视图控制器。
【讨论】:
以上是关于在 Interface Builder 中为 Iphone 创建弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在Interface Builder中为Auto Layout Constraints添加标识符?
Interface Builder 中的 AutoLayout 和 UITableViewCell 原型
使用 Interface Builder 构建的自定义 UIView 可通过 Interface Builder 访问/定位