获取我的UIBarButtonItem在iOS 11中的位置

时间:2018-09-06 16:08:16

标签: ios swift

在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,因此效果不佳。

1 个答案:

答案 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的UIBarButtonItemUIBarButtonItem中获取视图及其框架。