将 UIBarButtonItem 与图像或系统预设一起用于 SplitView/Popover 控件

Posted

技术标签:

【中文标题】将 UIBarButtonItem 与图像或系统预设一起用于 SplitView/Popover 控件【英文标题】:Using a UIBarButtonItem with an image or system preset for SplitView/Popover control 【发布时间】:2012-08-03 21:00:25 【问题描述】:

我目前正在为 iPad 优化一个应用程序,并希望使用带有图像的 UIBarButtonItem 来呈现弹出框。如果我使用带有标题的按钮,我目前拥有的代码效果很好,但我更喜欢使用我自己的图像或 UIBarButtonSystemItem 提供的图像之一。如果我根本不设置按钮的标题,它根本不会出现。如果我设置标题和图像,我会在真实硬件上获得标题,但图像会显示在模拟器上。使用 UIBarButtonSystemItem,我得到了我想要的按钮,但它也以横向模式出现(它不应该这样做,因为我使用的是横向分割视图)。

使用 setImage、setTitle 的任意组合或将按钮初始化为系统预设均无效。当检测到横向旋转但仍保留在屏幕上时,我还尝试将系统预设的按钮设置为 nil。我不确定如何从这里开始,但我真的很想避免对这个按钮使用字符串,而且我很想知道为什么会这样。

代码如下:

#pragma mark Split view handling
-(void)splitViewController:(UISplitViewController *)svc 
    willHideViewController:(UIViewController *)aViewController 
         withBarButtonItem:(UIBarButtonItem *)barButtonItem 
      forPopoverController:(UIPopoverController *)pc

    //If this bar button item doesn't have a title, it won't appear at all.
    [barButtonItem setTitle:@"-"];
    //barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize target:[barButtonItem target] action:[barButtonItem action]];
    [barButtonItem setImage:[UIImage imageNamed:@"listing.png"]];

    //Take this bar button item and put it on the left side of our nav item
    [[self navigationItem] setLeftBarButtonItem:barButtonItem];
    self.popoverController = pc;


-(void)splitViewController:(UISplitViewController *)svc 
    willShowViewController:(UIViewController *)aViewController 
 invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

    //Remove the bar button item from our navigation item.
    //We'll double check that it's the correct button, even though we know it is.
    if(barButtonItem == [[self navigationItem] leftBarButtonItem])
        [[self navigationItem] setLeftBarButtonItem:nil];
    
    self.popoverController = nil;


更新:

我将此添加到我的 viewDidLoad:

customButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"listing.PNG"]]];
customButtonItem.style = UIBarButtonItemStyleBordered;

并将 willHideViewController 更新为:

-(void)splitViewController:(UISplitViewController *)svc 
    willHideViewController:(UIViewController *)aViewController 
         withBarButtonItem:(UIBarButtonItem *)barButtonItem 
      forPopoverController:(UIPopoverController *)pc

    //If this bar button item doesn't have a title, it won't appear at all
    customButtonItem.target = barButtonItem.target;
    customButtonItem.action = barButtonItem.action;
    barButtonItem = customButtonItem;
    [barButtonItem setTitle:@""];

    //barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize target:[barButtonItem target] action:[barButtonItem action]];
    //[barButtonItem setImage:[UIImage imageNamed:@"listing.png"]];

    //Take this bar button item and put it on the left side of our nav item
    [[self navigationItem] setLeftBarButtonItem:barButtonItem];
    self.popoverController = pc;

这导致图像在我想要的时间/位置显示,但按钮没有边框(尽管我将其设置为)并且不显示弹出框。

【问题讨论】:

【参考方案1】:

编辑:我错过了这是 splitView 委托,而您正在从 ios 接收 UIBarButtonItem。所以我建议你尝试以下方法。

创建您自己的buttonItem,并从系统提供的目标和选择器中复制目标和选择器。像这样创建新的按钮项:

UIBarButtonItem *newBut = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleBordered target: barButtonItem.target action: barButtonItem.action];
[[self navigationItem] setLeftBarButtonItem:newBut];

【讨论】:

我试过这个,但我不确定我做得是否正确。您介意检查我对原始帖子的更新吗? 再次检查您是否在按钮上设置了目标和操作(记录它)。使用 customView 可能无法使用带边框的样式 - 我记得读过它,但现在找不到源代码。 目标和动作在应用启动时显示为空,但在设备旋转后设置。尽管已设置,但点击图像时没有任何反应。 太棒了。谢谢!最后一个障碍是确保在 willHideViewController 中初始化新按钮,但这成功了。

以上是关于将 UIBarButtonItem 与图像或系统预设一起用于 SplitView/Popover 控件的主要内容,如果未能解决你的问题,请参考以下文章

UIBarButtonItem 图像未显示,但显示为红色方块

如何以编程方式将自定义图像设置为 UIBarButtonItem

如何将配置文件图像放置在目标 c 中圆角的 uibarbuttonitem 上?

将 UiBarButtonItem 上的 UIImage 从标识符更新为图像

AngularJS:如何在页面完全加载之前显示预加载或加载?

UIBarButtonItem 图像应该有多大?