基本上我的问题是我正在尝试创建一个抽屉,因为 iOS/Swift 似乎没有本机对象。出于我不记得的原因,我决定为此使用导航控制器,认为我可以覆盖后退按钮及其操作以将此导航栏变成抽屉。虽然我已经成功地将后退按钮的图像/文本更改为看起来像"汉堡"(抽屉图标(,但我无法弄清楚如何成功阻止按钮将我们带回,而是让它打开/关闭我的抽屉。
任何建议都值得赞赏,包括采取完全不同的方法来创建它的建议。
以下是具有我尝试覆盖的后退按钮的页面的控制器。你可以在viewDidLoad((中看到我调用prepareDrawerPage((,这是我在另一个文件中的帮助程序。这个定义也可以在下面看到。
class CreateListingController: UIViewController {
let DRAWER_OPEN = CGFloat(0)
var DRAWER_CLOSED: CGFloat = 0 // -1 * width of drawer
@IBOutlet var navItem: UINavigationItem!
@IBOutlet var drawerView: UIView!
@IBOutlet var drawerViewLead: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
DRAWER_CLOSED = UIScreen.main.bounds.width * -1 * drawerViewLead.multiplier
drawerViewLead.constant = DRAWER_CLOSED
prepareDrawerPage(controller: self, title: "PBX - Create a Listing")
}
@IBAction func flipMenu(_ sender: UIBarButtonItem) {
if (drawerViewLead.constant == DRAWER_OPEN){
drawerViewLead.constant = DRAWER_CLOSED
UIView.animate(withDuration: 0.2, delay: 0.0, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
} else {
drawerViewLead.constant = DRAWER_OPEN
UIView.animate(withDuration: 0.2, delay: 0.0, options: .curveEaseIn, animations: {
self.view.layoutIfNeeded()
})
}
}
}
prepareDrawerPage((:
func prepareDrawerPage(controller: UIViewController, title: String) {
let blank = UIImage()
controller.navigationController?.navigationBar.backIndicatorImage = blank
controller.navigationController?.navigationBar.backIndicatorTransitionMaskImage = blank
controller.title = title
}
上述方法在主页上效果很好,我们还没有使用导航栏。但是,一旦我们单击创建列表页面,尽管在BarButtonItem(后退按钮(和CreateListingController(翻转菜单功能(之间链接了操作,但单击该按钮时仍然会将我们带回家。
您可以在导航栏上添加自定义按钮。
override func viewDidLoad() {
...
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(image: YourImage, style: .plain, target: self, action: #selector(back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
...
}
@objc func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
// self.navigationController?.popViewController(animated: true)
}