UISlider
の Thumb (つまみ) を Youtube アプリのプレーヤーのようにアニメーションで表示/非表示を切り替えたいなというきっかけ。
環境
- Swift 4.2
- Xcode 10.1
コード
// 1. Thumb の UIImageView を取得
extension UISlider {
var currentThumbImageView: UIImageView? {
guard let image = self.currentThumbImage else { return nil }
return self.subviews.compactMap({ $0 as? UIImageView }).first(where: { $0.image == image })
}
}
// 2-1. 表示
UIView.animate(withDuration: 0.3) {
self.slider.currentThumbImageView?.transform = CGAffineTransform(scaleX: 1, y: 1)
}
// 2-2. 非表示
UIView.animate(withDuration: 0.3) {
self.slider.currentThumbImageView?.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
}
ポイント
// 1. Thumb の UIImageView を取得
手軽にできない理由が、 UISlider
には var currentThumbImage: UIImage?
プロパティで Thumb の UIImage
は取れるのに、 UIImageView
を取るプロパティがないということです。
subviews[2]
が基本的に Thumb の UIImageView
のようですが、念の為上記コードのようにセーフティに取得しています。
// 2. 表示, 非表示
もうあとは transform で変化させるだけです。ご自由にどうぞ。
今回の例でいうと、非表示にするとき CGAffineTransform(scaleX: 0, y: 0)
とするのはエラーとなりますのでご注意ください。
おまけ
ただ Thumb を消すだけで良ければ下記でOK。
slider.setThumbImage(UIImage(), for: .normal)