일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- scrolling tab
- UIViewControllerTransitioningDelegate
- 스크롤 탭
- Android
- Tuist
- pod install
- swift
- swift #swift keychain #keychain 사용법
- ViewBuilder
- 상단 탭바
- convert base64
- url 추적
- url 관찰
- SwiftUI
- base64 변환
- DataBinding
- oberve url
- development language
- detect url
- DevelopmentRegion
- Swift Package Manager
- transformation.map
- UIPresentationController
- notifychanged
- GeometryReader
- ios
- Side Menu
- List
- 기존 앱
- 개발자 면접
- Today
- Total
버그 잡이
ScrollView(or tableView) 에서 Button Highlight 효과 주기 본문
delaysContentTouches
처음 문제는 tableView 안에 있는 버튼에 highlight 효과가 먹지 않는 것이었습니다.
구글링을 해보니
tableView.delaysContentTouches = false
delaysContentTouches 속성을 false로 주면 highlight 효과가 발휘됩니다.
위 효과는 touch-down gesture를 지연시키는 속성으로 deafault 값은 true 입니다.
터치가 button을 위한 것이 아닌 scroll을 위한 touch-down 일 수 있기 때문에 이를 판단하기 위해서 잠시 지연시키는 것입니다.
scrollView 안에 있는 button을 빠르게 클릭하면 highlight 효과가 먹고, 길게 꾸욱 누르는 경우 highlight 효과가 먹는 것을 볼 수 있는데 이는 바로 위에서 말한 delay 때문에 발생하는 현상입니다.
그런데 위 속성을 false로 하는 것은 치명적인 단점이 있습니다.
버튼 영역을 클릭하여 스크롤 하면 스크롤이 되지 않습니다...
(스크롤인지 판단할 수 있는 시간을 주지 않았기 때문에 그저 button 터치로 인식하는 것이지요.)
스크롤도 잘 되고 highlight 효과도 주고 싶으면 어떻게 해야 될까요?
touchedShouldCancel(in:)
tableView에 있는 인스턴스 메서드로
"subView의 터치를 취소하고, 드래깅을 시작할지" 알려줍니다.
True -> 드래깅
False -> 드래깅을 중지하고 subview로 터치 전달한다.
touch를 받은 객체가 UIControl이면 false를 리턴 합니다.
(UIButton이 대표적인 UIControl 객체이죠.)
그래서 UIButton일때도 true를 리턴하도록 예외처리를 하면 드래깅이 가능하게 됩니다.
class HighlighTableView: UITableView {
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancel(in: view)
}
}
discussion을 보면 아래와 같은 내용이 있습니다.
"만약 scrollView의 canCancelContent 값이 false면 이 메서드를 호출하지 않는다."
-> 이 속성을 줘야 touchShouldCancel(in:) 메서드를 사용할 수 있습니다.
tableView.canCancelContentTouches = true
정리
스크롤뷰 안에 있는 버튼이 있는데,
스크롤도 잘 되고 버튼 highlight 효과도 주고 싶으면 어떻게 해야 될까요?
1. 아래 두 속성을 준다.
tableView.delaysContentTouches = false
tableView.canCancelContentTouches = true
2. 그냥 tableView(또는 scrollView, collectionView)는 안 되고 touchShouldCancel()을 오버라이드한 tableView를 사용해야한다.
(button 클릭시에도 드래깅을 멈추지 않도록 예외처리를 해준다)
class HighlighTableView: UITableView {
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancel(in: view)
}
}
참고
www.rightpoint.com/rplabs/fixing-controls-and-scrolling-button-views-ios