是否可以在iPad中弹出UIViewController
(xib文件),如UIPopOverControl
?
我有一个单独的NIB文件,该文件链接到UIViewController
。我想弹出那个NIB文件以及用自定义尺寸(200,200)按下的按钮。
这可能吗?
我想在iPhone上获得类似的内容 - http://www.freeimagehosting.net/c219p
答案 0 :(得分:3)
您还可以使用其中一个自定义clases来显示弹出窗口:
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];
答案 1 :(得分:2)
更新:
好的,ii将向我们展示如何在我的应用Lucid Reality Check(部署目标iOS4.3)中执行此操作。
可以使用UIPopoverController来呈现另一个控制器视图。我首先要做的是确保ii始终知道设备的当前方向,因此ii可以在旋转时重新定位弹出窗口(也许这在iOS6上可以自行工作?)。所以在我的基本控制器中(从哪里想要显示弹出窗口)ii有一个像这样的实例变量:
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];
}
}
每次旋转设备时都必须调用这两种方法,如下所示:
- (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
}
享受!