So, I have 2 views with one button in the middle of them. The button is constraint to the center view. As I slide to the other view the button move in the second position on the other view (to be visible). My problem is that I can not access the function of the button from my other view, so the button is not functional. It's created with contentView's :
This is my code:
import UIKit
class MainVC: UIViewController {
let setupMainVC = SetupMainVC()
var rightViewXConstant : NSLayoutConstraint!
var leftViewXConstant : NSLayoutConstraint!
var arrowLeftXConstant : NSLayoutConstraint!
var centerViewXConstant : NSLayoutConstraint!
var rightViewOpen = false
var leftViewOpen = false
var windowSize = CGFloat()
override func viewDidLoad() {
super.viewDidLoad()
let window = UIWindow.init(frame: UIScreen.main.bounds)
window.makeKeyAndVisible()
view.backgroundColor = UIColor.clear
setupMainVC.mainVC = self
setupMainVC.setupViews()
windowSize = window.frame.size.width
setupLeftViewController()
setupCenterViewController()
navigationItem.title = "Center View"
self.setupMainVC.arrowButtonLeft.transform = CGAffineTransform(rotationAngle: 0)
arrowLeftXConstant.constant = 20
print(windowSize)
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Left", style: .plain, target: self, action: #selector(leftButAction))
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Right", style: .plain, target: self, action: #selector(rightButAction))
setupMainVC.arrowButtonLeft.addTarget(self, action: #selector(leftButAction), for: .touchUpInside)
NotificationCenter.default.addObserver(self, selector: #selector(leftButAction), name: NSNotification.Name("leftButtonAction"), object: nil)
}
func leftButAction() {
print("Left Action")
if leftViewOpen {
leftViewOpen = false
centerViewXConstant.constant = 0
leftViewXConstant.constant = 0
self.setupMainVC.arrowButtonLeft.transform = CGAffineTransform(rotationAngle: 0)
arrowLeftXConstant.constant = 20
navigationItem.title = "Center View"
print(false)
} else {
leftViewOpen = true
centerViewXConstant.constant = windowSize
leftViewXConstant.constant = windowSize
self.setupMainVC.arrowButtonLeft.transform = CGAffineTransform(rotationAngle: -179)
arrowLeftXConstant.constant = -20
navigationItem.title = "Left View"
print(true)
}
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
func rightButAction() {
print("Right Action")
if rightViewOpen {
rightViewOpen = false
print(false)
} else {
rightViewOpen = true
print(true)
}
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
func center() {
let center = CenterVC()
addChildViewController(center)
center.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(center.view)
centerViewXConstant = center.view.centerXAnchor.constraint(equalTo: center.view.centerXAnchor, constant: 0)
centerViewXConstant.isActive = true
center.view.centerYAnchor.constraint(equalTo: center.view.centerYAnchor).isActive = true
center.view.heightAnchor.constraint(equalTo: center.view.heightAnchor).isActive = true
center.view.widthAnchor.constraint(equalTo: center.view.widthAnchor).isActive = true
center.view.backgroundColor = .blue
center.didMove(toParentViewController: self)
}
//MARK: Center View
func setupCenterViewController() {
let controller = CenterVC()
addChildViewController(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(controller.view)
controller.view.addSubview(setupMainVC.roundViewOnLeftView)
controller.view.addSubview(setupMainVC.arrowButtonLeft)
centerViewXConstant = controller.view.leftAnchor.constraint(equalTo: setupMainVC.leftView.rightAnchor, constant: 0)
centerViewXConstant.isActive = true
controller.view.centerYAnchor.constraint(equalTo: setupMainVC.leftView.centerYAnchor).isActive = true
controller.view.heightAnchor.constraint(equalTo: setupMainVC.leftView.heightAnchor).isActive = true
controller.view.widthAnchor.constraint(equalTo: setupMainVC.leftView.widthAnchor).isActive = true
setupMainVC.roundViewOnLeftView.centerXAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
setupMainVC.roundViewOnLeftView.centerYAnchor.constraint(equalTo: controller.view.centerYAnchor).isActive = true
setupMainVC.roundViewOnLeftView.heightAnchor.constraint(equalToConstant: 100).isActive = true
setupMainVC.roundViewOnLeftView.widthAnchor.constraint(equalToConstant: 100).isActive = true
arrowLeftXConstant = setupMainVC.arrowButtonLeft.centerXAnchor.constraint(equalTo: setupMainVC.roundViewOnLeftView.centerXAnchor, constant: 20)
arrowLeftXConstant.isActive = true
setupMainVC.arrowButtonLeft.centerYAnchor.constraint(equalTo: setupMainVC.roundViewOnLeftView.centerYAnchor).isActive = true
setupMainVC.arrowButtonLeft.heightAnchor.constraint(equalToConstant: 100).isActive = true
setupMainVC.arrowButtonLeft.widthAnchor.constraint(equalToConstant: 100).isActive = true
controller.didMove(toParentViewController: self)
}
//MARK: Left View
func setupLeftViewController() {
let controller = LeftVC()
//let navBar: UINavigationController = UINavigationController(rootViewController: controller)
addChildViewController(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(controller.view)
leftViewXConstant = controller.view.rightAnchor.constraint(equalTo: setupMainVC.centerView.leftAnchor, constant: 0)
leftViewXConstant.isActive = true
controller.view.centerYAnchor.constraint(equalTo: setupMainVC.centerView.centerYAnchor).isActive = true
controller.view.heightAnchor.constraint(equalTo: setupMainVC.centerView.heightAnchor).isActive = true
controller.view.widthAnchor.constraint(equalTo: setupMainVC.centerView.widthAnchor).isActive = true
controller.didMove(toParentViewController: self)
}
}
Manage to fix the issue. ALways the small things are the big trouble. It didn't work because of this part of the function:
controller.view.addSubview(setupMainVC.roundViewOnLeftView)
controller.view.addSubview(setupMainVC.arrowButtonLeft)
For the button to work it needs to be a subView of the MainView (the container) so it will be in the same view Hierarchy like so:
view.addSubview(setupMainVC.roundViewOnLeftView)
view.addSubview(setupMainVC.arrowButtonLeft)