约束条件不适用于导航控制器

我会尽可能快地尝试。我有一个高度为0的容器的主视图,每当启用键盘时,我将容器设置为与键盘相同的高度,并且我有一个按钮和一个电子邮件字段,并且已经为此容器设置了约束,基本上向上推动元素。我已经将视图设置为在视图加载时启用并且其主视图正常工作,但只要按下按钮即可进入下一视图,键盘会打开,但按钮和电子邮件字段会留在键盘后面因为约束不起作用,但是当我按home按钮并关闭应用程序(而不是从后台)并重新打开它时,约束正常工作。只有当我将导航控制器嵌入主视图时才会发生这种情况,否则它会完美地工作。有任何想法吗?约束条件不适用于导航控制器

我在两个视图上都有完全相同的代码。 Ps:对不起,很长的文章,我不知道如何解释它。

@IBOutlet weak var emailTF: UITextField! 

@IBOutlet weak var bottomHeight: NSLayoutConstraint!`

override func viewWillAppear(_ animated: Bool)

{

super.viewWillAppear(animated)

NotificationCenter.default.addObserver(

self,

selector: #selector(keyboardWillShow),

name: NSNotification.Name.UIKeyboardWillShow,

object: nil

)

// Show keyboard by default

emailTF.becomeFirstResponder()

}

@objc func keyboardWillShow(_ notification: Notification)

{

if let userInfo = notification.userInfo

{

if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue

{

bottomHeight.constant = keyboardSize.height

view.setNeedsLayout()

}

}

}

更新:我发现问题的一部分。 加载第二个视图时,我无法获得键盘高度,我将第二个视图代码从“viewWillAppear”更改为“viewDidAppear”,使容器与键盘高度相同,但还有另一个问题。当我加载第一个视图时,我得到271的键盘高度(这是正确的),当我移动到第二个视图时,出于某种原因,键盘高度为226,使textField移动45.同样的事情发生在我按下返回按钮从第二个视图返回到第一个,键盘高度是226.当我按下home按钮并重新打开应用程序时,无论我是哪个屏幕都可以获得271的键盘高度,这是正确的高度。我做错了什么?

更新2:已解决!

因为我的代码只在没有导航控制器的情况下工作,我有一种感觉,这是导航控制器所具有的快速动画和转换的功能,它阻止了代码在加载前被读取,所以我试图写这个一行代码 emailTF.resignFirstResponder()我的按钮动作,它的工作!所以基本上我不得不在下一个视图中加载之前关闭键盘。我希望我能帮助一些有相同问题的用户。

回答:

首先确保包含正在更改的视图的VC是textfield/textview的委托,然后从viewWillAppear调用.becomeFirstResponder()。确保您正确注册/注销键盘通知。如果可能的话,您可以使用滚动视图(通过默认UIView)来包含ViewControllers子视图,而不是改变约束。

func registerForKeyboardNotifications(){ 

//Adding notifies on keyboard appearing

NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillShow, object: nil, queue: nil, using: keyboardWasShown)

NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillHide, object: nil, queue: nil, using: keyboardWillBeHidden)

}

func deregisterFromKeyboardNotifications(){

//Removing notifies on keyboard appearing

NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardDidShow, object: nil)

NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillHide, object: nil)

}

func keyboardWasShown(notification: Notification) -> Void {

//Need to calculate keyboard exact size due to Apple suggestions

self.scrollView.isScrollEnabled = true

var info = notification.userInfo!

var keyboardSize:CGRect = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

if keyboardSize.size.height <= 0 { // to fix bug on iOS 11

keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

}

self.scrollView.contentInset.bottom = keyboardSize.height //add this much

self.scrollView.scrollIndicatorInsets.bottom = keyboardSize.height //scroll too it.

var aRect : CGRect = self.view.frame

aRect.size.height -= keyboardSize.height

if let activeField = self.activeTextView {

if (!aRect.contains(activeField.frame.origin)){

self.scrollView.scrollRectToVisible(activeField.frame, animated: true)

}

}

}

func keyboardWillBeHidden(notification: Notification){

self.scrollView.contentInset.bottom = 0

self.scrollView.isScrollEnabled = true

self.scrollView.alwaysBounceVertical = true

}

回答:

使用此行代码self.view.layoutIfNeeded()而不是view.setNeedsLayout()

并确保对您得到正确的高度或没有键盘的高度。

谢谢!

以上是 约束条件不适用于导航控制器 的全部内容, 来源链接: utcz.com/qa/257503.html

回到顶部