在App Start上,我突出显示了我的BarButtonItems之一。从iOS11开始,我无法执行此操作,因为我需要以其他方式对其进行初始化。
首先是我的旧ios 10代码。初始化后,我保存了barButtonItemView。
let item1 = UIBarButtonItem(image: UIImage(named: "iconProfile"), style: .plain, target: self, action: #selector(pushSettings))
self.navigationItem.setRightBarButtonItems([item1], animated: true)
if let view = self.navigationItem.rightBarButtonItem?.value(forKey: "view") as? UIView {
barButtonItemView = view
}
现在我只需要使用框架就可以访问barButtonItem的位置
barButtonItemView.frame.topMiddle.x
在ios 11中,UIBarButtonItem上的图片变小了。我读到我必须通过使用约束来调整它们的大小。现在,我使用以下函数初始化UIBarButtons:
let imageView = UIImageView(image: UIImage(named: imageName))
imageView.frame = CGRect(x: 5, y: 7, width: 20, height: 20)
let button = UIButton()
button.frame = CGRect(x: 0, y: 0, width: 30, height: 34)
button.addTarget(self, action: action, for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: 30).isActive = true
button.heightAnchor.constraint(equalToConstant: 34).isActive = true
button.addSubview(imageView)
let barItem = UIBarButtonItem(customView: button)
return barItem
我以相同的方式设置rightBarButtonItem,并尝试以相同的方式获取视图。
self.navigationItem.setRightBarButtonItems([item1], animated: true)
if let view = self.navigationItem.rightBarButtonItem?.value(forKey: "view") as? UIView {
barButtonItemView = view
}
但是这次我的barButtonItemView的x和y值设置为0,0。有谁知道如何根据我的屏幕获取BarButtonItem的位置?
我尝试的第一个解决方案是在尝试再次获取框架之前调用layoutIfNeeded()。由于x和y的值仍为0,0,因此效果不佳。
答案 0 :(得分:0)
首先,如果UIBarButtonItem
仅需要显示UIImage
,则应使用[UIBarButtonItem initWithImage:style:target:action:]
而不是customView以获得更标准的布局。而且,如果您要自定义UIBarButtonItem
的大小,则可以调整图像的大小。
第二,在iOS 10之前,UIBarButtonItem的视图被直接添加到UINavigationBar
中,但是在iOS 11之后,UIBarButtonItem
被添加到UIStackView
中,而stackView被添加到{ {1}},因此,如果您从customView的frame.origin中获得(0,0),则意味着customView是在stackView的(0,0)原点布局的。
第三,在显示UINavigationBar
并将您的UIBarButtonItem
放入栏中之前,UINavigationBar
的视图将不会初始化,因此当{ {1}}刚刚被初始化。也许您可以尝试在viewController的UIBarButtonItem
或UIBarButtonItem
中获取视图及其框架。