먼저 레이아웃을 설명합니다. 두 개의 UITextfield가있는 UIView가 있습니다. 텍스트 필드 중 하나를 선택할 때 UIView가 위로 이동하여 텍스트 필드가 키보드에 의해 덮이지 않도록하고 싶습니다. 일반적인 해결책은 분명하며 이미 구현되었습니다 : keyboardWillHide
및 keyboardWillShow
. 하나의 텍스트 필드를 선택하면 UIView가 예상대로 작동하지만 하나의 텍스트 필드가 선택된 후 다음 텍스트 필드가 선택되면 UIVIEW가 원래의 제약 조건에 다시 스냅되고 다시 keyboardWillShow
이 다시 호출되는 경우에도 재조정되지 않습니다.iOS Swift - 여러 UITextFields UIView로 이동
원하는 효과를 얻는 방법 : 텍스트 필드를 선택하면 UIView가 위로 이동하고 다음 텍스트 필드가 선택되면 UIView가 정확히 동일한 위치에 유지됩니다.
현재 두 번째 텍스트 입력란에서 UIView가 재설정되는 이유는 무엇입니까?
관련 코드는 다음과 같습니다.이 기능은 VDL에 설정되어 있습니다. 다른 코드는 텍스트 필드에 닿지 않습니다. 이러한 텍스트 필드가 현재 컨텍스트를 통해 모달 뷰에서 발생한다는 것을 언급 할 가치가 있습니다. 또한 가치 키보드 유형의 decimalPad
// MARK: - keyboard Controls
func keyboardWillShow(notification:NSNotification) {
print("Keyboard show")
if isKeyboardOffset == false {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("Keyboard show... \(keyboardSize)")
self.viewToMove.frame.origin.y -= keyboardSize.height/2
}
isKeyboardOffset = true
}
}
func keyboardWillHide(notification:NSNotification) {
print("Keyboard hide")
if isKeyboardOffset == true {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("keyboard hide...")
self.viewToMove.frame.origin.y += keyboardSize.height/2
}
isKeyboardOffset = false
}
}
편집의 답변입니다 언급 :를 대신 우리가 UIViews 위치를 지시 레이아웃 제약을 업데이트 선택에 UIView의 위치를 조정 허용 대답에 명시된 바와 같이. keyboardWillShow
func keyboardWillShow(notification:NSNotification) {
if isKeyboardOffset == false {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("Keyboard show... \(keyboardSize)")
self.topConstraint.constant -= 100
}
isKeyboardOffset = true
}
}
그래서 첫 번째 텍스트 필드를 누르면 예상대로 작동합니다. 그러나 처음에 여전히 선택되어있는 동안 두 번째 탭을 탭하면 위로 올라갑니다. 또는 아무것도 테이핑하기 전에 원본으로 되돌립니다. –
IQKeyboardManager 사용 –
@CharlieFish 올바른 두 번째 탭에서 원본으로 되돌리고 위로 이동하지 마십시오. 첫 번째 텍스트 필드 선택 -> UIVIew가 예상대로 위로 이동 -> 두 번째 탭 (첫 번째 선택 취소하지 않음) -> UIVIew가 원래 프레임으로 되돌아갑니다. – Jerland2