【问题标题】:How can I show a back arrow in the master-view popover button for UISplitViewController in iOS 7?如何在 iOS 7 中的 UISplitViewController 的主视图弹出按钮中显示后退箭头?
【发布时间】:2013-11-25 06:26:50
【问题描述】:

在我的详细 VC 中,我正在实现这个 UISplitViewController 委托方法:

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

然后我很容易设置按钮的标题,但结果只是一个带有纯文本的按钮,没有返回箭头。我正在寻找类似邮件应用程序的东西,其中主弹出按钮也有后 V 形。

我该怎么做?

【问题讨论】:

    标签: ios objective-c ipad uinavigationcontroller uisplitviewcontroller


    【解决方案1】:

    使用 V 形图像创建您的自定义条形按钮项,根据需要进行设置,并将条形按钮项的目标和操作设置为委托回调传递的目标和操作。这样,您的条形按钮将执行与系统传递给您的操作相同的操作。您必须使用图像创建自己的条形按钮,因为 AppStore 批准的 API 无法创建返回条形按钮。

    在 iOS7 中,私有子类是UINavigationItemView + _UINavigationBarBackIndicatorView。一个是按钮,另一个是人字形。 _UINavigationBarBackIndicatorViewUIImageView 的子类。所以它非常接近您将实现的目标。

    【讨论】:

    • 有趣。那么你认为 Mail 应用在他们的后退按钮中使用了图片吗?
    • 邮件应用程序可以访问您没有的 API。 Apple 通常将私有子类用于后栏按钮。在邮件应用程序中,他们很可能使用这些,而不是伪造它。
    • 我查过了。在 iOS7 中,私有子类是UINavigationItemView + _UINavigationBarBackIndicatorView。一个是按钮,另一个是人字形。 _UINavigationBarBackIndicatorViewUIImageView 的子类。所以它非常接近您将实现的目标。
    【解决方案2】:

    在 iOS 8 中,UISplitViewController 有一个方法:

    - (UIBarButtonItem *)displayModeButtonItem
    

    如果您将返回的栏按钮项设置为导航栏(UINavigationBar)的左按钮,它将为您显示人字形。

    另一方面,如果将返回的条形按钮项放入工具栏(UIToolbar)中,则不会显示人字形。

    对于我想要显示 V 形后退按钮的地方,但还需要显示几个我自己的栏按钮项目(如 iPad 上的邮件应用程序),我必须使用 UINavigationBar 和 UIToolbar。这是一个丑陋的解决方案,但我必须将 UINavigationBar 部分覆盖在 UIToolbar 的顶部,以便获得一个后退按钮 V 形以及我自己的几个条形按钮项。

    【讨论】:

      【解决方案3】:

      如 Leo 所说,要访问 Apple 使用的默认后退按钮图像,箭头是 _UINavigationBarBackIndicatorView 类型的类。将此图像设置为后退栏按钮,您就可以开始了。

      下面是破解,

              UIImage *imgViewBack ;
      
              for (UIView *view in self.navigationController.navigationBar.subviews) {
                  // The arrow is a class of type _UINavigationBarBackIndicatorView. This is not any of the private methods, so I think
                  // this is fine for the AppStore...
                  if ([NSStringFromClass([view class]) isEqualToString:@"_UINavigationBarBackIndicatorView"]) {
                      // Set the image from the Default BackBtn Imageview
                      UIImageView *imgView = (UIImageView *) view;
                      if(imgView){
                          imgViewBack = imgView.image ;
                      }
                  }
              }
      

      这是基于 Ryan Henning 的回答。

      可以从详细视图控制器显示代表主视图的后退按钮。 UISplitview 控制器没有为此提供本机方法,但它返回一个条形按钮对象,我们可以直接将其指定为导航控制器条形按钮。很明显,细节视图控制器应该在导航控制器中才能工作。

         self.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-25
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多