我正在使用带有两个容器的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)
})
}
我是初学者,所以如果我遗漏了一些细节,我会道歉。
提前感谢您提供的任何帮助。
答案 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
是一个布尔属性,因为你需要一些方法来跟踪这里。