在“关闭”状态下使用滚动视图启动时遇到问题
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 中调用了它,并且成功了!非常感谢你的帮助。不敢相信这么简单,我还有很多东西要学。以上是关于在“关闭”状态下使用滚动视图启动时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章