创建约束,其中只有尾随锚点可以缩小或扩展

问题描述

您可以在下面的 gif 中看到,下面的代码同时生成左侧和右侧。我想做的只是增加我的右侧。您可以在 gif 中看到红色标记位于我的一侧,我只是想在右侧增加它。我不知道如何只增加右侧并固定左上角和下侧。

enter image description here

import UIKit
class ViewController: UIViewController{
    
    var pic = UIView()
    var slizer = UiSlider()
    var slidermultiplier: CGFloat = 0.3
    var widthConstraints: NSLayoutConstraint?

    override func viewDidLoad() {
        super.viewDidLoad()
        widthConstraints = pic.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: slidermultiplier)
        
        [pic,slizer].forEach{
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)
        }
        NSLayoutConstraint.activate([
            pic.centerYAnchor.constraint(equalTo: view.centerYAnchor),pic.centerXAnchor.constraint(equalTo: view.centerXAnchor),pic.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.3),widthConstraints!,slizer.bottomAnchor.constraint(equalTo: view.bottomAnchor),slizer.leadingAnchor.constraint(equalTo: view.leadingAnchor),slizer.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.2),slizer.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),])
        
        pic.backgroundColor = .orange
        // changed to .valueChanged
        slizer.addTarget(self,action: #selector(increase),for: .valueChanged)
    }

    @objc func increase() {
        slidermultiplier = CGFloat(slizer.value)
        widthConstraints?.isActive = false
        widthConstraints = pic.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: slidermultiplier)
        widthConstraints?.isActive = true
    }
}

解决方法

您可以将尾随约束设置为大于或等于 0(根据需要的任何常量),并确保修复前导和其他约束。

希望这适用于您的情况。

快乐编码:)

,

正如我在上面的评论中已经提到的,您只需要删除 pic.centerYAnchor.constraint(equalTo: view.centerYAnchor) 约束并为常量添加 pic.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant: whatver_value_you_think_is_correct),您可以指定您认为最适合您的用例的任何值。如果不确定要指定以 0 开头的值 :)

override func viewDidLoad() {
        super.viewDidLoad()
        widthConstraints = pic.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: slidermultiplier)

        [pic,slizer].forEach{
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)
        }
        NSLayoutConstraint.activate([
            pic.centerYAnchor.constraint(equalTo: view.centerYAnchor),pic.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant: whatver_value_you_think_is_correct),pic.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.3),widthConstraints!,slizer.bottomAnchor.constraint(equalTo: view.bottomAnchor),slizer.leadingAnchor.constraint(equalTo: view.leadingAnchor),slizer.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.2),slizer.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),])

        pic.backgroundColor = .orange
        // changed to .valueChanged
        slizer.addTarget(self,action: #selector(increase),for: .valueChanged)
    }

您现有的 increase 方法应该可以正常工作