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

8197 단어 iOSSwiftRxSwift

개요


  • iMessage, LINE과 같은 텍스트 입력 UI로 키보드의 표시에 맞추어 위치가 움직이는 View를 만든다

  • 이미지





    샘플 리포지토리


  • htps : // 기주 b. 코 m / 료 타카 하시 / ぃねんぷついえぁmp

  • 환경


  • Xcode 9.4
  • Swift 4.1
  • RxSwift 4.2
  • RxCocoa 4.2
  • RxKeyboard 0.8.3

  • 간략한 개요


  • RxKeyboard 라이브러리를 사용하여 키보드의 높이를 가져오고 텍스트 입력 UI의 BottomLayoutConstraint에 반영합니다.

    라이브러리 도입



    Podfile
      pod 'RxSwift'
      pod 'RxCocoa'
      pod 'RxKeyboard'
      pod 'RxOptional'
    

    UI 준비




    ViewController (파란색에 텍스트 입력 UI 배치)
    텍스트 입력 UIView






    ViewController



    ViewController.swift
    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)
        }
    }
    

    ViewController.xib




    @IBOutlet weak var messageInputViewBottomConstraint: NSLayoutConstraint!
    
  • ViewController의 constraint와 swift 코드를 연결한다

  • 간략한 설명


            // 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)
    
  • 그 밖에도 keyboard의 frame 를 취득할 수도 있는 것 같다(무엇에 사용할까?

  • more detail


  • htps : // 기주 b. 코 m / Rx 슈 ft
  • 좋은 웹페이지 즐겨찾기