呈现弹出窗口时,UIBarButtonItem 不会变灰

UIBarButtonItem doesn't turn gray when presenting popover

据我了解,对于 iOS 7、8 和 9,当您在应用程序中显示弹出窗口时,UIToolbar 中的所有 UIBarButtonItem 应该会自动变灰。

然而,大多数时候我得到的是只有你点击的按钮变成灰色,而其他按钮保持原来的颜色。

我构建了一个简单的测试应用程序,其中包含一个故事板:

在代码中,对于呈现弹出窗口的 UIViewController,我只有这个:

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "ShowPopover" {
            let popoverViewController = segue.destinationViewController
            popoverViewController.preferredContentSize = CGSizeMake(320.0, 224.0)

            if let popoverController = popoverViewController.popoverPresentationController {

                // set the delegate, so adaptivePresentationStyleForPresentationController is called
                popoverController.delegate = self
            }
        }
    }


    // MARK: - UIAdaptivePresentationControllerDelegate

    // return .None to show as a popover on iPhone too
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .None
    }
}

即使是这个简单的例子,当我点击其中一个按钮来显示弹出窗口时,只有点击的按钮变成灰色。

我是否误解了 UIBarButtonItems 在出现弹出窗口时的行为方式?或者这是一个已知的 iOS SDK 错误?有什么解决方法吗?

更新: 我在此处发布了一个演示问题的示例应用程序,使用 iOS 8.4 SDK: https://dl.dropboxusercontent.com/u/2349787/BarButtonPopover.zip

The buttons should all be gray when the popover appears (at least on a white/light gray toolbar) - as far as I can tell it's a tintColor change.

很难说 应该 是什么。查看 iPad 上的 Mail。它具有与您的应用程序所展示的完全相同的行为:按下图标并且所有其他 bars 变暗。虽然我不同意这看起来不错,但这显然是 Apple 想要的。

I've also tried changing the UIViewTintAdjustmentMode of the toolbar to .Dimmed when the popover is presented, but that doesn't help either.

我也有同样的想法。我调动 -setTintAdjustmentMode: 以了解 Apple 在幕后做了什么,这似乎是一些非常疯狂的事情。他们 强制 通过将色调调整模式设置为正常而不是自动来对栏中的其余按钮进行着色。因此,将栏本身设置为暗色不会显示任何效果,因为按钮不会继承色调调整模式。

我会坚持现状。也许 Apple 会在未来的版本中改变行为——你将永远是最新的。如果您真的希望所有按钮都变暗,您应该遍历栏的所有子视图并将它们的 tintAdjustmentMode 设置为自动。但是,我还没有想出什么时候这样做,因为 Apple 没有提供合适的钩子。您将需要在某些挂钩上做一些 -performSelector:afterDelay:0.0(这只是突出了它的骇人听闻程度)。程序解雇甚至根本不提供任何挂钩。此外,Apple 似乎会在轮换时重新配置 tintAdjustmentModes...在我看来,要考虑的事情太多,值得花时间。