在NavigationController中移动UIView无法正常工作

时间:2016-04-24 21:30:49

标签: ios swift2 iqkeyboardmanager pure-layout

好的,我正在尝试在我的视图中实现添加评论框。这是布局:

我的UITabBarController包含UINavigationController,其UIViewController被推送到UITableView。视图布局由UIView和自定义UITextView组成,其中包含UIButtonoverride 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 }

我正在监控键盘通知,这是我的代码:

IQKeyboardManager

当键盘显示时,我设置了断点并看到y坐标已更新,但我的视图保持在原位,隐藏在键盘后面。

一些笔记。我正在使用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

另一方面,这在另一个我不具备open System.Reflection module Something = let toQueryString x = let formatElement (pi : PropertyInfo) = sprintf "%s=%O" pi.Name <| pi.GetValue x x.GetType().GetProperties() |> Array.map formatElement |> String.concat "&" 的孩子的观点中完美运作。

正在发生的事情的屏幕截图:

带有输入视图的视图:

view with the input view

显示键盘时:

keyboard is shown

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

对于您没有应用约束的视图,您需要告诉自动布局引擎您将在设置帧之前使用帧。您可以将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)
}

答案 1 :(得分:0)

尝试将此代码从viewWillLayoutSubviews移至viewDidLoad功能

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函数。

答案 2 :(得分:0)

尝试使用UIKeyboardFrameEndUserInfoKey代替UIKeyboardFrameBeginUserInfoKey