9

由于UIBarButtonItem不子类UIView化,因此不可能获得像它这样的正常特征frame

一种方法是[barButtonItem valueForKey:@"view"]

这完美地工作,并允许您将 GestureRecognizer(例如)添加到底层UIView.

UIKit但是,这是违反私有API 的吗?

4

2 回答 2

17

就验证后立即拒绝而言,这不是私有的,但它的私有性足以被认为是脆弱的(也就是说,新的 iOS 版本可能会破坏您在应用商店中使用该代码的现有应用)。

我可以说,类似的代码(通过 KVC 获取 UIToolbar 的 backgroundView ivar)已经通过了应用商店的验证,并且正在生产中使用。

如果可能发生坏事,您必须将方法包装在 中@try { ... } @catch,以便拦截 KVC 可能在较新的 iOS 版本中失败。

于 2012-08-12T16:37:41.753 回答
9

“这不是私人的”的五个证据

  • 这是您可以通过其他方式获得的属性。试试这个,其中一个观点实际上是有问题的_viewivar UIBarButtonItem。这表明访问UIView它本身并没有被禁止,尽管 KVO 方式可能是有问题的(但我对此表示怀疑)。

      NSArray *array = self.toolBar.subviews;
      for (UIView *view in array) {
          view.backgroundColor = UIColor.greenColor;
      }
    
  • 它们实际上触发了该属性的 KVO。ivars 不必触发 KVO API,对吧?

  • @Farcaller 提到了一个在 App Store 中出售的类似案例。由于他/她在问题出现后的前 20 分钟内回答了问题,因此可以合理(但不安全!)假设 App Store 中可能有数千个应用程序执行此操作。

  • 每次按下按钮时,此 UIView 都会被替换掉,因此您不能仅在其上设置一个手势识别器并完成。但是,您可以在每次view更换手势识别器时继续设置相同的手势识别器。对我来说,这实际上更多地证明了它不是私有 API,而是在使用它时必须非常小心(并使用 KVO 确保您拥有最新的 API)。

  • 我的应用程序在 App Store 中出售,并且执行此操作。

于 2012-08-12T17:58:41.843 回答