在 'Closed' 状态下使用 scrollview 启动时遇到问题

Having trouble launching with scrollview in 'Closed' state

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

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

在 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 通过主页上的按钮打开和关闭菜单。所以我尝试在点击登录按钮时 post '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)
                })
}

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

在此先感谢您提供的任何帮助。

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

您不想在 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 是一个布尔值 属性,因为您需要一些方法来跟踪此处。