2

一部のコードを XCode 8 Beta 6 に移行しています。これは、XCode 8 Beta 1 まではかなりうまく機能していました (以前は 7.3 から移行されていました)。元のスライダーの組み込みのものよりも大きなカスタム サム イメージを使用する場合のスライダーの新しい奇妙な動作を除いて、すべてが機能しています。

override func viewDidLoad() {
    super.viewDidLoad()
    sliderBuggy.setThumbImage(UIImage(named: "actionRobotDelay.png"), for: UIControlState())
}
  • 正しい動作:ベータ 6 より前に、新しいサム イメージを設定すると、トラッキング エリアが自動的に調整され、ユーザーはイメージ内の任意のポイントからスライドできます (注: シミュレーターではなく、実際の iPad mini でテストしています。 iPhoneではまったく試していません)。

  • 現在何が起こっているか:画像を変更した後、見た目は問題ありませんが、ユーザーがスライドできるトラッキング領域は、元のスライダーの組み込み画像の小さな領域のままです。これは、ユーザーの観点からは非常に迷惑です。

私がこれまでに試したこと:

  1. thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) のサブクラス化とオーバーライド -> CGRect. 悲しいことに、デバッグ後、メソッドが正しい新しい CGRect を返していることがわかったので、変更しても効果はありません。

  2. touches のオーバーライドは、スライダーがタッチ イベントを認識している場所の評価を開始したため、考えられる回避策として、追跡を手動で開始することができました。しかし touchesBegan は、タッチ イベントが元の画像に属する小さな領域でのみ受信されたことを明確に示しました。

独自のスライダー クラスをゼロから作成する前に、別の可能な回避策についてのアイデアを歓迎します。

4

1 に答える 1

4

スライダーがすべきことを実行するためのサブクラス化とマンジ ヒット テスト (なぜそれが行われていないのか誰にもわかりません):

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let tr = self.trackRect(forBounds: self.bounds)
    if tr.contains(point) { return self }
    let r = self.thumbRect(forBounds: self.bounds, trackRect: tr, value: self.value)
    if r.contains(point) { return self }
    return nil
}
于 2016-08-24T16:29:26.523 に答える