Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- SWIFT
- Human interface guide
- 클린 코드
- Observable
- MVVM
- Refactoring
- 애니메이션
- collectionview
- 리팩토링
- ribs
- rxswift
- Xcode
- ios
- clean architecture
- map
- tableView
- swift documentation
- combine
- UICollectionView
- UITextView
- Protocol
- uiscrollview
- 리펙토링
- Clean Code
- uitableview
- 스위프트
- HIG
- RxCocoa
- 리펙터링
- swiftUI
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] UIButton 하나로 토글 버튼 구현 방법 (+ RxSwift, RxCocoa, isHighlighted, withLatestFrom) 본문
iOS 기본 (swift)
[iOS - swift] UIButton 하나로 토글 버튼 구현 방법 (+ RxSwift, RxCocoa, isHighlighted, withLatestFrom)
jake-kim 2022. 4. 26. 23:43
UIButton 하나로 토글 버튼 구현 방법
- UIButton에는 normal, selected, highlighted가 존재
- normal과 selected 상태를 이용하여 토글 버튼으로 활용
- highlighted애니메이션은 setImage(_:for:) 에서 for부분에 적용
- normal -> highlighted 애니메이션은 for: .highlighted로 설정
- selecte -> highlighted 애니메이션은 배열로 선언 [.selected, .highlighted]
button.setImage(UIImage(named: "play"), for: .normal)
button.setImage(UIImage(named: "play-pressed"), for: .highlighted)
button.setImage(UIImage(named: "stop"), for: .selected)
button.setImage(UIImage(named: "stop-pressed"), for: [.selected, .highlighted])
RxSwift, RxCocoa를 사용하여 버튼 처리
- Button의 isHighlighted 상태를 구독하여, isSelected 상태를 토글의 상태로 파악하고 적용
- isHighlighted, isSelected를 Rx Extension 추가
extension Reactive where Base: UIControl {
public var isHighlighted: Observable<Bool> {
self.base.rx.methodInvoked(#selector(setter: self.base.isHighlighted))
.compactMap { $0.first as? Bool }
.startWith(self.base.isHighlighted)
.distinctUntilChanged()
.share()
}
public var isSelected: Observable<Bool> {
self.base.rx.methodInvoked(#selector(setter: self.base.isSelected))
.compactMap { $0.first as? Bool }
.startWith(self.base.isSelected)
.distinctUntilChanged()
.share()
}
}
- 버튼의 상태관리를 위해서 computed proprety로 observable 정의
- onPlayButtonPressed: isHighlighted를 받았을 때 withLatestFrom 연산자로 isSelected 상태를 받아서 현재 상태 확인
private var onPlayButtonPressed: Observable<Bool> {
self.button.rx.isHighlighted
.filter { $0 == true }
.withLatestFrom(self.button.rx.isSelected)
.map { !$0 }
}
var playButtonTapObservable: Observable<Void> {
self.onPlayButtonPressed
.filter { $0 == false }
.map { _ in return Void() }
.asObservable()
}
var stopButtonTapObservable: Observable<Void> {
self.onPlayButtonPressed
.filter { $0 == true }
.map { _ in return Void() }
.asObservable()
}
- 버튼이 탭 될때마다 selected상태를 변경해주어야 하므로, onPlayButtonPressed를 구독하여 처리
self.onPlayButtonPressed
.bind(to: self.button.rx.isSelected)
.disposed(by: self.disposeBag)
'iOS 기본 (swift)' 카테고리의 다른 글
[iOS - swift] ContentHugging, ContentCompressionResistance 디폴트 값 (defaultLow, defaultHigh), autolayout과의 우선순위 (0) | 2022.05.18 |
---|---|
[iOS - swift] NSLock(), Thread Safe 개념 (2) | 2022.04.28 |
[iOS - swift] allSatisfy 연산자 (Collection, Sequence 개념) (0) | 2022.04.23 |
[iOS - swift] rethrows 예외 처리, 에러 처리 (0) | 2022.04.15 |
[iOS - swift] JSON 문자열 날짜, snake_case 디코딩 (JSON Decoding, Strategy) (0) | 2022.04.13 |
Comments