代码之家  ›  专栏  ›  技术社区  ›  DTDev

在UIViewController中创建不带箭头且居中的PopOver

  •  5
  • DTDev  · 技术社区  · 11 年前

    我正试图在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];
    
    5 回复  |  直到 11 年前
        1
  •  1
  •   Baljeet Singh    10 年前

    只需复制&粘贴以下代码

    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
  •  0
  •   CodaFi Alexey Nakhimov    11 年前

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

        3
  •  0
  •   DTDev    11 年前

    好吧所以我这么做了。。。

    popOverViewController =  [self.storyboard instantiateViewControllerWithIdentifier:@"popOver"];
    
        4
  •  0
  •   Oly Dungey    10 年前

    我一直在努力解决这个问题,但我想在故事板中尽可能多地做一些事情,这会稍微改变方法:

    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
  •  0
  •   Andrew McKinley    10 年前

    把背景颜色弄清楚对我来说几乎奏效了,但它把灰色的背景搞砸了。视图中箭头正后方的部分是清晰的,背景的其余部分是灰色的。所以我把颜色改成了灰色阿尔法的颜色。

     UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:newViewController];
    
     popoverController.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.15];