由于UIBarButtonItem
不是UIView
的子类,因此无法像frame
那样获得正常的特征。
执行此操作的一种方法是[barButtonItem valueForKey:@"view"]
这非常有效,并且允许您将GestureRecognizer(例如)添加到基础UIView
。
但是,这是私有的UIKit
API违规吗?
答案 0 :(得分:14)
在验证时立即拒绝这不是私密的,但它足够私密,被认为是脆弱的(也就是说,新的iOS版本可能会破坏使用该代码的应用商店中的现有应用。)
我可以说,类似的代码(通过KVC获取UIToolbar的backgroundView ivar)已通过应用商店验证并正在生产中使用。
如果可能有不好的事情,你必须将方法包装在@try { ... } @catch
中,以便拦截KVC可能在较新的iOS版本中失败。
答案 1 :(得分:7)
“它不是私人”的五个证据
这是一个你可以通过其他方式获得的属性。试试这个,其中一个观点实际上是_view
的{{1}} ivar。这表明访问此UIBarButtonItem
本身并不被禁止,尽管KVO方式可能有问题(但我对此表示怀疑)。
UIView
他们实际上触发了此属性的KVO。 ivars不必触发KVO API,对吗?
@Farcaller提到了一个类似的案例,可在App Store中出售。由于他/她在问题的前20分钟内回答,因此假设App Store中可能有数千个应用程序执行此操作是合理的(但不安全!)。
每次按下按钮时,此UIView都会被取消,因此您不能仅仅在其上设置手势识别器并完成。但是,每次 NSArray *array = self.toolBar.subviews;
for (UIView *view in array) {
view.backgroundColor = UIColor.greenColor;
}
被替换时,您都可以继续设置相同的手势识别器。对我来说,这实际上更多的证据表明它不是私有的API,而是在使用它时必须非常小心(并使用KVO来确保你拥有最新的)。
我的应用程序在App Store中出售并执行此操作。