在 '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
是一个布尔值 属性,因为您需要一些方法来跟踪此处。
我正在使用带有两个容器的滚动视图,以便将滑出菜单添加到我正在处理的选项卡式应用程序。
应用启动时,如果用户已经登录,则显示主页面,左侧滑动菜单最初是关闭的。但是,如果用户未登录并且必须通过登录按钮进入主页,则主页会显示为打开的菜单。我不知道如何关闭它。
在 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
是一个布尔值 属性,因为您需要一些方法来跟踪此处。