微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当滑块用于其他任务时保持原来的滑块值

如何解决当滑块用于其他任务时保持原来的滑块值

当滑块值用于其他用途时,我希望下面的 swift 代码保持宽度约束的滑块值。你可以在下面的gif中看到发生了什么。当滑块的值用于其他用途时,约束会发生变化。当考虑滑块的值用于其他用途时,约束不应更改。

enter image description here

       import UIKit
       class ViewController: UIViewController {

var frontBox = UIButton()
var backBox = UIButton()
var selectorB = UIButton()
var slider = UiSlider()
var slidermultipliera: CGFloat = 0.6
var slidermultiplierb: CGFloat = 0.6
var selctorValue = 0



// constraint we will modify when slider is changed
var backBoxWidth: NSLayoutConstraint!

// constraints we will modify when backBox is dragged
var backBoxCenterY: NSLayoutConstraint!
var backBoxLeading: NSLayoutConstraint!


var FrontBoxWidth: NSLayoutConstraint!

// constraints we will modify when backBox is dragged
var FrontBoxCenterY: NSLayoutConstraint!
var FrontBoxLeading: NSLayoutConstraint!






var tim = 50.0


override func viewDidLoad() {
    super.viewDidLoad()
    
    [backBox,selectorB,frontBox,slider].forEach{
        $0.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview($0)
        $0.backgroundColor = UIColor(
            red: .random(in: 0.0...1),green: .random(in: 0.9...1),blue: .random(in: 0.7...1),alpha: 1
        )
    
    }
    selectorB.setTitle("right",for: .normal)
    
    NSLayoutConstraint.activate([
 
        
        selectorB.bottomAnchor.constraint(equalTo: view.bottomAnchor),selectorB.leadingAnchor.constraint(equalTo: view.leadingAnchor),selectorB.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.1),selectorB.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),slider.bottomAnchor.constraint(equalTo: selectorB.topAnchor),slider.leadingAnchor.constraint(equalTo: view.leadingAnchor),slider.heightAnchor.constraint(equalTo: view.heightAnchor,slider.widthAnchor.constraint(equalTo: view.widthAnchor,])

    
    // backBox Width constraint
    backBoxWidth = backBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.2)
    
    // backBox CenterY constraint
    backBoxCenterY = backBox.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    
    // backBox Leading constraint
    backBoxLeading = backBox.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant: CGFloat(200))
    
    
    // backBox Width constraint
    FrontBoxWidth = frontBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.2)
    
    // backBox CenterY constraint
    FrontBoxCenterY = frontBox.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    
    // backBox Leading constraint
    FrontBoxLeading = frontBox.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant: CGFloat(tim))
    
    
    
    slider.setValue(Float(0.5),animated: false)
    
    
    NSLayoutConstraint.activate([

        // backBox Height is constant
        backBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.5),backBoxWidth,backBoxLeading,backBoxCenterY,frontBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.3),FrontBoxWidth,FrontBoxCenterY,FrontBoxLeading,])
    

    
 
 
    
    
    selectorB.addTarget(self,action: #selector(press),for: .touchDown)

    slider.addTarget(self,action: #selector(increase),for: .valueChanged)

    
}






@objc func press(){
    selctorValue = selctorValue == 0 ? 1 : 0
    
    if selctorValue == 1{

        backBoxWidth.isActive = false
        selectorB.setTitle("left",for: .normal)
    }
    else {

        FrontBoxWidth.isActive = false
        backBoxWidth.isActive = true
        selectorB.setTitle("right",for: .normal)
    
    }

    
}

@objc func increase() {
    
    
    
    if selctorValue == 1{
        
        
        slidermultipliera = CGFloat(slider.value)

        // update backBox Width constraint
        FrontBoxWidth.isActive = false
        FrontBoxWidth = frontBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: slidermultipliera)
        FrontBoxWidth.isActive = true
    }
    else {
        
        slidermultiplierb = CGFloat(slider.value)

        // update backBox Width constraint
        backBoxWidth.isActive = false
        backBoxWidth = backBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: slidermultiplierb)
        backBoxWidth.isActive = true
        
        
    }
    
    
    
    
   
    
}


  }

解决方法

我从来没有用过 Swift,但似乎当您单击其中一个框时,您应该能够在激活该框之前根据您刚刚单击的框的宽度设置滑块值。>

我猜它会发生在您的 @objc func press() 函数中。尝试使两个框都处于非活动状态,然后调用 slider.setValue() 并激活刚刚点击的框。

抱歉,我不能给你工作代码,但希望这会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。