简体   繁体   English

使用滑块快速操作受乘数约束的锚点

[英]Use slider to manipulate anchors constrained by a multiplier in swift

I want to use a slider to make pic imageview smaller.我想使用滑块使 pic imageview 变小。 Right now its in its max size.现在它的最大尺寸。 The slider should be able to make it smaller.滑块应该能够使它变小。 When I use the slider the pic does decrease but I cant increase it, I can only decrease it.当我使用滑块时,图片确实减少了,但我不能增加它,我只能减少它。 This is a pic of what I am looking to do.这是我想要做的照片。 在此处输入图片说明

My code is in all code no storyboard used.我的代码在所有代码中都没有使用故事板。

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)


}
}

Apologies for the very crude code, but this works:非常粗糙的代码道歉,但这有效:

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

The main thing is to:主要是为了:

  • declare the specific constraints you want to change声明您要更改的特定约束
  • set isActive = true in a separate line (I know, stupid but the compiler doesn't recognize the NSLayoutConstraint type and will not build if you do it on a single line在单独的一行中设置isActive = true (我知道,很愚蠢,但编译器无法识别 NSLayoutConstraint 类型,如果您在一行中执行,则不会构建
  • change the constraint as needed根据需要更改约束

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM