首页 > 解决方案 > 使用滑块更改 NSLAYOUT 约束图像视图的宽度和高度

问题描述

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

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 {
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)



        }
        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)

    }


}

标签: swiftslidernslayoutconstraintboundscgfloat

解决方案


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

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
    }

}

推荐阅读