以编程方式约束

Posted

技术标签:

【中文标题】以编程方式约束【英文标题】:Constraint programmatically 【发布时间】:2018-05-25 08:54:38 【问题描述】:

我在这个视图上需要一点帮助。在实践中,我想减少绿色按钮的高度。我尝试以各种方式修复它,但要么使应用程序崩溃,要么它们无法正常工作。

谁能告诉我怎么解决?

有问题的视图的屏幕截图:

此时此处以编程方式。我必须降低高度的绿色部分称为“buttonShare”

private extension DropPreviewView 

struct Constants 
    static let regionSpan: CLLocationDistance = 250
    static let cornerRadius: CGFloat = 10
    static let headerHeight: CGFloat = 60


func setupUI() 

    buttonShare.do 
        $0.backgroundColor = .green
        $0.addTarget(self, action: #selector(didTapOutsideView), for: .touchUpInside)
    

    blurredBackgroundView.do 
        $0.effect = UIBlurEffect(style: .dark)
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapOutsideView))
        $0.addGestureRecognizer(tapGestureRecognizer)
    

    spinner.do 
        $0.hidesWhenStopped = true
        $0.color = .darkGray
        $0.startAnimating()
    

    contentView.do 
        $0.backgroundColor = .white
        $0.clipsToBounds = true
        $0.layer.cornerRadius = Constants.cornerRadius
    

    dropPreviewImageView.do 
        $0.contentMode = .scaleAspectFill
        $0.clipsToBounds = true
        $0.isUserInteractionEnabled = true
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapOnPreviewImage))
        $0.addGestureRecognizer(tapGestureRecognizer)
    


func arrangeSubviews() 

    addSubview(blurredBackgroundView, constraints: [
        blurredBackgroundView.topAnchor.constraint(equalTo: topAnchor),
        blurredBackgroundView.leftAnchor.constraint(equalTo: leftAnchor),
        blurredBackgroundView.bottomAnchor.constraint(equalTo: bottomAnchor),
        blurredBackgroundView.rightAnchor.constraint(equalTo: rightAnchor),
        ])

    addSubview(contentView, constraints: [
        contentView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.8),
        contentView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.7),
        contentView.centerXAnchor.constraint(equalTo: centerXAnchor),
        contentView.centerYAnchor.constraint(equalTo: centerYAnchor),
        ])

    addSubview(buttonShare, constraints: [
        buttonShare.centerXAnchor.constraint(equalTo: centerXAnchor)
        ])

    header.addConstraint(
        header.heightAnchor.constraint(equalToConstant: Constants.headerHeight)
    )

    let innerStack = UIStackView(arrangedSubviews: [dropPreviewImageView, buttonShare]).then 
        $0.distribution = .fillEqually
        $0.axis = .vertical
        $0.spacing = 10
    

    let stackView = UIStackView(arrangedSubviews: [header, innerStack, buttonShare]).then 
        $0.axis = .vertical
        $0.distribution = .fill
        $0.spacing = 10
    

    contentView.addSubview(stackView, constraints: [
        stackView.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor),
        stackView.leftAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leftAnchor),
        stackView.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor),
        stackView.rightAnchor.constraint(equalTo: contentView.layoutMarginsGuide.rightAnchor),
        ])
    dropPreviewImageView.addSubview(spinner, constraints: [
        spinner.centerXAnchor.constraint(equalTo: dropPreviewImageView.centerXAnchor),
        spinner.centerYAnchor.constraint(equalTo: dropPreviewImageView.centerYAnchor),
        ])

【问题讨论】:

永远不要在你的问题中包含代码作为图片。使用适当的代码格式将其包含为文本。 @DávidPásztor 好的,谢谢:) 您似乎将buttonShare 作为子视图添加到self,然后作为排列子视图添加到innerStack,最后作为排列子视图添加到stackView。您是否意识到,单个视图只能有一个超级视图?前两个“添加”通过将其添加为stackView 的排列子视图而无效。 【参考方案1】:

试试:

    addSubview(buttonShare, constraints: [
        buttonShare.centerXAnchor.constraint(equalTo: centerXAnchor)
        buttonShare.heightAnchor.constraint(equalToConstant: 50).isActive = true
        buttonShare.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 12).isActive = true
        ])

编辑:您需要将绿色视图上方的视图底部锚定到按钮的顶部。确保这是在上面的代码之后

【讨论】:

谢谢!以这种方式它正在工作,现在我修复了所有问题。谢谢你的提示:) 很高兴听到!作为答案的标记将不胜感激;)

以上是关于以编程方式约束的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向已以编程方式添加到表格单元格的标签添加约束

以编程方式添加的约束不起作用

以编程方式约束

模糊自动布局约束(以编程方式添加)

尝试以编程方式实现约束时忽略约束

以编程方式添加约束