cozzin
코찐 기술 블로그
cozzin
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin
    • 백엔드
    • iOS
      • Swift
      • SwiftUI
      • Combine
      • Architecture
    • 개발환경
    • 세미나
    • 생각정리
    • 스터디
    • CS
      • Refactoring
      • OS

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • LinkedIn
  • 강의

공지사항

인기 글

태그

  • darkmode
  • ios
  • 워닝제거
  • CS
  • Ribs
  • WWDC
  • XCode
  • slide-over
  • 운영체제
  • Warning
  • os
  • SwiftUI
  • 테스트
  • 컴퓨터공학
  • 디자인패턴
  • Combine
  • 리팩토링
  • WWDC21
  • Swift
  • multicast

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cozzin

코찐 기술 블로그

iPad Slide-over 키보드 높이 계산 이슈 해결
iOS

iPad Slide-over 키보드 높이 계산 이슈 해결

2021. 6. 15. 15:34
반응형

카페앱에 이번 버전 부터 iPad slide over를 지원하게 되었는데요.

sldie over가 뭐냐면 패드에서 한켠에 둥둥 띄워서 쓸 수 있는 기능입니다.

 

https://support.apple.com/ko-kr/guide/ipad/ipadfe7c65e9/ipados

 

그러면서 생각지도 못했던 이슈가 발생했습니다.

키보드 높이 계산이 잘못되어서 하단에 떠있는 만큼 키보드가 위로 더 들려있는 현상이 발생했습니다ㅠ

 

 

알고보니 기존에는 앱이 Screen을 세로로 꽉채우는 개념으로 되어 있어서 이슈가 안생기고 있었습니다.

아래와 같은 개념이라서 Screen.height - Keyboard.minY를 빼주면 키보드 높이를 구할 수 있었습니다.

 

그런데 이제는 앱이 둥둥 떠있게 되면서 고려해줘야하는게 늘었습니다.

Screen.height - keyboard.minY - 하단 떠있는 높이 = 키보드 높이 가 됩니다.

 

그러면 하단에 떠있는 높이는 어떻게 구할까? 하는 의문이 생깁니다.

Screen이랑 Window 크기를 구해서 1/2 로 나누면 위 아래 영역을 구할 수 있습니다.

public extension UIWindow {

    var floatingMargin: CGFloat {
        let screen = UIScreen.main.bounds
        let window = self.bounds

        if screen.height > window.height {
            return (screen.height - window.height) / 2
        } else {
            return 0
        }
    }
}

 

이렇게 해서 일단 현상은 해결했는데요...

1/2로 나누는게 썩 좋은 방법같아 보이진 않았습니다.

나중에 OS가 변경되면서 위아래 플로팅 영역이 동일하지 않게될 수도 있기 때문입니다.

그리고 태운님의 오픈소스에도 컨트리뷰트 하고 싶었기 때문에 조금 더 제대로 된 해결책을 고민해봤습니다.

(일단 이슈부터 등록해두고 고민 시작... https://github.com/Kofktu/KUIKeyboard/issues/6)

 

UIScreen을 기준으로 보면 플로팅 영역을 계산할 수 있겠다는 생각이 들었습니다.

어떻게 스크린 기준으로 계산을 할까 고민하면서 들여다봤습니다.

coordinateSpace 라는 프로퍼티가 있다는 것을 발견했습니다.

 

 

이걸 활용해서 키보드 frame을 convert 해주면 window의 위치를 파악할 수 있습니다.

이걸 반영해서 만든 코드는 다음과 같습니다.

 

extension UIWindow {
    var floatingAreaInsets: UIEdgeInsets {
        let converted = convert(frame, to: screen.coordinateSpace)

        return UIEdgeInsets(
            top: converted.minY,
            left: converted.minX,
            bottom: screen.bounds.height - converted.maxY,
            right: screen.bounds.width - converted.maxX
        )
    }
}

 

사실 이번 이슈에서는 floatingAreaInsets.bottom 만 필요하겠지만 나중을 위해서 UIEdgeInsets 으로 만들었습니다.

이 inset 을 반영해서 회사앱에 반영하고 PR도 올렸습니다. (https://github.com/Kofktu/KUIKeyboard/pull/7)

 

혹시나 조금 더 좋은 해결책이 나오면 또 업데이트 하겠습니다.

감사합니다 :)

반응형
저작자표시

'iOS' 카테고리의 다른 글

[WWDC21] Ultimate application performance survival guide  (0) 2021.07.08
Main Thread 무한 루프 문제해결 과정  (0) 2021.06.14
커스텀 UIInputView height에 SafeArea 반영하기  (0) 2021.04.28
Swift 객체 외부에서 객체가 해제되는 것 감지하기  (0) 2021.04.20
@testable import로 연결한 모듈에서 Undefined symbol이 발생하는 이슈 대응  (0) 2021.04.17
    'iOS' 카테고리의 다른 글
    • [WWDC21] Ultimate application performance survival guide
    • Main Thread 무한 루프 문제해결 과정
    • 커스텀 UIInputView height에 SafeArea 반영하기
    • Swift 객체 외부에서 객체가 해제되는 것 감지하기
    cozzin
    cozzin
    Software Engineer

    티스토리툴바