简体   繁体   English

具有自动布局的SideMenu

[英]SideMenu with AutoLayout

I'am trying to make a side menu and i have some problems with setting it with auto layout. 我正在尝试制作侧面菜单,但在使用自动版面设置时遇到一些问题。 I have a rootViewController that i add to it the leftMenuVC as childVC then i set the constraints. 我有一个rootViewController,我将leftMenuVC添加为childVC,然后设置了约束。

class RootVC: UIViewController, NavigationBarDelegate {
    var leftMenuVC: UIViewController?
    var navigationBar = NavigationBar()
    var isMenuCollapsed = true

    override func viewDidLoad() {
        leftMenuVC = leftVC()
        addChildViewController(leftMenuVC!)
        view.addSubview(leftMenuVC!.view)
        leftMenuVC!.didMove(toParentViewController: self)
    }

    override func viewDidLayoutSubviews() {
        if let v = leftMenuVC?.view {
            v.translatesAutoresizingMaskIntoConstraints = false
            v.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
            v.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
            v.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -140).isActive = true
            v.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        }
    }

    func menuButtonClicked(){

    }
}

So my question is how to change constraints to hide/show the menu with support of orientations 所以我的问题是如何更改约束以隐藏/显示菜单并支持方向

What I usually do when I want to hide a view outside the screen with constraints is: 当我想在屏幕外隐藏有约束的视图时,通常要做的是:

1 Set all constraints so that the sideview is visible (in active state) 1设置所有约束,以使侧视图可见(处于活动状态)

2 Keep in reference the constraint that stick your sideview on one side (here the left one) 2保持将侧视图固定在一侧的约束(这里是左侧)

leftAnchor = NSLayoutConstraint(item: v, attribute: .left, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0)
view.addConstraint(leftAnchor)
view.addConstraint(NSLayoutConstraint(item: v, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: v, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: v, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 0.6, constant: 0))

3 Set one more constraint so that the view will be hidden. 3再设置一个约束,以便隐藏视图。 Usually it's something like that. 通常情况就是这样。 Note that the priority is set to 999 to avoid constraint conflicts. 请注意,优先级设置为999,以避免约束冲突。

var hiddingConstraint = NSLayoutConstraint(item: v, attribute: .right, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0)
hiddingConstraint.priority = 999
view.addConstraint(hiddingConstraint)

4 Animate by activating or not your leftAnchor 4通过激活或不激活leftAnchor进行动画处理

UIView.animate(withDuration: 0.3) {
       self.leftAnchor.active = false
       self.view.layoutIfNeeded()
}

So you should end up with a code like this: 因此,您应该以如下代码结束:

class RootVC: UIViewController, NavigationBarDelegate {
    var leftMenuVC: UIViewController?
    var navigationBar = NavigationBar()
    var isMenuCollapsed = true {
        didSet {
            UIView.animate(withDuration: 0.3) {
                self.leftAnchor?.isActive = self.isMenuCollapsed
                self.view.layoutIfNeeded()
            }
        }

    }
    var leftAnchor : NSLayoutConstraint?

    override func viewDidLoad() {
        leftMenuVC = leftVC()
        addChildViewController(leftMenuVC!)
        view.addSubview(leftMenuVC!.view)
        leftMenuVC!.didMove(toParentViewController: self)
    }

    override func viewDidLayoutSubviews() {
        if let v = leftMenuVC?.view {

            leftAnchor = NSLayoutConstraint(item: v, attribute: .left, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0)
            view.addConstraint(leftAnchor!)
            view.addConstraint(NSLayoutConstraint(item: v, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0))
            view.addConstraint(NSLayoutConstraint(item: v, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0))
            view.addConstraint(NSLayoutConstraint(item: v, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 0.6, constant: 0))

            var hiddingConstraint = NSLayoutConstraint(item: v, attribute: .right, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0)
            hiddingConstraint.priority = 999
            view.addConstraint(hiddingConstraint)
        }
    }

    func menuButtonClicked(){
        isMenuCollapsed = !isMenuCollapsed
    }
}

PS: I won't put the constraints setting in viewDidLayoutSubviews , maybe in viewWillAppear , as you don't have to set them every time the device is being rotated. PS:我不会将约束设置放在viewDidLayoutSubviews ,也许不在viewWillAppear ,因为您不必在每次旋转设备时都设置约束。 That's the purpose of constraints 那就是约束的目的

Instead of writing this code by yourself, save yourself the trouble. 不用自己编写代码,而省去了麻烦。 Here is MMDrawerController to your rescue. 这是MMDrawerController供您使用。 I am using it myself. 我自己使用它。 It's super easy to implement and offers lots of customization options. 它非常易于实现,并提供了许多自定义选项。 Hope you find it useful. 希望你觉得它有用。 :-) :-)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM