ios - 해상도 - 아이폰x ui 대응




추가 공간을 보여주는 iPhone X 키보드가 나타납니다. (3)

UIKeyboardFrame Begin UserInfoKey에서보고 한 키보드 값은 iPhone X의 두 가지 경우에서 다릅니다.

  • 키보드가 표시되지 않고 텍스트 필드가 첫 번째 응답자가됩니다.
  • 키보드가 이미 표시되어 있고 다른 텍스트 필드가 첫 번째 응답자가됩니다.

키보드의 키보드 높이 (안전 영역 인세 트 포함)를 얻으려면 UIKeyboardFrame End UserInfoKey를 사용하십시오.

iOS 11 (특히 iPhone X)에서는 안전 영역 밑의 인세 트를 빼는 것을 고려할 수 있습니다.

    NSValue *keyboardEndFrameValue = notification.userInfo[UIKeyboardFrameEndUserInfoKey];
    if (keyboardEndFrameValue != nil) {
        CGRect keyboardSize = [keyboardEndFrameValue CGRectValue];
        _keyboardHeight = keyboardSize.size.height;
        if (@available(iOS 11.0, *)) {
            CGFloat bottomSafeAreaInset = self.view.safeAreaInsets.bottom;
            _keyboardHeight -= bottomSafeAreaInset;
        } else {
            // Fallback on earlier versions
        }
    }

나는 화면의 하단에 tableView 에 대한 constraint 을 추가 한 채팅 UI를 만들었습니다. iPhone X를 제외한 모든 장치에서 올바르게 작동하는 키보드 높이를 추가하여 제한 값을 변경하고 있습니다.

키보드가 보이지 않을 때의 UI :

어느 쪽이야.

키보드가 나타날 때 문제가 발생합니다. textView와 키보드 사이에 빈 공간이 표시됩니다.

이를 위해 다른 접근법을 시도해야합니까 아니면 제약 조건을 사용하여 해결할 수 있습니까?


제약 조건의 값을 계산할 때 안전 영역의 아래쪽 삽입물 높이를 빼내십시오.

다음은 UIKeyboardWillChangeFrame 알림을 처리하는 샘플 구현입니다.

@objc private func keyboardWillChange(_ notification: Notification) {
    guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
    let newHeight: CGFloat
    if #available(iOS 11.0, *) {
        newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
    } else {
        newHeight = value.cgRectValue.height
    }
    myConstraint.value = newHeight
}

Swift 4 iPhone X 작동하려면 Nathan의 대답을 약간 조정해야했습니다. 이건 100 %.

참고 : 스토리 보드에서보기 컨트롤러의 안전 영역 하단까지 텍스트 뷰 / 뷰의 하단 구속 조건에서 컨트롤을 드래그하고 대상 뷰 컨트롤러 인 Project Navigator에서 컨트롤을 드래그하고 콘센트를 생성했는지 확인하십시오. 내 예제에서는 bottomConstraint로 이름을지었습니다. 내 텍스트 입력 필드는보기 (messageInputContainerView)에 래핑되어 추가 송신 버튼 정렬 등을 허용합니다.

다음은 코드입니다.

@objc private func keyboardWillChange(_ notification: Notification) {
    guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }

    if ((userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
        let isKeyboardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow
        var newHeight: CGFloat
        if isKeyboardShowing {
            if #available(iOS 11.0, *) {
                newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
                bottomConstraint.constant = newHeight

            }
        }
        else {
            newHeight = value.cgRectValue.height
            bottomConstraint?.constant = view.safeAreaInsets.bottom + messageInputContainerView.bounds.height

        }
    }
}




iphone-x