2016-05-26 4 views
0

私は見て、私のために働く答えを見つけることができません。私はダブルノブスライダーコントロールを作成するためにUIControlをサブクラス化しました。私は、各ノブをボイスオーバーに使用できるようにしたい。これを行うにはアクセシビリティ増/減がない

、私はUIAccessibilityElementsを作成し、配列に追加:

func addAccessibilityElements() { 
    axKnobs = [] 

    let lowKnob = UIAccessibilityElement(accessibilityContainer: self) 
    lowKnob.accessibilityLabel = doubleKnob ? lowValueKnobAccessibilityLabel : valueKnobAccessibilityLabel 
    lowKnob.accessibilityPath = UIAccessibilityConvertPathToScreenCoordinates(knobBezierPath(lowKnobPoint), self) 
    lowKnob.accessibilityTraits = UIAccessibilityTraitAdjustable 
    lowKnob.accessibilityValue = "\(lowValue)" 

    axKnobs.append(lowKnob) 

    if doubleKnob, let highKnobPoint = highKnobPoint { 
     let highKnob = UIAccessibilityElement(accessibilityContainer: self) 
     highKnob.accessibilityLabel = highValueKnobAccessibilityLabel 
     highKnob.accessibilityPath = UIAccessibilityConvertPathToScreenCoordinates(knobBezierPath(highKnobPoint), self) 
     highKnob.accessibilityTraits = UIAccessibilityTraitAdjustable 
     highKnob.accessibilityValue = "\(highValue)" 

     axKnobs.append(highKnob) 
    } 
} 

これは完璧に動作するようです。これらのメソッドが呼び出され、インタフェースが正しく動作するようですされています

override func accessibilityElementCount() -> Int { 
    return axKnobs.count 
} 

override func indexOfAccessibilityElement(element: AnyObject) -> Int { 
    let index = axKnobs.indexOf(element as! UIAccessibilityElement)! 
    if index == 0 { 
     currentKnob = .Low 
    } else { 
     currentKnob = .High 
    } 

    return index 
} 

override func accessibilityElementAtIndex(index: Int) -> AnyObject? { 
    return axKnobs[index] 
} 

しかし、クラスの拡張で私の最後の2つの方法(accessibilityIncrementとaccessibilityDecrement)が全てで呼び出されていません。

override func accessibilityIncrement() { 
    if currentKnob == .None { 
     return 
    } 

    if currentKnob == .High { 
     highValue = max(highValue + 10, maximumValue) 
    } else { 
     if doubleKnob { 
      lowValue = max(lowValue + 10, highValue - 1) 
     } else { 
      lowValue = max(lowValue + 10, maximumValue) 
     } 
    } 

    updateDelegate() 
    redraw() 
} 

override func accessibilityDecrement() { 
    if currentKnob == .None { 
     return 
    } 

    if currentKnob == .High { 
     highValue = min(highValue - 10, lowValue + 1) 
    } else { 
     lowValue = min(lowValue - 10, minimumValue) 
    } 

    updateDelegate() 
    redraw() 
} 

なぜでしょうか? https://github.com/AaronBratcher/SliderTest

答えて

0

UIAccessibilityElementsには、UIControlサブクラスではなく、2つのメソッドがあります。

extension DLSlider { 
class KnobAccessibilityElement: UIAccessibilityElement { 
    var onIncrement: ((knob: UIAccessibilityElement) -> Void)? 
    var onDecrement: ((knob: UIAccessibilityElement) -> Void)? 

    override func accessibilityIncrement() { 
     if let callback = onIncrement { 
      callback(knob: self) 
     } 
    } 

    override func accessibilityDecrement() { 
     if let callback = onDecrement { 
      callback(knob: self) 
     } 
    } 
} 

func addAccessibilityElements() { 
    axKnobs = [] 

    let lowKnob = KnobAccessibilityElement(accessibilityContainer: self) 
    lowKnob.accessibilityLabel = doubleKnob ? lowValueKnobAccessibilityLabel : valueKnobAccessibilityLabel 
    lowKnob.accessibilityPath = UIAccessibilityConvertPathToScreenCoordinates(knobBezierPath(lowKnobPoint), self) 
    lowKnob.accessibilityTraits = UIAccessibilityTraitAdjustable 
    lowKnob.accessibilityValue = "\(lowValue)" 
    lowKnob.onIncrement = { [unowned self] (knob: UIAccessibilityElement) in 
     self.incrementKnob(knob) 
    } 

    lowKnob.onDecrement = { [unowned self] (knob: UIAccessibilityElement) in 
     self.decrementKnob(knob) 
    } 

    axKnobs.append(lowKnob) 

    if doubleKnob, let highKnobPoint = highKnobPoint { 
     let highKnob = KnobAccessibilityElement(accessibilityContainer: self) 
     highKnob.accessibilityLabel = highValueKnobAccessibilityLabel 
     highKnob.accessibilityPath = UIAccessibilityConvertPathToScreenCoordinates(knobBezierPath(highKnobPoint), self) 
     highKnob.accessibilityTraits = UIAccessibilityTraitAdjustable 
     highKnob.accessibilityValue = "\(highValue)" 
     highKnob.onIncrement = { [unowned self] (knob: UIAccessibilityElement)in 
      self.incrementKnob(knob) 
     } 

     highKnob.onDecrement = { [unowned self] (knob: UIAccessibilityElement) in 
      self.decrementKnob(knob) 
     } 

     axKnobs.append(highKnob) 
    } 
} 

override func accessibilityElementCount() -> Int { 
    return axKnobs.count 
} 

override func indexOfAccessibilityElement(element: AnyObject) -> Int { 
    return axKnobs.indexOf(element as! UIAccessibilityElement)! 
} 

override func accessibilityElementAtIndex(index: Int) -> AnyObject? { 
    return axKnobs[index] 
} 

... // other methods here 
}