以编程方式使用手势将子视图控制器添加到父视图控制器
Add Child View Controllers to parent View Controller with gestures programmatically
我正在尝试以编程方式制作汉堡菜单。到目前为止,我已经成功地构建了一些在使用 UIViews 并将手势附加到它们时有效的东西(减去一些错误)。
现在我想将我的 UIView 换成名为 UIViewController 的 UIViewController:
jobListController // This is the root controller
sideBarController // This is the side bar
如何将我的 UIViewController 添加到我的汉堡包菜单中 class 并应用我创建的在我的 UIView 上运行良好的手势。
我尝试使用 addChildViewController(jobListController)
添加它们,但这似乎不起作用。
我试图将手势识别器添加到我的汉堡菜单中的视图控制器 class 但我收到此错误:
Type 'jobListController' has no member 'addGestureRecognizer'
我意识到这是因为我没有将视图控制器作为 class 的父级,但我只是在尝试。
我这几天一直在扯头发,不知道该怎么做,任何帮助都会很棒!
这是我的汉堡包菜单代码(我已将 UIView 留在其中,因此您可以看到我正在尝试做什么:
class hamburgerMenu: UIViewController, UIGestureRecognizerDelegate {
let screenHeight = UIScreen.main.bounds.height
let screenWidth = UIScreen.main.bounds.width
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
var sideBarOriginalCenter: CGPoint!
var mainViewOriginalCenter: CGPoint!
var navBarOriginalCenter: CGPoint!
var statusBarShouldBeHidden = false
var mainView: UIView! = {
let mainView = UIView()
mainView.backgroundColor = UIColor(red:1.0, green:1.0, blue:1.0, alpha:1.0)
mainView.translatesAutoresizingMaskIntoConstraints = false
return mainView
}()
var overlayView: UIView! = {
let overlayView = UIView()
overlayView.backgroundColor = UIColor(red:0.0, green:0.0, blue:0.0, alpha:0.0)
overlayView.translatesAutoresizingMaskIntoConstraints = false
return overlayView
}()
var sideBarUIView: UIView! = {
let sideBarUIView = UIView()
sideBarUIView.backgroundColor = UIColor(red:0.18, green:0.20, blue:0.21, alpha:1.0)
sideBarUIView.translatesAutoresizingMaskIntoConstraints = false
return sideBarUIView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
navigationItem.title = "JOBS"
let settingsButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settingsImage"), style: .plain, target: self, action: #selector(HandleSettings))
settingsButton.tintColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
settingsButton.width = 25
navigationItem.leftBarButtonItem = settingsButton
view.addSubview(mainView)
view.addSubview(sideBarUIView)
view.addSubview(overlayView)
overlayView.isHidden = true
configureGestures()
setupLayout()
}
override var prefersStatusBarHidden: Bool {
return statusBarShouldBeHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .fade
}
fileprivate func configureGestures() {
let swipeMainViewGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanMainView))
mainView.addGestureRecognizer(swipeMainViewGesture)
let swipeOverlayViewGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanOverlayView))
overlayView.addGestureRecognizer(swipeOverlayViewGesture)
let swipeSideBarGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanSideBar(sender:)))
sideBarUIView.addGestureRecognizer(swipeSideBarGesture)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapOverlay))
overlayView.addGestureRecognizer(tapGesture)
}
@IBAction func didPanMainView(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
// Hide the status bar
self.statusBarShouldBeHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
}
@IBAction func didPanOverlayView(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarShouldBeHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
}
@IBAction func didPanSideBar(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.3) {
self.statusBarWindow?.alpha = 0.0
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarWindow?.alpha = 1.0
}
}
}
}
@IBAction fileprivate func didTapOverlay() {
UIView.animate(withDuration: 0.3, animations: {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarWindow?.alpha = 1.0
}) { (success) in
}
}
@IBAction func HandleSettings(sender : UIButton) {
self.navBarOriginalCenter = self.navigationController?.navigationBar.center
UIView.animate(withDuration: 0.3, animations: {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
self.statusBarWindow?.alpha = 0.0
})
overlayView.isHidden = false
}
private func setupLayout(){
mainView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
mainView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
overlayView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
overlayView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
sideBarUIView.rightAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
sideBarUIView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
sideBarUIView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
sideBarUIView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
}
}
我的 2 个控制器的代码,代码完全相同,除了我上面提到的 class 名称:
class sideBarController: UIViewController {
let screenHeight = UIScreen.main.bounds.height
let screenWidth = UIScreen.main.bounds.width
var greyBackground: UIView! = {
let greyBackground = UIView()
greyBackground.backgroundColor = UIColor(red:0.18, green:0.20, blue:0.21, alpha:1.0)
greyBackground.translatesAutoresizingMaskIntoConstraints = false
return greyBackground
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(greyBackground)
setupLayout()
}
private func setupLayout(){
greyBackground.rightAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
greyBackground.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
greyBackground.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
greyBackground.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
}
}
我假设 jobListController 是一个 UIViewController?您需要将手势识别器添加到它的视图 (jobListController.view)。不确定这是否是您遇到的唯一问题,但这会解决崩溃问题。
我正在尝试以编程方式制作汉堡菜单。到目前为止,我已经成功地构建了一些在使用 UIViews 并将手势附加到它们时有效的东西(减去一些错误)。
现在我想将我的 UIView 换成名为 UIViewController 的 UIViewController:
jobListController // This is the root controller
sideBarController // This is the side bar
如何将我的 UIViewController 添加到我的汉堡包菜单中 class 并应用我创建的在我的 UIView 上运行良好的手势。
我尝试使用 addChildViewController(jobListController)
添加它们,但这似乎不起作用。
我试图将手势识别器添加到我的汉堡菜单中的视图控制器 class 但我收到此错误:
Type 'jobListController' has no member 'addGestureRecognizer'
我意识到这是因为我没有将视图控制器作为 class 的父级,但我只是在尝试。
我这几天一直在扯头发,不知道该怎么做,任何帮助都会很棒!
这是我的汉堡包菜单代码(我已将 UIView 留在其中,因此您可以看到我正在尝试做什么:
class hamburgerMenu: UIViewController, UIGestureRecognizerDelegate {
let screenHeight = UIScreen.main.bounds.height
let screenWidth = UIScreen.main.bounds.width
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
var sideBarOriginalCenter: CGPoint!
var mainViewOriginalCenter: CGPoint!
var navBarOriginalCenter: CGPoint!
var statusBarShouldBeHidden = false
var mainView: UIView! = {
let mainView = UIView()
mainView.backgroundColor = UIColor(red:1.0, green:1.0, blue:1.0, alpha:1.0)
mainView.translatesAutoresizingMaskIntoConstraints = false
return mainView
}()
var overlayView: UIView! = {
let overlayView = UIView()
overlayView.backgroundColor = UIColor(red:0.0, green:0.0, blue:0.0, alpha:0.0)
overlayView.translatesAutoresizingMaskIntoConstraints = false
return overlayView
}()
var sideBarUIView: UIView! = {
let sideBarUIView = UIView()
sideBarUIView.backgroundColor = UIColor(red:0.18, green:0.20, blue:0.21, alpha:1.0)
sideBarUIView.translatesAutoresizingMaskIntoConstraints = false
return sideBarUIView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
navigationItem.title = "JOBS"
let settingsButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settingsImage"), style: .plain, target: self, action: #selector(HandleSettings))
settingsButton.tintColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
settingsButton.width = 25
navigationItem.leftBarButtonItem = settingsButton
view.addSubview(mainView)
view.addSubview(sideBarUIView)
view.addSubview(overlayView)
overlayView.isHidden = true
configureGestures()
setupLayout()
}
override var prefersStatusBarHidden: Bool {
return statusBarShouldBeHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .fade
}
fileprivate func configureGestures() {
let swipeMainViewGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanMainView))
mainView.addGestureRecognizer(swipeMainViewGesture)
let swipeOverlayViewGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanOverlayView))
overlayView.addGestureRecognizer(swipeOverlayViewGesture)
let swipeSideBarGesture = UIPanGestureRecognizer(target: self, action: #selector(didPanSideBar(sender:)))
sideBarUIView.addGestureRecognizer(swipeSideBarGesture)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTapOverlay))
overlayView.addGestureRecognizer(tapGesture)
}
@IBAction func didPanMainView(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
// Hide the status bar
self.statusBarShouldBeHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
}
@IBAction func didPanOverlayView(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.25) {
self.setNeedsStatusBarAppearanceUpdate()
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarShouldBeHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
}
@IBAction func didPanSideBar(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
if sender.state == .began {
sideBarOriginalCenter = sideBarUIView.center
mainViewOriginalCenter = overlayView.center
navBarOriginalCenter = navigationController?.navigationBar.center
overlayView.isHidden = false
UIView.animate(withDuration: 0.3) {
self.statusBarWindow?.alpha = 0.0
}
} else if sender.state == .changed {
sideBarUIView.center = CGPoint(x: sideBarOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
overlayView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
mainView.center = CGPoint(x: mainViewOriginalCenter.x + translation.x, y: sideBarUIView.center.y)
navigationController?.navigationBar.center = CGPoint(x: navBarOriginalCenter.x + translation.x, y: navBarOriginalCenter.y)
} else if sender.state == .ended {
let negHalfScreenWidth = ((self.screenWidth/2) * -1) / 2 // This should make -187.5 on iphoneX
if sideBarUIView.center.x > negHalfScreenWidth {
UIView.animate(withDuration: 0.3) {
if self.sideBarUIView.center.x > negHalfScreenWidth {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
}
}
} else {
UIView.animate(withDuration: 0.3) {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarWindow?.alpha = 1.0
}
}
}
}
@IBAction fileprivate func didTapOverlay() {
UIView.animate(withDuration: 0.3, animations: {
let leftSideOfScreen = (self.screenWidth / 2) * -1
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth/2 ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth/2 ,y: self.navBarOriginalCenter.y)
self.overlayView.isHidden = true
self.statusBarWindow?.alpha = 1.0
}) { (success) in
}
}
@IBAction func HandleSettings(sender : UIButton) {
self.navBarOriginalCenter = self.navigationController?.navigationBar.center
UIView.animate(withDuration: 0.3, animations: {
let leftSideOfScreen = self.screenWidth - self.screenWidth
self.sideBarUIView.center = CGPoint(x: leftSideOfScreen ,y: self.sideBarUIView.center.y)
self.overlayView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.mainView.center = CGPoint(x: self.screenWidth ,y: self.sideBarUIView.center.y)
self.navigationController?.navigationBar.center = CGPoint(x: self.screenWidth ,y: self.navBarOriginalCenter.y)
self.statusBarWindow?.alpha = 0.0
})
overlayView.isHidden = false
}
private func setupLayout(){
mainView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
mainView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
overlayView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
overlayView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
sideBarUIView.rightAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
sideBarUIView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
sideBarUIView.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
sideBarUIView.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
}
}
我的 2 个控制器的代码,代码完全相同,除了我上面提到的 class 名称:
class sideBarController: UIViewController {
let screenHeight = UIScreen.main.bounds.height
let screenWidth = UIScreen.main.bounds.width
var greyBackground: UIView! = {
let greyBackground = UIView()
greyBackground.backgroundColor = UIColor(red:0.18, green:0.20, blue:0.21, alpha:1.0)
greyBackground.translatesAutoresizingMaskIntoConstraints = false
return greyBackground
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(greyBackground)
setupLayout()
}
private func setupLayout(){
greyBackground.rightAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
greyBackground.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
greyBackground.heightAnchor.constraint(equalToConstant: screenHeight).isActive = true
greyBackground.widthAnchor.constraint(equalToConstant: screenWidth).isActive = true
}
}
我假设 jobListController 是一个 UIViewController?您需要将手势识别器添加到它的视图 (jobListController.view)。不确定这是否是您遇到的唯一问题,但这会解决崩溃问题。