使用滑块更改 NSLAYOUTconstraint uiimageview 的宽度和高度

use slider to to change width and height of NSLAYOUT constraint imageview

我的 swift 代码目标是使用滑块来增加或减少图像视图的大小。 imageview pic 应该能够根据 slide slider 的值增加减少大小。当调用 func 时,必须取消激活原始约束,以便可以更改宽度和高度。我听说可以使用动画块。

import UIKit

class ViewController: UIViewController {

    var pic = UIImageView()
    var slide = UISlider()
    var currentView: UIView?
    var oldCons = [NSLayoutConstraint]()

    override func viewDidLoad() {
        super.viewDidLoad()
        slide.backgroundColor = .systemPink

        pic.backgroundColor = .systemGreen


        [pic,slide].forEach {
            [=10=].translatesAutoresizingMaskIntoConstraints = false
            view.addSubview([=10=])



        }
        NSLayoutConstraint.activate([

            slide.heightAnchor.constraint(equalTo:  view.heightAnchor ,multiplier:  0.25),
            slide.widthAnchor.constraint(equalTo:  view.widthAnchor ,multiplier:  0.25),
            slide.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),

            slide.topAnchor.constraint(equalTo: pic.bottomAnchor, constant :0),

        ])
        oldCons = [

            pic.topAnchor.constraint(equalTo: view.topAnchor, constant :0),
            pic.heightAnchor.constraint(equalTo:  view.heightAnchor ,multiplier:  0.25),
            pic.widthAnchor.constraint(equalTo:  view.widthAnchor ,multiplier:  0.25),
            pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),



        ]
        NSLayoutConstraint.activate(oldCons)



        slide.addTarget(self, action: #selector(change), for: .allTouchEvents)

    }


    @objc func change(){
        NSLayoutConstraint.deactivate(oldCons)
        pic.bounds.size.width = CGFloat(slide.value)
        pic.bounds.size.height = CGFloat(slide.value)

    }


}

您不需要停用约束。您只需要保存它们并在滑块滑动时更新常量。

class ViewController: UIViewController {

    var pic = UIImageView()
    var slide = UISlider()
    var currentView: UIView?

    var picWidth: NSLayoutConstraint!
    var picHeight: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        // ...

        picWidth = pic.widthAnchor.constraint(equalTo:  view.widthAnchor ,multiplier:  0.25)
        picHeight = pic.heightAnchor.constraint(equalTo:  view.heightAnchor ,multiplier:  0.25)
        NSLayoutConstraint.activate([
            slide.heightAnchor.constraint(equalTo:  view.heightAnchor ,multiplier:  0.25),
            slide.widthAnchor.constraint(equalTo:  view.widthAnchor ,multiplier:  0.25),
            slide.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
            slide.topAnchor.constraint(equalTo: pic.bottomAnchor, constant :0),

            pic.topAnchor.constraint(equalTo: view.topAnchor, constant :0),
            picWidth,
            picHeight,
            pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
        ])

        // ...
    }

    @objc func change(){
        picWidth.constant = CGFloat(slide.value) * view.frame.size.width * 0.25
        picHeight.constant = CGFloat(slide.value) * view.frame.size.height * 0.25
    }

}