创建没有箭头并在 UIViewController 中居中的 PopOver

Posted

技术标签:

【中文标题】创建没有箭头并在 UIViewController 中居中的 PopOver【英文标题】:Create PopOver Without Arrows and Centered in UIViewController 【发布时间】:2013-03-05 21:17:38 【问题描述】:

我正在尝试在 ipad 的中心以横向显示 PopOver。我现在可以使用下面的代码执行此操作,但它没有与情节提要上链接的“popOverViewController”关联的属性。我希望它成为故事板上的视图,以便我能够对其进行处理和编辑。以及能够将其大小更改为 ipad 全视图的 50% 或 75%,并且没有箭头...

请,任何事情都会有所帮助。 *更新代码....现在可以设置大小。但是仍然没有看到“popOverViewController”的内容。

self.popOverViewController = [[PopOverViewController alloc]init];
self.popOver = [[UIPopoverController alloc]
                            initWithContentViewController:self.popOverViewController];
CGSize size = CGSizeMake(400.0,300.0);
[self.popOver setPopoverContentSize:size];
CGRect rect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 1, 1);
[self.popOver presentPopoverFromRect:rect inView:self.view permittedArrowDirections:0 animated:YES];

【问题讨论】:

您的 popOverViewController 是否正确链接为 popOver 视图的文件所有者? 【参考方案1】:

只需复制并粘贴以下代码

UIViewController *popovercontroller=[[UIViewController alloc] init];
UIView *popoverView=[[UIView alloc] initWithFrame:CGRectMake(312,390, 400, 344)];
popoverView.backgroundColor=[UIColor whiteColor];

popovercontroller.contentSizeForViewInPopover=CGSizeMake(400, 300);



UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 44, 400, 0)];
[pickerView setTintColor:[UIColor blackColor]];
[pickerView addTarget:self action:@selector(dueDateChanged:) forControlEvents:UIControlEventValueChanged];

pickerView.datePickerMode = UIDatePickerModeDate;
pickerView.hidden = NO;
NSString *bs ; //= [NSString alloc];
//    //NSDate *newDate = [NSData alloc];
bs =  CurrentSelectedDate;
if (bs.length >= 1) 
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init] ;
    //        //[dateFormatter setDateStyle:NSDateFormatterLongStyle];
    //        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    [dateFormatter setDateFormat:@"dd-MMM-yyyy"];
    // NSDate *myDate = [dateFormatter dateFromString: txtText.text];
    pickerView.date = [dateFormatter dateFromString: CurrentSelectedDate];


else

    pickerView.date = [NSDate date];

[popoverView addSubview:pickerView];



// pickerView.date = [dateFormatter dateFromString:txtText.text];
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 400, 44)];
pickerToolbar.barStyle = UIBarStyleDefault;
pickerToolbar.barTintColor=[UIColor colorWithRed:150.0f/255.0f green:91.0f/255.0f blue:129.0f/255.0f alpha:1.0f];

[pickerToolbar sizeToFit];
self.navigationController.toolbar.barTintColor = [UIColor colorWithRed:150.0f/255.0f green:91.0f/255.0f blue:129.0f/255.0f alpha:1.0f];
NSMutableArray *barItems = [[NSMutableArray alloc] init];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];
doneBtn.tintColor=[UIColor whiteColor];
[barItems addObject:doneBtn];

UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)];
 cancelBtn.tintColor=[UIColor whiteColor];
[barItems addObject:cancelBtn];

[pickerToolbar setItems:barItems animated:YES];


[popoverView addSubview:pickerToolbar];
popovercontroller.view=popoverView;

pickerViewPopup = [[UIPopoverController alloc] initWithContentViewController:popovercontroller];

[pickerViewPopup presentPopoverFromRect:CGRectMake(312, 212, 400, 344) inView:self.view permittedArrowDirections:0 animated:YES];

【讨论】:

【参考方案2】:

您看不到任何内容的原因是,通过从头开始显式重新创建您已经连接到插座的视图控制器,编译器假定您想要丢弃旧值并释放视图控制器实例IB创建。或者,如果这是一个单独的故事板或 XIB,那么正确的初始化程序将是 -initWithNibName:bundle:。只需省略/编辑第一行,假设插座连接正确,您应该会看到您在 IB 中放置的内容。

【讨论】:

这是有道理的。但是,我只在那里分配和初始化它,因为在它为 nil 之前会导致程序崩溃。我目前正在尝试 initWithNIbName,但我不确定如何在 IB 上设置 ViewController 的 nib 名称。 @DTDev 如果你说你已经连接了插座,那又是什么? 好的。我想我开始明白了……或者我离理解还远了。因此,在 IB 中,我有想要在 PopOver 中显示的视图控制器。 Main VC 在 .h 文件中有 PopOverViewController 作为 VC 自定义类。主视图在 .h 文件中也有 UIPopOverController。 UIP.O.Controller 是否应该在 PopOverViewController 的自定义 VC 类中? 其次。我没有通过按钮方式链接 PopOverViewController,但更多的是一种方法。我知道它“链接”的唯一方法是 IB 中的“自定义类”字段确实引用了自定义类。【参考方案3】:

好的。所以我就这么做了……

popOverViewController =  [self.storyboard instantiateViewControllerWithIdentifier:@"popOver"];

【讨论】:

【参考方案4】:

我刚刚完成了这个,但想在故事板中做尽可能多的事情,这会稍微改变方法:

1) 选择情节提要中的弹出框并取消勾选上/下/左/右方向以摆脱箭头。

要将它集中在屏幕覆盖上,为 segue 做准备并执行以下操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue;
    CGFloat horizontalInset = (self.view.frame.size.width - popover.popoverController.popoverContentSize.width) / (CGFloat)2.0;
    CGFloat verticalInset = (self.view.frame.size.height - popover.popoverController.popoverContentSize.height) / (CGFloat)2.0;
    popover.popoverController.popoverLayoutMargins =
        UIEdgeInsetsMake(
            verticalInset,
          horizontalInset,
            verticalInset,
          horizontalInset);

在我的例子中,我还发现 popover segue 的圆角半径与我的设计不匹配,因此我将背景颜色更改为清除以对其进行排序,即将其添加到上面的块中:

popover.popoverController.backgroundColor = [UIColor clearColor];

2) 在 segue 的目标控制器中找到属性 'Popover' 并勾选 'Use Explicit Size' 并将您希望它显示为 popover 模式的大小。

【讨论】:

【参考方案5】:

使背景颜色清晰几乎对我有用,但它弄乱了变灰的背景。直接在箭头后面的视图部分是清晰的,而背景的其余部分是灰色的。所以我把颜色改成了灰色的 alpha 的颜色。

 UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:newViewController];

 popoverController.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.15];

【讨论】:

以上是关于创建没有箭头并在 UIViewController 中居中的 PopOver的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 内的 UITableView 没有响应(Swift 3.0)

不构建视图就不能以编程方式创建 UIViewController 吗?

在 NSObject 类中设置协议并在 UIViewController 类中调用它们

Swift:通过扩展更新 UIViewController 插图

UIviewcontroller - 啥时候实例化视图属性?

以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法