私は3つの垂直スライダでコントロールを作成しようとしています。私は、スライダのドラッグ可能な点にそれらを結ぶ線を持たせたい。これを作る方法についてのアドバイス?Swiftで接続されたスライダーを作成するには?
答えて
UIBezierPath
を作成し、そのパスをCAShapeLayer
で使用し、そのレイヤーをサブレイヤとしてビューのlayer
に追加できます。
唯一の問題は、スライダーのthumbRectForBounds
を見ることで行の開始点と終了点を把握することです。そして、あなたは親の座標系にポイントを変換するようにしてください、あなたはそれを回転させるだけで、標準UISliderView
を使用して仮定:
class ViewController: UIViewController {
@IBOutlet weak var slider1: UISlider!
@IBOutlet weak var slider2: UISlider!
@IBOutlet weak var slider3: UISlider!
lazy var lineLayer: CAShapeLayer = {
let layer = CAShapeLayer()
layer.lineWidth = 3
layer.fillColor = UIColor.clearColor().CGColor
layer.strokeColor = UIColor.redColor().CGColor
return layer
}()
override func viewDidLoad() {
super.viewDidLoad()
[slider1, slider2, slider3].forEach { slider in
slider.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2))
}
view.layer.insertSublayer(lineLayer, atIndex: 0)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
lineLayer.frame = view.bounds
updatePathBetweenSliders()
}
@IBAction func didChangeValue(sender: UISlider) {
updatePathBetweenSliders()
}
private func updatePathBetweenSliders() {
let path = UIBezierPath()
path.moveToPoint(slider1.thumbCenter())
path.addLineToPoint(slider2.thumbCenter())
path.addLineToPoint(slider3.thumbCenter())
lineLayer.path = path.CGPath
}
}
どこ:
extension UISlider {
func thumbCenter() -> CGPoint {
let thumbRect = thumbRectForBounds(bounds, trackRect: trackRectForBounds(bounds), value: value)
let thumbCenter = CGPoint(x: thumbRect.midX, y: thumbRect.midY)
return convertPoint(thumbCenter, toView: superview)
}
}
それ利回り:
スライダーをアニメーション化するには(アニメーション化されたGIFの終わりのように)、スライダーを再作成する必要がありますCADisplayLink
にソートして値を更新してください:
let animationDuration = 0.5
var originalValues: [Float]!
var targetValues: [Float]!
var startTime: CFAbsoluteTime!
@IBAction func didTapResetButton(sender: UIButton) {
let sliders = [slider1, slider2, slider3]
originalValues = sliders.map { $0.value }
targetValues = sliders.map { _ in Float(0.5) }
startTime = CFAbsoluteTimeGetCurrent()
let displayLink = CADisplayLink(target: self, selector: #selector(handleDisplayLink(_:)))
displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
}
func handleDisplayLink(displayLink: CADisplayLink) {
let percent = Float((CFAbsoluteTimeGetCurrent() - startTime)/animationDuration)
let sliders = [slider1, slider2, slider3]
if percent < 1 {
for (index, slider) in sliders.enumerate() {
slider.value = (targetValues[index] - originalValues[index]) * percent + originalValues[index]
}
} else {
for (index, slider) in sliders.enumerate() {
slider.value = targetValues[index]
}
displayLink.invalidate()
}
updatePathBetweenSliders()
}
ありがとうございます。これは非常に便利でした。私は不思議です - 変換プロパティを使用せずにこれを行う方法はありますか?変形はオートアイトを遵守しないため、これらの垂直スライダをきれいに配置することは困難です。私はスタックビューでそれらを入れてみましたが、私が望むサイズを取得しようとしている間、あらゆる種類の問題に遭遇しました。 – kubernetes
私はそれらをスタックビューに入れようとしましたが、変換があったときにはもっと複雑になることがわかりました。私は自動レイアウトで変形スライダーを使用して上記をレンダリングし、それは驚くほどうまくいった(ストーリーボードは奇妙に見えたが)。しかし、複雑なことではないので、独自の垂直スライダコントロールを作成することもできます。そして、私は本当に見ていないと確かにすべてのために保証することはできませんが、そこにサードパーティ垂直スライダーコントロールがあると確信しています。 – Rob
- 1. FifoDiskQueue:以前に作成されたキューに接続する
- 2. Swift 3でキャッシュされたNSNumberFormatterを作成するには?
- 3. 接続されたコンポーネントが最大のサブグラフを作成する
- 4. Angular2で作成されたHTTP接続はどのように接続を終了しますか?
- 5. 接続を作成するには?
- 6. MATLABのスムーズに接続されたプロットを作成する方法は?
- 7. ダイナミックに作成されたQCheckBoxesのstateChangeイベントに接続
- 8. SSH - それが接続されたらコマンドは、SSH接続に接続されている初期接続
- 9. 同じ接続で作成されたテンポラリテーブルがストアドプロシージャに表示されない
- 10. 接続が失われた場合は、Goの再接続でnet.Dialを作成するには?
- 11. VERTX JS Eventbus接続が閉じた後に作成されて
- 12. SpringBootアプリケーションで作成されたJDBC接続プールスレッドを見つける方法は?
- 13. CSSスライダーは、私はCSSでスライダーを作成している
- 14. SFTP接続経由で最後に作成されたディレクトリに入る
- 15. WebMatrix.Data.Database.Openで作成した接続を閉じるには?
- 16. 接続されたアイテムでどのようにリストを作成しますか?
- 17. 別のアカウントで作成されたSQLデータベースを接続する方法
- 18. Python:pymysqlで拒否されたデータベース接続の例外を作成する
- 19. 水平線で接続されたボタンを作成する方法
- 20. 永続的接続を作成する
- 21. 接続が作成されたときにsqlステートメントを実行する
- 22. 動的に作成されたデータベースへの接続を管理する方法
- 23. Azure DBに接続された "Mirth connect"チャンネルの作成に失敗する
- 24. データベース接続に失敗しました:AD接続を作成できません:[DB接続](接続)
- 25. 2つのドメインに接続されたCSRを生成する
- 26. 接続された画面の名前を取得Swift
- 27. C#で非ブロッキングソケットコールを作成して接続状態を確認するにはどうすればよいですか?ソケット上に接続されたプロパティの
- 28. mysqlworkbenchで作成したローカルデータベースにphpmyadminを接続する
これを行うにはどうすればよいですか? –