如何在 iOS 中添加双拇指滑块?以及为啥这个双滑块库不再适用于 xcode 7

Posted

技术标签:

【中文标题】如何在 iOS 中添加双拇指滑块?以及为啥这个双滑块库不再适用于 xcode 7【英文标题】:how to add a double thumbed slider in iOS? and why this double slider library no longer works in xcode 7如何在 iOS 中添加双拇指滑块?以及为什么这个双滑块库不再适用于 xcode 7 【发布时间】:2016-03-27 10:38:15 【问题描述】:

我有一个带有双滑块的应用程序,该项目在 swift 1.2 / XCode 6 中运行良好,我使用的插件是UIXRangeSlider

但问题是它在 Swift 2 / XCode 7.2 中使用时显示奇怪的错误

我尝试修复错误,但它们让我感到困惑,我尝试添加 override 并删除它,但没有机会,如何修复这些错误?或者你知道有什么好的选择吗?

编辑

修正了一些错误,我只是需要帮助

【问题讨论】:

【参考方案1】:

您链接到的代码存在几个问题:

    NSCodinginit(coder: NSCoder) 是一个可失败的初始化器,所以这也需要是一个可失败的初始化器:

    required init?(coder: NSCoder)
    
        super.init(coder: coder)
        self.commonInit()
    
    

    setInactiveBarImagesetActiveBarImagesetRightThumbImagesetMiddleThumbImagesetLeftThumbImage 方法与类中同名变量的属性设置器冲突(例如 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()
        
    
    

    触摸跟踪方法写错了。超类接口接受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
    
    

希望这能解决问题!

【讨论】:

谢谢你的解释,我刚刚解决了几分钟的代码,我刚刚看到你的答案,谢谢它真的很有价值,现在是时候向 UIXSlider 开发人员请求拉取请求了他们更新了自定义控制器,或者我只是 fork 它以便人们使用它,非常感谢 Ryan Davies。 没问题!我相信作者会很感激一个拉取请求。 :-)

以上是关于如何在 iOS 中添加双拇指滑块?以及为啥这个双滑块库不再适用于 xcode 7的主要内容,如果未能解决你的问题,请参考以下文章

拼多多双滑块识别/拼多多空间点选/验证码本地库识别

拼多多双滑块识别/拼多多空间点选/验证码本地库识别

拼多多双滑块识别/拼多多空间点选/验证码本地库识别

JavaScript范围滑块/双滑块存在不使用框架[关闭]

如何在圆形滑块IOS上设置图像

iOS滑块的默认拇指图像大小?