【问题标题】:Tab Bar scroll to the top of UIViewController when pressed twice按下两次标签栏滚动到 UIViewController 的顶部
【发布时间】:2019-04-15 19:52:58
【问题描述】:

我试图让我的UITabBarController 在按下两次时滚动到页面顶部。我已经尝试过几次让这个工作没有运气。到目前为止,我在故事板上只有一个与代码链接的 UITabBarController 类。我也应该链接UITabBar吗?这是我迄今为止尝试过的代码。

  import UIKit

class TabViewController: UITabBarController, UITabBarControllerDelegate {
    var pressedCount: Int = 0


    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self


        // Do any additional setup after loading the view.
    }
    @IBAction func unwindToMain(segue: UIStoryboardSegue) {}

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        self.navigationController?.isNavigationBarHidden = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        print("Selected item")
    }

    // UITabBarControllerDelegate
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        print("Selected view controller")
    }
    func tabBarController(_ TabViewController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        guard let viewControllers = viewControllers else { return false }
        if viewController == viewControllers[selectedIndex] {
            if let nav = viewController as? UINavigationController {
                guard let topController = nav.viewControllers.last else { return true }
                if !topController.isScrolledToTop {
                    topController.scrollToTop()
                    return false
                } else {
                    nav.popViewController(animated: true)
                }
                return true
            }
        }

        return true
    }
}


extension UIViewController {
    func scrollToTop() {
        func scrollToTop(view: UIView?) {
            guard let view = view else { return }

            switch view {
            case let scrollView as UIScrollView:
                if scrollView.scrollsToTop == true {
                    scrollView.setContentOffset(CGPoint(x: 0.0, y: -scrollView.contentInset.top), animated: true)
                    return
                }
            default:
                break
            }

            for subView in view.subviews {
                scrollToTop(view: subView)
            }
        }

        scrollToTop(view: view)
    }

    var isScrolledToTop: Bool {
        if self is UITableViewController {
            return (self as! UITableViewController).tableView.contentOffset.y == 0
        }
        for subView in view.subviews {
            if let scrollView = subView as? UIScrollView {
                return (scrollView.contentOffset.y == 0)
            }
        }
        return true
    }
}

【问题讨论】:

    标签: swift xcode uiviewcontroller uitabbarcontroller uitabbar


    【解决方案1】:

    例如:

       var pressedCount: Int = 0
    
       func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
    
        pressedCount += 1
        if pressedCount > 1 {
            scrollToTop(view: self.view)
            } else {
            //do something for first press
            }
        }
    

    【讨论】:

    • 我是为 UITabBar 制作一个新的控制器还是在我的其余代码中实现它
    • 尝试输入 func tabBarController(_ 并查找 didSelectItem
    • 如果您知道如何在标签栏被按下一次时调用一个动作,只需使用此代码来增加该动作。
    • 我已经编辑了我的代码,现在我可以跟踪何时按下标签栏,我将在哪里实现您的代码
    • 在标签栏被按下的函数中添加pressedCount += 1 if pressedCount > 1 { scrollToTop(view: self.view) } else { //do something for first press } }
    【解决方案2】:

    自定义UITabBar,然后用通知时间让外界响应!或者通过UITabBarController代理记录点击次数,然后通知外界响应!

    【讨论】:

    • 对编码有点陌生,你能给我举个例子吗?
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多