通过展示控制器创建导航抽屉?

7

我已经创建了一个演示导航抽屉,通过预设置一个具有从左到右的自定义动画的控制器。当我们解除控制器时,我们应用从右到左的动画。虽然它能够工作,但是抽屉动画看起来并不像原生Android抽屉那样流畅。所以请问您如何最好地实现这一点,尽管我不想依赖于任何第三方库来实现此功能。

@IBAction func actionMenu(_ sender: Any) {

        let controler:DrawerController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DrawerController")
        as! DrawerController
        let transition = CATransition()
        transition.duration = 0.5
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        transition.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionDefault)
        view.window!.layer.add(transition, forKey: kCATransition)
        present(controler, animated: false) {
            controler.drawerView.backgroundColor = UIColor.black
            controler.drawerView.alpha = 0.6
        }
    }

以下是故事板截图: 此处应有图片描述 此处应有图片描述

你只想让它像安卓一样以动画方式滑入和滑出吗? - HAK
检查答案:https://dev59.com/DGAf5IYBdhLWcg3w7mf3 - HAK
阴影和动画需要保持一致。 - TechChain
3个回答

4
如果您不想使用第三方库,也可以通过以下方法实现此目标。
  1. 在 MainViewController 中添加一个容器视图。
  2. 使用segue将Side TableViewController添加到容器视图中

  3. 根据需要设置Container view的宽度。

  4. 为容器视图添加前导、顶部、底部和恒定宽度的约束。

  5. 在视图中创建trailing约束的outlet,并从MainViewController值减去Width值切换其常量以隐藏,从0切换为显示。

**MainViewController**

import UIKit

class MainViewController: UIViewController {
    @IBOutlet var leadingConstraint: NSLayoutConstraint!

    @IBOutlet weak var containerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func openView(_ sender: Any) {
        if leadingConstraint.constant == -250{
            leadingConstraint.constant = 0
        }
        else{
            leadingConstraint.constant = -250
        }
        UIView.animate(withDuration: 0.4) {
            self.view.layoutIfNeeded()
        }
    }

}

SlideTableViewController

import UIKit

class SlideTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var dataItems: [String] = ["item1", "item2", "item3", "item4"]

    @IBOutlet weak var tabelView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tabelView.delegate = self
        tabelView.dataSource = self
    }

    // MARK: - Table view data source
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataItems.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = dataItems[indexPath.row]
        return cell
    }
}

这里输入图片描述 这里输入图片描述


0
尝试使用自由形式大小创建视图控制器,并使用以下方式呈现控制器:
viewController.modalPresentationStyle = .OverCurrentContext
yourContorller.presentViewController(viewController, animated: true, completion: nil)

0

你可以取代使用另一个ViewController,改为使用UIView的.xib作为你的导航抽屉,并将自定义动画应用于从左侧向右侧呈现此UIView,方法是更改其X坐标和其框架。


我应该将它添加到窗口还是当前视图? - TechChain
你必须将它添加到当前顶部视图上。 - Ashvini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接