幻灯片视图控制器

Posted

技术标签:

【中文标题】幻灯片视图控制器【英文标题】:Slide View Controller 【发布时间】:2017-10-14 13:06:59 【问题描述】:

我设法以编程方式制作了一个滑动菜单控制器。我正在尝试在 tableViewController 中添加一个转换,当您单击一个标签以关闭菜单时,动画将使 tableView 全屏显示 0.2 秒,然后关闭菜单。这将有时间通过​​单击按钮更改视图,并且看起来不错。在 didSelectRowAtIndexPath 中做到了。有效!

tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)

因为我只在屏幕的 80% 处打开菜单,所以我正在移动单元格的 contentView 以显示在屏幕的 80% 中。当动画在 didSelectRowAtIndexPath 开始时,我将移回 0,因此我不会在 tableView 的左侧看到空格,如下所示:

tableView.contentInset = UIEdgeInsetsMake(0, menuWidthGap, 0, -menuWidthGap)

现在,当我再次单击该按钮时,它仍然是这样。当我再次单击按钮返回到 contentView 的初始状态时,我该怎么办。

这是我的表格视图:

    import UIKit

class MenuLeftVC: UITableViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Initialize the window
        let window = UIWindow.init(frame: UIScreen.main.bounds)
        window.makeKeyAndVisible()

        view.backgroundColor = UIColor.yellow
        navigationController?.isNavigationBarHidden = true

        tableView.dataSource = self
        tableView.delegate = self
        tableView.showsVerticalScrollIndicator = false

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")



    


    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(true)
        print("did apear")
        tableView.contentInset = UIEdgeInsetsMake(0, menuWidthGap, 0, -menuWidthGap)
    

    func selectCell() 
        print("selected cell - >")

        NotificationCenter.default.post(name: NSNotification.Name("SelectedCell"), object: nil)
    

    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 20
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
        cell.contentView.reloadInputViews()

        cell.isSelected = false
        tableView.contentInset = UIEdgeInsetsMake(0, menuWidthGap, 0, -menuWidthGap)


        cell.contentView.backgroundColor = UIColor.yellow
        cell.textLabel?.text = "Daim Boy"


        return cell
    


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)!
        selectedCell.contentView.backgroundColor = UIColor.red

        selectedCell.isSelected = false

        if selectedCell.isSelected == true 
        print("selection")
        if selectedCell.textLabel?.text == "Daim Boy" 
            print("cell is selected")
            UIView.animate(withDuration: 0.3, animations: 
                tableView.contentInset = UIEdgeInsetsMake(0, menuWidthGap, 0, -menuWidthGap)
                self.selectCell()
                //selectedCell.isSelected = false

            )

        

        


    







【问题讨论】:

我不确定您是如何实现幻灯片的,但听起来您可能想要使用UICollectionView 而不是UITableView,因为它可以免费提供滑动和过渡。 我认为你应该看看视图控制器转换。 谢谢,但这与 ViewController 动画无关。我有 2 个内容视图。其中一个拥有一个菜单,另一个拥有一个视图控制器。当我按下菜单项时,didSelectCell 被触发,并且我拥有将改变 contentView 的动画。为了更好的理解,我会放上完整的代码。 如果你能再看一下,就换个简单的家伙。 【参考方案1】:

我设法解决了这个问题:(这很简单)我只是调用 viewWillAppear,我在其中放置了代码以使布局像开头那样在函数末尾使用 DispatchQue:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let selectedCell:UITableViewCell = tableView.cellForRow(at: indexPath)!
    selectedCell.contentView.backgroundColor = UIColor.red

    selectedCell.isSelected = false

    if selectedCell.isSelected == true 
    print("selection")
    if selectedCell.textLabel?.text == "Daim Boy" 
        print("cell is selected")
        UIView.animate(withDuration: 0.3, animations: 
            tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
            self.selectCell()
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute:  
                self.viewWillAppear(true)
            )

            //selectedCell.isSelected = false

        )

    

    



并且 viewWillAppear 包含:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(true)
    print("will appear")
    tableView.contentInset = UIEdgeInsetsMake(0, menuWidthGap, 0, -menuWidthGap)


【讨论】:

以上是关于幻灯片视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 didSelectRowAtIndexPath 传递到另一个视图控制器 ios7

如何在单击按钮时执行幻灯片视图

显示导航控制器时在动画中自定义幻灯片根本无法快速工作

如何正确推送视图控制器

将模态视图控制器添加到父子视图控制器层次结构

即将溢出幻灯片过渡计数?