在“已关闭”状态下使用scrollview启动时出现问题

时间:2016-02-05 18:48:49

标签: ios swift2 xcode7.1

我正在使用带有两个容器的scrollView,以便将幻灯片菜单添加到我正在处理的选项卡式应用中。

启动应用程序后,如果用户已登录,则会显示主页面,并且最初会关闭左侧幻灯片菜单。但是,如果用户未登录并且必须通过登录按钮进入主页面,则会显示主页面并打开菜单。我无法弄清楚如何将它关闭。

在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 个答案:

答案 0 :(得分:0)

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

您不希望在viewDidLoad()方法中对大小,帧,偏移等进行任何混乱。视图尚未添加到超视图中,因此其大小和位置此时毫无意义。

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

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是一个布尔属性,因为你需要一些方法来跟踪这里。