【问题标题】:Use slider to manipulate anchors constrained by a multiplier in swift使用滑块快速操纵受乘数约束的锚点
【发布时间】:2020-04-01 07:00:03
【问题描述】:

我想使用一个滑块来缩小 pic imageview。现在它的最大尺寸。滑块应该能够使其更小。当我使用滑块时,图片确实减少了,但我不能增加它,我只能减少它。这是我正在寻找的照片。

我的代码在所有代码中都没有使用故事板。

import UIKit

class ViewController: UIViewController {
var sd = UISlider()
var pic = UIImageView()
var start = [NSLayoutConstraint]()
var change = [NSLayoutConstraint]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    [sd,pic].forEach{
        $0.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview($0)

        $0.backgroundColor = .systemOrange
    }
    pic.topAnchor.constraint(equalTo: view.topAnchor, constant: 12).isActive = true
    pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
    pic.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10).isActive = true
    start = [

        pic.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        pic.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 1/2),


        sd.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
        sd.topAnchor.constraint(equalTo: view.centerYAnchor, constant : +250),
        sd.widthAnchor.constraint(equalToConstant: 150),
        sd.heightAnchor.constraint(equalToConstant: 40)
    ]
    NSLayoutConstraint.activate(start)

    sd.addTarget(self, action: #selector(moveRight), for: .allTouchEvents)



}


@objc func moveRight(_ sender: UISlider) {
    NSLayoutConstraint.deactivate(start)

    let jessicaAlba = 300 + ( 300 * CGFloat(sd.value) )
    print(CGFloat(sd.value))
    pic.topAnchor.constraint(equalTo: view.topAnchor, constant: -jessicaAlba).isActive = true
    pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: jessicaAlba).isActive = true
    pic.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -jessicaAlba).isActive = true
    start = [

        pic.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
        pic.heightAnchor.constraint(equalTo: view.layoutMarginsGuide.heightAnchor, multiplier: 1/2),


        sd.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
        sd.topAnchor.constraint(equalTo: view.centerYAnchor, constant : +250),
        sd.widthAnchor.constraint(equalToConstant: 100),
        sd.heightAnchor.constraint(equalToConstant: 40)

    ]
    NSLayoutConstraint.activate (start)


}
}

【问题讨论】:

    标签: swift autolayout nslayoutconstraint uislider cgfloat


    【解决方案1】:

    非常粗略的代码道歉,但这有效:

    var myView = UIView()
    var topConstraint: NSLayoutConstraint!
    var bottomConstraint: NSLayoutConstraint!
    var leadingConstraint: NSLayoutConstraint!
    var trailingConstraint: NSLayoutConstraint!
    var jessicaAlba:Float = 50
    var slider = UISlider()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        myView.translatesAutoresizingMaskIntoConstraints = false
        myView.backgroundColor = UIColor.orange
        view.addSubview(myView)
    
        slider.translatesAutoresizingMaskIntoConstraints = false
        slider.minimumValue = 50
        slider.maximumValue = 200
        slider.setValue(jessicaAlba, animated: false)
        slider.addTarget(self, action: #selector(changeSize), for: .valueChanged)
        view.addSubview(slider)
    
        slider.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
        slider.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10).isActive = true
        slider.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10).isActive = true
    
    
        topConstraint = myView.topAnchor.constraint(equalTo: view.topAnchor, constant: CGFloat(jessicaAlba))
        topConstraint.isActive = true
        bottomConstraint = myView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: CGFloat(-jessicaAlba))
        bottomConstraint.isActive = true
        leadingConstraint = myView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: CGFloat(jessicaAlba))
        leadingConstraint.isActive = true
        trailingConstraint = myView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: CGFloat(-jessicaAlba))
        trailingConstraint.isActive = true
    }
    @objc func changeSize() {
        jessicaAlba = slider.value
        topConstraint.constant = CGFloat(jessicaAlba)
        bottomConstraint.constant = CGFloat(-jessicaAlba)
        leadingConstraint.constant = CGFloat(jessicaAlba)
        trailingConstraint.constant = CGFloat(-jessicaAlba)
    }
    

    主要是:

    • 声明要更改的特定约束
    • 在单独的行中设置isActive = true(我知道,很愚蠢,但编译器无法识别 NSLayoutConstraint 类型,如果您在一行中执行此操作,则不会构建
    • 根据需要更改约束

    【讨论】:

    • 这正是我想要的唯一的事情是我希望我的视图只在视图控制器的上半部分我试图使用乘数:1/2 但我不知道放在哪里它在这个。
    猜你喜欢
    • 2013-08-06
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2021-06-08
    • 2014-10-28
    相关资源
    最近更新 更多