没有箭头的UIPopoverController?

14
我想知道如何制作一个没有箭头的UIPopoverController。事实上,我想模拟类似这样的东西:Screenshot of the set-passcode screen from the iPad's System Preferences
注意到以下几点:
- 没有箭头 - 标题在UIPopoverController的扩展顶部边界内,而不是像普通UIPopoverController一样在里面。
我猜这不是真正的UIPopoverController对象,但我希望能得到如何制作相同效果的建议(使用CoreGraphics?->尤其是3D突出边框的半透明渐变效果)和/或如果有人以前做过这个的一些链接。
提前谢谢。
编辑:
我仍然在寻找这个东西,并意识到即使在第三方应用程序中也在使用。例如:Twitterrific for iPad,如下图所示。
请问是否有任何建议?将标题放在popovercontroller内只会让它更难看。 alt text
7个回答

20

以下方法对我来说很有效(包括iOS7)

 [popoverController presentPopoverFromRect:CGRectMake(0, 0, 20, 20)
                                    inView:self.view 
                  permittedArrowDirections:NULL 
                                  animated:YES];

2
+1,但对于MonoTouch,请使用uint.MinValue而不是“NULL”来删除箭头。 - William Grand

5

permittedArrowDirections属性的值设为0

[popoverController presentPopoverFromRect:YOUR_RECT
                                    inView:self.view 
                  permittedArrowDirections:0
                                  animated:YES];

4

如果没有箭头出现,我认为没有问题。就像你建议的链接一样,选项是可用的,对吧?;) 但我仍然不知道如何在弹出控制器中添加标题,就像图片中显示的那样。我尝试过UIViewController的标题属性,但没有起作用。 - nacho4d
我在这里找到了解决方案:https://dev59.com/q3E85IYBdhLWcg3wx2j2 - nacho4d

1

您可以使用UINavigationController并将UIViewControllers添加到导航控制器来添加标题。将UIViewController的“title”属性设置为使标题出现。

将箭头方向设置为NULL,如一些人建议的那样,可能会导致不可预测的行为,因为该方法使用此变量来确定如何相对于您的栏按钮项或矩形定位弹出窗口。

最好是子类化UIPopoverBackgroundView,并将各种箭头返回方法设置为返回0以获得箭头(仅适用于iOS5及以上版本)。请参见此示例以正确地子类化它:

http://blog.teamtreehouse.com/customizing-the-design-of-uipopovercontroller

简单实现示例(在此示例中,MyCustomPopoverBGView是UIPopoverBackgroundView的子类):
UIViewController *vCtrlr = [[UIViewController alloc] initWithNibName:nil bundle:nil];
vCtrlr.title = @"My Title";
self.navCtrlr = [[UINavigationController alloc] initWithRootViewController:vCtrlr];
self.popCtrlr = [[UIPopoverController alloc] initWithContentViewController:_navCtrlr];
_popCtrlr.popoverBackgroundViewClass = [MyCustomPopoverBGView class];
            [_popCtrlr presentPopoverFromRect:CGRectMake(0,
                                                         0,
                                                         320,
                                                         150)
                                       inView:self permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

1
要创建一个带标题的弹出窗口,您需要创建一个单独的视图,就像创建一个单独的窗口一样,然后将该视图加载到弹出窗口中。

1
顶部边框通过在弹出窗口和呈现的视图控制器之间放置导航控制器来产生。换句话说,弹出窗口呈现一个导航控制器,导航控制器的根视图控制器设置为您的视图控制器。这将产生标题栏,并允许您使用 [self setTitle:@"My Title"] 设置标题并添加导航按钮。

0

只需复制并粘贴以下代码

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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接