在“关闭”状态下使用滚动视图启动时遇到问题

Posted

技术标签:

【中文标题】在“关闭”状态下使用滚动视图启动时遇到问题【英文标题】:Having trouble launching with scrollview in 'Closed' state 【发布时间】:2016-02-05 18:48:49 【问题描述】:

我正在使用带有两个容器的滚动视图,以便将滑出菜单添加到我正在处理的选项卡式应用程序中。

应用程序启动时,如果用户已经登录,则显示主页面并初始关闭左侧滑动菜单。但是,如果用户没有登录并且必须通过登录按钮进入主页,则主页会显示菜单打开。我不知道如何关闭它。

在 mainViewController 中,这是最初用于关闭菜单的函数

func closeMenu(animated:Bool = true)
    scrollView.setContentOffset(CGPoint(x: leftMenuWidth, y: 0), animated: animated)

在 viewDidLoad 中,我调用以下命令来初始关闭菜单

        dispatch_async(dispatch_get_main_queue()) 
        self.closeMenu(true)
    

我正在使用 NSNotifications 通过主页上的按钮来切换菜单的打开和关闭。所以我尝试在点击登录按钮时发布“toggleMenu”通知,但这不起作用

PFUser.logInWithUsernameInBackground(username!, password: password!) 
            (user: PFUser?, error: NSError?) -> Void in
            if user != nil 
                print("successful login")


                dispatch_async(dispatch_get_main_queue(),  () -> Void in

                    let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ContainerHome")
                    self.presentViewController(viewController, animated: true, completion: nil)

                    NSNotificationCenter.defaultCenter().postNotificationName("toggleMenu", object: nil)
                )

我是初学者,所以如果我遗漏了一些细节,我深表歉意。

提前感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

首先,您不需要在viewDidLoad() 方法中切换到主队列。它将始终在主线程中调用(至少由操作系统调用)。

您不想在viewDidLoad() 方法中对大小、帧、偏移等进行任何处理。视图还没有被添加到父视图中,所以此时它的大小和位置是没有意义的。

尝试从viewWillAppear() 方法调用closeMenu()。它可能仍然不起作用,但它更接近您希望代码运行的点。如果它不能直接从那里工作,您可以将其延迟到视图更新后,如下所示:

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.01 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) 
        self.closeMenu(false)
    

或者,您可以尝试将调用添加到您的 viewDidLayoutSubviews() 覆盖:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    if menuShouldBeClosed 
        closeMenu(false)
    

menuShouldBeClosed 是一个布尔属性,因为您需要某种方式在此处进行跟踪。

【讨论】:

哇,我按照你说的做了,并在 viewWillAppear 中调用了它,并且成功了!非常感谢你的帮助。不敢相信这么简单,我还有很多东西要学。

以上是关于在“关闭”状态下使用滚动视图启动时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

当视图当前不可见时更改集合视图的滚动位置

关闭另一个视图后 UITableView 滚动内容大小不正确

列表视图滚动后 RadioGroup 按钮失去状态

画外音模式 - 滚动到在滚动视图中关闭的子视图

SWIFTUI:- 有没有办法在滚动滚动视图时关闭弹跳?

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]