1. 슬라이드 아웃 메뉴 만들기
2. 슬라이드 아웃 메뉴에 인터렉티브 스테이터스 바 구현하기
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8893065f-2f1f-4ea8-ba7b-4cb4a77cb11c/190527.mp4
이슈
접근
마주한 문제
해결
이슈
접근
마주한 문제
트랜지션이 완료되었지만 스테이터스 바가 절반만 보인다
해결
// <https://developer.apple.com/documentation/uikit/uiviewcontroller/1621354-setneedsstatusbarappearanceupdat>
// setNeedsStatusBarAppearanceUpdate()
Indicates to the system that the view controller status bar attributes
have changed.
...
isStatusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
isStatusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
...
올바른 해결책인지는 모르지만 잘 작동하게 되었다.
약간의 코드를 남겨 두겠다.
// BaseSlidingViewController.swift
private var isStatusBarHidden = false
private var statusBarAnimator = UIViewPropertyAnimator()
override var prefersStatusBarHidden: Bool {
return self.isStatusBarHidden
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
/**
팬 제스쳐 이벤트에 대한 메소드입니다.
- 팬 제스쳐의 진행률에 따라 baseMainViewLeftConstraint와 baseMainViewRightConstraint의 값이 변합니다.
- 두 컨스트레인트가 변하면서 뷰 컨트롤러가 좌에서 우로 트랜지션됩니다.
*/
@objc private func handlePan(gesture: UIPanGestureRecognizer) {
...
...
panGestureState(progress, of: gesture)
}
/**
제스처의 상태와 진행률에 따라 화면이 사용자와 상호작용합니다.
- case. began:
- 상태 바를 보여줄 것인지 결정합니다. 그리고 statusBarAnimator의 상태를 Active 상태로 옮깁니다.
- case. changed:
- 진행률에 따라 상태 바 애니메이션을 진행합니다.
- case. ended:
- 상태 바의 애니메이션을 멈춥니다.
- 패닝이 진행된 거리나 속도 정보를 기반으로, 슬라이드 메뉴를 열리게 할 것인지 닫히게 할 것인지 결정합니다.
*/
private func panGestureState(_ progress: CGFloat, of gesture: UIPanGestureRecognizer) {
switch gesture.state {
case .began:
isStatusBarHidden = !isStatusBarHidden
statusBarAnimator = UIViewPropertyAnimator(
duration: 0.1,
curve: .easeOut,
animations: {
self.setNeedsStatusBarAppearanceUpdate()
})
statusBarAnimator.startAnimation()
statusBarAnimator.pauseAnimation()
case .changed:
statusBarAnimator.fractionComplete = isStatusBarHidden ? progress : 1-progress
case .ended:
statusBarAnimator.stopAnimation(true)
handleEnded(gesture: gesture)
default:
()
}
}