将 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
}
}
}
}
}
我已经设置了一个自定义的 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
}
}
}
}
}