如何在 iOS 中添加双拇指滑块?以及为什么这个双滑块库不再适用于 xcode 7
how to add a double thumbed slider in iOS? and why this double slider library no longer works in xcode 7
我有一个有双滑块的应用程序,该项目在 swift 1.2 / XCode 6 中运行良好,我使用的插件是 UIXRangeSlider
但问题是在 Swift 2 / XCode 7.2
中使用时显示奇怪的错误
我尝试修复这些错误,但它们让我感到困惑,我尝试添加 override
并删除它,但没有机会,如何修复这些错误?或者你知道有什么好的选择吗?
编辑
修正了一些错误,我只是需要帮助
您链接到的代码存在几个问题:
NSCoding
的init(coder: NSCoder)
是一个可失败的初始化器,所以这也需要是一个可失败的初始化器:
required init?(coder: NSCoder)
{
super.init(coder: coder)
self.commonInit()
}
方法 setInactiveBarImage
、setActiveBarImage
、setRightThumbImage
、setMiddleThumbImage
和 setLeftThumbImage
与 属性 冲突class 中同名变量的设置器(例如 middleThumbImage
)。编译器生成签名匹配 setVariable:
的方法,供 Objective-C 使用。解决这个问题的最好方法是将方法主体移动到每个变量的 didSet
处理程序中,例如:
var activeBarImage:UIImage = UIImage() {
didSet {
self.activeBarView.removeFromSuperview()
self.activeBarView = UIImageView(image: self.activeBarImage)
self.activeBarView.userInteractionEnabled = false
self.addSubview(self.activeBarView)
self.orderSubviews()
self.setNeedsLayout()
}
}
触摸跟踪方法写错了。 superclass 接口接受 UITouch?
和 UIEvent?
- 注意这两个参数都是可选的。要修复错误,请更改参数并处理可选值:
override func beginTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) -> Bool
{
guard let location = touch?.locationInView(self) else { return false }
previousLocation = location
// Hit test the thumb layers
if leftThumbView.frame.contains(previousLocation)
{
trackedElement = .LeftThumb
}
else if rightThumbView.frame.contains(previousLocation)
{
trackedElement = .RightThumb
}
else if middleThumbView.frame.contains(previousLocation)
{
trackedElement = .MiddleThumb
}
return trackedElement != .None
}
override func continueTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) -> Bool
{
guard let location = touch?.locationInView(self) else { return false }
// 1. Determine by how much the user has dragged
let deltaLocation = Double(location.x - previousLocation.x)
let deltaValue = (Double(maximumValue) - Double(minimumValue)) * deltaLocation / Double(bounds.width /*- thumbWidth*/)
switch trackedElement
{
case .LeftThumb:
handleLeftThumbMove(location, delta: deltaValue)
case .MiddleThumb:
handleMiddleThumbMove(location, delta: deltaValue)
case .RightThumb:
handleRightThumbMove(location, delta: deltaValue)
default:
break
}
previousLocation = location
return true
}
override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?)
{
trackedElement = .None
}
希望这能解决问题![=25=]
我有一个有双滑块的应用程序,该项目在 swift 1.2 / XCode 6 中运行良好,我使用的插件是 UIXRangeSlider
但问题是在 Swift 2 / XCode 7.2
中使用时显示奇怪的错误我尝试修复这些错误,但它们让我感到困惑,我尝试添加 override
并删除它,但没有机会,如何修复这些错误?或者你知道有什么好的选择吗?
编辑
修正了一些错误,我只是需要帮助
您链接到的代码存在几个问题:
NSCoding
的init(coder: NSCoder)
是一个可失败的初始化器,所以这也需要是一个可失败的初始化器:required init?(coder: NSCoder) { super.init(coder: coder) self.commonInit() }
方法
setInactiveBarImage
、setActiveBarImage
、setRightThumbImage
、setMiddleThumbImage
和setLeftThumbImage
与 属性 冲突class 中同名变量的设置器(例如middleThumbImage
)。编译器生成签名匹配setVariable:
的方法,供 Objective-C 使用。解决这个问题的最好方法是将方法主体移动到每个变量的didSet
处理程序中,例如:var activeBarImage:UIImage = UIImage() { didSet { self.activeBarView.removeFromSuperview() self.activeBarView = UIImageView(image: self.activeBarImage) self.activeBarView.userInteractionEnabled = false self.addSubview(self.activeBarView) self.orderSubviews() self.setNeedsLayout() } }
触摸跟踪方法写错了。 superclass 接口接受
UITouch?
和UIEvent?
- 注意这两个参数都是可选的。要修复错误,请更改参数并处理可选值:override func beginTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) -> Bool { guard let location = touch?.locationInView(self) else { return false } previousLocation = location // Hit test the thumb layers if leftThumbView.frame.contains(previousLocation) { trackedElement = .LeftThumb } else if rightThumbView.frame.contains(previousLocation) { trackedElement = .RightThumb } else if middleThumbView.frame.contains(previousLocation) { trackedElement = .MiddleThumb } return trackedElement != .None } override func continueTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) -> Bool { guard let location = touch?.locationInView(self) else { return false } // 1. Determine by how much the user has dragged let deltaLocation = Double(location.x - previousLocation.x) let deltaValue = (Double(maximumValue) - Double(minimumValue)) * deltaLocation / Double(bounds.width /*- thumbWidth*/) switch trackedElement { case .LeftThumb: handleLeftThumbMove(location, delta: deltaValue) case .MiddleThumb: handleMiddleThumbMove(location, delta: deltaValue) case .RightThumb: handleRightThumbMove(location, delta: deltaValue) default: break } previousLocation = location return true } override func endTrackingWithTouch(touch: UITouch?, withEvent event: UIEvent?) { trackedElement = .None }
希望这能解决问题![=25=]