일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
Tags
- reactorkit
- RxSwift
- Apple Enterprise
- 테이블뷰 밀어서 삭제
- 로그출력
- iOS 광고달기
- print vs dump
- 화면 가리기
- testflight error
- CryptoSwift
- snapkit
- archive error
- 소셜로그인
- Business Manager
- AppleLogin
- MVVM
- color 변경
- 로그 찍기
- 비공개 앱 배포
- 테이블뷰 셀 밀어서 삭제
- navigationbar
- 하단 네비게이션바
- failed: No such file or directory (2)
- 스토리보드 없이
- then
- 테이블 뷰
- 아카이브 에러
- RxCocoa
- 백그라운드 진입시 화면
- codebase
Archives
- Today
- Total
ukSeung iOS
[Swift] ScrollView 스크롤 네비게이션바 hide On/Off 본문
안녕하세요 욱승입니다.
이번 포스팅에서는 스크롤뷰를 이용한 네비게이션 바를 올렸다 내렸다 하는 작업을 구현해볼게염 ㅋ
이게 무슨소리냐.. 하믄
인스타그램만 봐도 피드형식의 홈화면은
스크롤을 내리면 네비게이션바가 숨겨지고 / 스크롤을 올리면 네비게이션바가 나타나고
이러한 방식이 필요한 이유?
- 사용자 경험 개선: 스크롤 네비게이션바를 숨기면 사용자는 화면에 더 많은 콘텐츠를 볼 수 있습니다. 특히, 작은 화면 크기를 가진 모바일 장치에서 스크롤 네비게이션바를 숨기면 콘텐츠 영역이 더 커져 사용자가 더 많은 내용을 스크롤하고 탐색할 수 있습니다.
- 디자인 요소 제어: 스크롤 네비게이션바를 숨기면 앱 또는 웹 페이지의 디자인 요소를 더욱 강조할 수 있습니다. 스크롤 네비게이션바가 콘텐츠와 함께 계속 보이면 시각적인 혼잡감을 줄일 수 있으며, 사용자가 더 명확하게 콘텐츠에 집중할 수 있습니다.
- 공간 활용: 스크롤 네비게이션바를 숨기면 더 많은 공간을 활용할 수 있습니다. 특히, 스크롤 네비게이션바가 상단이나 하단에 고정되어 있는 경우, 해당 공간을 콘텐츠에 할당하여 더 많은 정보를 표시하거나 기능을 추가할 수 있습니다.
- 사용자 설정 및 개인화: 일부 앱이나 웹 페이지는 사용자가 스크롤 네비게이션바의 표시 여부를 사용자 설정으로 변경할 수 있도록 제공합니다. 이를 통해 사용자는 자신의 선호에 맞게 스크롤 네비게이션바를 보여줄지 숨길지 결정할 수 있습니다.
이러한 이유들로 인해 스크롤 네비게이션바의 hide On/Off 기능이 필요할 수 있으며, 개발자는 해당 기능을 구현하여 사용자 경험과 디자인을 개선하고 화면 공간을 효과적으로 활용할 수 있습니다.
결론 => 사용자가 화면에 더 많은 콘텐츠를 볼수있어서
샤라웃 gpt
예제
예제 코드
import Foundation
import UIKit
class View0Cotnroller: UIViewController, ViewAttribute {
var navTitle: String?
var lastContentOffset: CGFloat = 0.0
lazy var testLabel = UILabel().then {
guard let title = navTitle else {
return
}
$0.text = "\(title)"
$0.sizeToFit()
$0.textAlignment = .center
$0.textColor = .white
}
lazy var scrollView = UIScrollView().then {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.layer.borderWidth = 1
$0.isScrollEnabled = true
$0.delegate = self
}
lazy var contentView = UIView().then {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.backgroundColor = .systemBlue
}
override func viewDidLoad() {
super.viewDidLoad()
setNavigtaionBar()
setUI()
setAttributes()
}
/// 네비게이션 바 init
func setNavigtaionBar() {
guard let title = navTitle else { log("no navTitle"); return }
self.navigationItem.title = title
}
/// UI Set
func setUI() {
self.navigationController?.navigationBar.isHidden = false
self.view.backgroundColor = .white
self.view.addSubview(scrollView)
scrollView.addSubview(contentView)
contentView.addSubview(testLabel)
}
/// Attribute Set
func setAttributes() {
scrollView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
contentView.snp.makeConstraints {
$0.top.bottom.width.equalToSuperview()
$0.height.equalTo(2000)
}
testLabel.snp.makeConstraints {
$0.left.equalTo(20)
$0.right.equalTo(-20)
$0.top.equalTo(550)
}
scrollView.contentSize = contentView.bounds.size
}
/// RxSwift (미사용)
func bindRx() {
}
}
extension View0Cotnroller: UIScrollViewDelegate {
/// 스크롤 뷰 올리고 내리는거에 따라 scrollView Hide ON/OFF
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
if offsetY > lastContentOffset && offsetY > 0 { // 스크롤을 아래로 내리는 중이고, offsetY가 0보다 클 때
UIView.animate(withDuration: 0.3) {
self.navigationController?.setNavigationBarHidden(true, animated: true)
}
} else if offsetY < lastContentOffset { // 스크롤을 위로 올리는 중
UIView.animate(withDuration: 0.3) {
self.navigationController?.setNavigationBarHidden(false, animated: true)
}
}
lastContentOffset = offsetY
}
}
코드의 가독성을 높이기 위해 Then, SnapKit을 사용했슴당
결론
이런식의 구현은 요즘 추세에 필요한 구현 방식이니
나중에 할일이 있으면 가볍게 해보자 ㅋ
GitHub
728x90
반응형
'iOS > Swift' 카테고리의 다른 글
[Swift] RxSwift+MVVM, Sign In with Apple 애플 로그인 (0) | 2023.05.23 |
---|---|
[Swift] UITableView Cell 밀어서 삭제 (0) | 2023.05.21 |
[Swift] UITabbar, 하단 탭바 구현 (0) | 2023.04.30 |
[iOS] Background, Inactive(Foreground) 진입시 화면가리기 (0) | 2023.03.23 |
[Swift] print와 dump차이, 콘솔에 로그찍기 Console Log (0) | 2023.03.16 |