일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 앱 백그라운드 푸시 데이터 저장
- 푸시 데이터 저장
- 노티피케이션 익스텐션
- 스위프트 웹뷰
- NotificationService Extension
- flutter 회전
- 스위프트 테이블 뷰 셀
- 안드로이드 앨범
- 안드로이드 바로가기
- native flutter view
- 스위프트 카메라
- Swift flutterviewcontroller
- 스위프트 앨범
- swift sms
- Flutter NativeView
- 앱 꺼졌을 때 푸시 데이터 저장
- Flutter UIKitView MethodChannel
- 스위프트 푸시
- swift 문자
- swift autolayout
- silent push
- 스위프트 UserDefaults
- 스위프트
- 플러터 뷰 컨트롤러
- Swift flutterview
- 안드로이드 숏컷
- 안드로이드 에러
- FlutterView MethodChannel
- flutter rotate
- 안드로이드 FCM
- Today
- Total
Things take time
[SWIFT] UIScrollbar의 Scrollbar(indicator)접근하기 본문
[목표]
카카오톡처럼 앱을 사용하다보면 우측 스크롤바 옆에 텍스트 박스가 뜨는 경우가 있다. 이 텍스트 박스는 스크롤바(indicator)옆에 붙어서 같이 따라다니는데 이 기능을 추가해야해서 알아봤다.
결론은 저 스크롤뷰 안에있는 인디케이터에 접근할 수 있는 방법을 찾아봤다.
[코드]
override func scrollViewDidScroll(_ scrollView: UIScrollView) { DispatchQueue.main.async { self.indicatorView?.isHidden = false UIView.animate(withDuration: 0.5, animations: { self.indicatorView?.alpha = 1 }) let scrollIndicator = scrollView.subviews.last! let indicatorFrame = CGRect(x: scrollIndicator.frame.origin.x - 120, y: (scrollIndicator.frame.origin.y + (scrollIndicator.frame.height / 2) - 10), width: 100, height: 20) self.indicatorView!.frame = indicatorFrame } }
scrollViewDidScroll : 스크롤뷰 프로토콜에 있는 함수로써, 사용자가 스크롤뷰를 스크롤하기 시작하고 난 뒤에 호출된다. 이 함수에서 넘겨받는 scrollView안에 있는 subView 목록중에 가장 마지막 뷰가 바로 스크롤바, 인디케이터다.
그러므로 얻어낸 스크롤바의 origin 현재 값을 알아내서 스크롤바로부터 20이 떨어지고, 가운데 위치하도록 하는 것이다.
당연히 self.indicatorView는 UIlabel()이며 클래스 전역 변수로 선언해 주어야 한다.
움직일때는 버벅거림을 최소화하기 위해 직접 메모리로 상시 변경되도록 main async를 사용한다.
override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if(!decelerate){ UIView.animate(withDuration: 0.5, animations: { self.indicatorView?.alpha = 0 }, completion: { (complete) -> Void in self.indicatorView?.isHidden = true }) } }
위의 함수는 드래그가 끝났을 때 호출된다. 사용자가 드래그를 하다가 손을 뗐을 때를 의미한다.
여기서 넘겨받은 decelerate는 손을 뗐을때 속도가 감소중이냐 아니냐, 즉 스크롤이 현재 진행중이냐 아니냐를 의미한다.
if(!decelerate)가 의미하는건 사용자가 손을 떼고 다시 클릭해서 드래그가 멈추고 스크롤이 멈췄을 때를 의미한다.
override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { UIView.animate(withDuration: 0.5, animations: { self.indicatorView?.alpha = 0 }, completion: { (complete) -> Void in self.indicatorView?.isHidden = true }) }
이 함수는 스크롤이 계속 감소하다 완료 되었을 때를 의미한다. 즉 사용자가 드래그를 하고 손을 떼고 난뒤 그냥 가만히 있었을 때, 스크롤 바가 사라지는 그 시점을 감지하기 위함이다.
이렇게 하면 카카오톡 채팅방에서 스크롤할때 나오는 그 날짜! 그 기능과 동일한 것을 구현할 수 있다.
[출처]
https://stackoverflow.com/questions/32460973/uiview-that-follows-uicollectionview-indicator
'iOS (기능)' 카테고리의 다른 글
[SWIFT] 딜리게이트(Delegate) 패턴 사용하기 (1) | 2019.01.02 |
---|---|
[SWIFT] UIPageViewController 사용하기 (하나의 뷰 컨트롤러) (0) | 2018.12.31 |
[iOS] Reject : Guideline 4.2.6 (0) | 2018.12.13 |
[SWIFT] Static Cell을 사용하는 테이블 뷰의 커스터마이징(뷰 추가하기) (0) | 2018.06.19 |
[SWIFT] SMS 문자 메시지 보내기 (4) | 2018.05.23 |