2016-04-24 54 views
0

好的,所以我试图在我的视图中实现一个添加评论框。这是布局:移动导航控制器内的UIView不工作

我有一个UITabBarController包含UINavigationController其中我的UIViewController推送到。视图布局由UITableView和包含UITextViewUIButton的自定义UIView组成。

我监视键盘的通知,这是我的代码有:

override func viewDidAppear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillAppear), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisappear), name: UIKeyboardWillHideNotification, object: nil) 
} 

override func viewDidDisappear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 

} 

func keyboardWillAppear(notification: NSNotification){ 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
     var frame = inputPanel.frame 
     frame.origin.y = self.view.frame.height - (keyboardSize.height + inputPanel.frame.size.height) 
     inputPanel.frame = frame 
    } 
} 

func keyboardWillDisappear(notification: NSNotification){ 
    var frame = inputPanel.frame 
    frame.origin.y = self.view.frame.height - inputPanel.frame.size.height 
    inputPanel.frame = frame 
} 

当键盘显示器,我已经设置断点并看到y坐标被更新,但我认为保持它是,隐藏在键盘后面。

一些笔记。我正在使用IQKeyboardManager,并且已禁用此类的距离处理。我还使用PureLayout来布置自定义UIView内的控件。我没有为视图控制器中的自定义UIView设置任何约束。该UITableView和自定义UIView的位置,如下图所示viewWillLayoutSubview方法设置:

override func viewWillLayoutSubviews() { 
    let y = self.view.frame.height - 44 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 

在另一方面,这是另一种观点认为正常使用我有不是UINavigationController的孩子。

正在发生什么的屏幕截图:

与输入视图的视图:

view with the input view

当显示键盘:

keyboard is shown

任何帮助是很大的赞赏。

回答

0

尝试删除此代码从viewWillLayoutSubviewsviewDidLoad功能

override func viewDidLoad() { 
    super.viewDidLoad() 

    let y = self.view.frame.height - 44 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 

我猜键盘后确实出现事件viewWillLayoutSubviews函数被调用。

0

尝试到位UIKeyboardFrameBeginUserInfoKey

1

的因为你不将约束应用于视图中使用UIKeyboardFrameEndUserInfoKey,你需要告诉你将之前设定的框架使用框架的自动排版引擎。您可以通过将translatesAutoresizingMaskIntoConstraints设置为true来完成此操作。例如:

override func viewWillLayoutSubviews() { 
    let y = self.view.frame.height - 44 
    self.tableView.translatesAutoresizingMaskIntoConstraints = true 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.translatesAutoresizingMaskIntoConstraints = true 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 
+0

我试图加入这个无济于事。我没有使用任何故事板或xib,我的所有视图都以编程方式创建。当我切换到viewDidLayoutSubviews方法时,下面板甚至没有显示在视图中 – bhmahler

+0

您可能想要发布tableView和inputPanel的初始化代码。你也确定keyboardWillAppear被召唤?它会进入你的if区块吗? – beyowulf

+0

它肯定会被叫去。我已经遍历了那里的代码,看到origin.y值被改变了,但是视图不会向上移动。我开始认为这可能是与在自定义视图中使用PureLayout相关的问题。 – bhmahler