iMessage 입력 UI와 같은 키보드 표시와 연동하는 UI 만들기 with RxSwift, RxKeyboard
개요
이미지

샘플 리포지토리
환경
간략한 개요
RxKeyboard
라이브러리를 사용하여 키보드의 높이를 가져오고 텍스트 입력 UI의 BottomLayoutConstraint
에 반영합니다.라이브러리 도입
Podfile pod 'RxSwift'
pod 'RxCocoa'
pod 'RxKeyboard'
pod 'RxOptional'
UI 준비
ViewController (파란색에 텍스트 입력 UI 배치)
텍스트 입력 UIView


ViewController
ViewController.swiftimport UIKit
import RxSwift
import RxCocoa
import RxKeyboard
class ViewController: UIViewController {
@IBOutlet weak var messageInputView: MessageInputView!
@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupMessageInputView()
}
private func setupMessageInputView() {
RxKeyboard.instance.visibleHeight
.drive(onNext: { [weak self] keyBoardHeight in
self?.messageInputViewBottomConstraint.constant = -keyBoardHeight
self?.view.layoutIfNeeded()
})
.disposed(by: disposeBag)
}
}
ViewController.xib

@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
pod 'RxSwift'
pod 'RxCocoa'
pod 'RxKeyboard'
pod 'RxOptional'
ViewController (파란색에 텍스트 입력 UI 배치)
텍스트 입력 UIView


ViewController
ViewController.swiftimport UIKit
import RxSwift
import RxCocoa
import RxKeyboard
class ViewController: UIViewController {
@IBOutlet weak var messageInputView: MessageInputView!
@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupMessageInputView()
}
private func setupMessageInputView() {
RxKeyboard.instance.visibleHeight
.drive(onNext: { [weak self] keyBoardHeight in
self?.messageInputViewBottomConstraint.constant = -keyBoardHeight
self?.view.layoutIfNeeded()
})
.disposed(by: disposeBag)
}
}
ViewController.xib

@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
import UIKit
import RxSwift
import RxCocoa
import RxKeyboard
class ViewController: UIViewController {
@IBOutlet weak var messageInputView: MessageInputView!
@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupMessageInputView()
}
private func setupMessageInputView() {
RxKeyboard.instance.visibleHeight
.drive(onNext: { [weak self] keyBoardHeight in
self?.messageInputViewBottomConstraint.constant = -keyBoardHeight
self?.view.layoutIfNeeded()
})
.disposed(by: disposeBag)
}
}

@IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
간략한 설명
// RxKeyboard.instance <- シングルトンインスタンス
RxKeyboard.instance.visibleHeight
.drive(onNext: { [weak self] keyboardHeight in
// keyboardの高さが変わるたびに呼ばれる
self?.messageInputViewBottomConstraint.constant = -keyboardHeight
// Viewの更新
self?.view.setNeedsLayout()
self?.view.layoutIfNeeded()
})
.disposed(by: disposeBag)
그 밖에도
// RxKeyboard.instance <- シングルトンインスタンス
RxKeyboard.instance.visibleHeight
.drive(onNext: { [weak self] keyboardHeight in
// keyboardの高さが変わるたびに呼ばれる
self?.messageInputViewBottomConstraint.constant = -keyboardHeight
// Viewの更新
self?.view.setNeedsLayout()
self?.view.layoutIfNeeded()
})
.disposed(by: disposeBag)
visibleHeight
는 키보드가 숨겨져있을 때 0을 흘리지 만 스크롤 뷰의 contentOffset을 조정할 때는 적합하지 않으므로 0을 흘리지 않습니다. willShowVisibleHeight
// contentOffset
RxKeyboard.instance.willShowVisibleHeight
.drive(onNext: { keyboardVisibleHeight in
scrollView.contentOffset.y += keyboardVisibleHeight
})
.disposed(by: disposeBag)
frame
를 취득할 수도 있는 것 같다(무엇에 사용할까? 
more detail
Reference
이 문제에 관하여(iMessage 입력 UI와 같은 키보드 표시와 연동하는 UI 만들기 with RxSwift, RxKeyboard), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k0uhashi/items/671ec40520967bc3949f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)