由于UIBarButtonItem
不子类UIView
化,因此不可能获得像它这样的正常特征frame
。
一种方法是[barButtonItem valueForKey:@"view"]
这完美地工作,并允许您将 GestureRecognizer(例如)添加到底层UIView
.
UIKit
但是,这是违反私有API 的吗?
由于UIBarButtonItem
不子类UIView
化,因此不可能获得像它这样的正常特征frame
。
一种方法是[barButtonItem valueForKey:@"view"]
这完美地工作,并允许您将 GestureRecognizer(例如)添加到底层UIView
.
UIKit
但是,这是违反私有API 的吗?
就验证后立即拒绝而言,这不是私有的,但它的私有性足以被认为是脆弱的(也就是说,新的 iOS 版本可能会破坏您在应用商店中使用该代码的现有应用)。
我可以说,类似的代码(通过 KVC 获取 UIToolbar 的 backgroundView ivar)已经通过了应用商店的验证,并且正在生产中使用。
如果可能发生坏事,您必须将方法包装在 中@try { ... } @catch
,以便拦截 KVC 可能在较新的 iOS 版本中失败。
“这不是私人的”的五个证据
这是您可以通过其他方式获得的属性。试试这个,其中一个观点实际上是有问题的_view
ivar 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 中出售,并且执行此操作。