2017-12-02 15 views
1

가능한 한 빨리하려고 노력할 것입니다. 키가 0 인 컨테이너가있는 기본보기가 있고 키보드가 활성화 될 때마다 컨테이너를 키보드의 높이와 같게 설정하고 버튼과 전자 메일 필드가 있고 기본적으로이 컨테이너에 제약 조건을 설정했습니다. 요소를 밀어. 뷰를로드 할 때 키보드를 활성화하고 주 뷰로 작업 할 수 있도록 설정했지만 단추를 눌러 다음보기로 이동하면 키보드가 열리지 만 단추와 전자 메일 필드는 키보드 뒤에 있습니다. 제약 조건이 작동하지 않기 때문에,하지만 홈 버튼을 누르고 배경이 아닌 앱을 닫고 다시 열면 제약 조건이 정상적으로 작동합니다. 이것은 메인 뷰에 내비게이션 컨트롤러를 내장 할 때만 발생합니다. 그렇지 않으면 완벽하게 작동합니다. 어떤 아이디어?내비게이션 컨트롤러와 작동하지 않는 제약

두보기 모두에서 똑같은 코드가 있습니다. 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이므로 텍스트 필드가 45로 이동합니다. 뒤로 버튼을 사용하여 secondView에서 첫 번째로 돌아가려면 키보드 높이가 226입니다. 홈 버튼을 누른 후 앱을 다시 열면 어떤 화면인지 알 수 없지만 올바른 높이 인 271의 키보드 높이를 얻습니다 . 내가 뭘 잘못하고 있니?

업데이트 2 : 해결되었습니다.

내 코드가 내비게이션 컨트롤러없이 작동했기 때문에 빠른 애니메이션과 내비게이션 컨트롤러로 전환 한 느낌이 들었고로드하기 전에 코드를 읽을 수 없으므로이 코드를 작성하려고했습니다. 코드 행 emailTF.resignFirstResponder() 내 버튼 동작으로 작동했습니다! 그래서 기본적으로 다음보기에서 키보드를로드하기 전에 키보드를 닫아야했습니다. 나는 같은 문제를 가진 몇몇 사용자들을 도왔 으면 좋겠다.

답변

0

먼저 변경중인 뷰를 포함하는 VC가 textfield/textview의 위임자인지 확인한 다음 viewWillAppear에서 .becomeFirstResponder()를 호출합니다. 키보드 알림을 등록/등록 취소하고 있는지 확인하십시오. 가능하면 제약 조건을 변경하는 대신 ViewControllers 하위 뷰를 포함하는 스크롤 뷰 (기본 UIView 이상)를 사용할 수 있습니다. 대신 view.setNeedsLayout()

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 
} 
+0

이미 문제를 발견하고 게시물을 업데이트했습니다. 당신은 scrollView 언급했지만 내 경우에는 하나의 요소를 이동하고 scrollView를 사용하여 일을 복잡하게하려는 경우 작동 할 것입니다. 도움을 주셔서 감사합니다! –

+0

@ AlexandreD'Acol 항상 스크롤 뷰로보기를 바꾸고 위의 재사용 가능한 코드를 추가하는 것이 더 쉬웠다 고 생각했습니다. 당신이 그것을 고쳤다 니 반가워! 프로젝트를 잘 돌보고 행운을 빈다. – RLoniello

+0

그것에 대해 잘 알고, 나는이 방법을 사용한 적이 없지만 확실히 시도 할 것입니다. 감사 ! –

0

사용 self.view.layoutIfNeeded 코드 행() 그리고 당신이 정확한 높이를 받고 있지 않거나 키보드의 높이에 대한 확인하십시오.

감사합니다.

+0

고마워요.하지만 작동하지 않습니다. 코드 줄을 바꿨습니다. 또한보기에서 탐색 컨트롤러를 제거하면 잘 작동하므로 키보드의 높이가 옳습니다.또한 탐색 컨트롤러를 제거하고 segue에서 "애니메이션"상자의 선택을 취소해도 작동하지 않습니다. 무언가가 제약 조건을로드하지 못하게하고 어떤 애니메이션이있을 때 제약 조건이 제대로 작동하는 것처럼 보입니다. –

+0

왜 그 상자를 선택 취소 했습니까? 나는이 경우 제약이 작동하지 않을 것이라고 생각한다. – iDev750

+0

이전에 말했듯이 코드는 탐색 컨트롤러에서 작동하지 않습니다. –