将 UIBarButton Item 的点击区域扩展到屏幕边缘

Extend tap area of UIBarButton Item to edge of screen

我已经设置了一个自定义的 UIBarButton,我想将它延伸到屏幕的边缘,但我无法让它发生。

如果可能的话,我想将可点击区域扩展到屏幕的左边缘。

我的按钮代码如下所示:

    btn1.setImage(UIImage(named: "Back Arrow"), for: .normal)
    btn1.frame = CGRect(x: -100, y: 0, width: 150, height: 50)
    btn1.imageEdgeInsets.left = -100
    btn1.backgroundColor = UIColor.red
    btn1.clipsToBounds = false
    btn1.addTarget(self, action: #selector(self.segueToChooseScreen), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)
    self.navigationItem.setLeftBarButton(item1, animated: true)

我也尝试过实现这个,一开始是有效的,但是当我改变屏幕方向时它就消失了:

    override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    // to remove navigation bar extra margin
    for view in (self.navigationController?.navigationBar.subviews)! {
        view.layoutMargins = UIEdgeInsets.zero
    }
}

我的按钮仍然看起来像这样(例如在横向模式下):

有什么方法可以将它延伸到屏幕边缘吗?

谢谢!

注意: 您正在访问私有 api,如果更改视图结构或 class 名称,代码可能无法运行。另请注意,我正在 viewDidAppear

中进行更改

上次编辑:PO 想要两个 portrait/landscape 的边缘视图。我的实际建议是使用充当导航栏的自定义视图而不是下面的代码。

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let myView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 50))
    myView.backgroundColor = .red
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: myView)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let navController = navigationController {
        for subview in navController.navigationBar.subviews {
            if String(describing: subview).contains("ContentView") {

                if let guideToUpdate = subview.layoutGuides.first(where: { String(describing: [=10=]).contains("LeadingBar") }),
                    let guideToUpdateOwningView = guideToUpdate.owningView {
                    guideToUpdate.leadingAnchor.constraint(equalTo: guideToUpdateOwningView.leadingAnchor).isActive = true

                }
            }
        }
    }
}