使用编程约束在视图中创建2个视图

时间:2015-10-24 22:10:40

标签: ios swift nslayoutconstraint

我正在尝试向CallOutView添加2个观看次数。 pushButton应位于底部,静态高度为20. topView应填充其余部分。我尝试使用SnapKit以编程方式执行此操作。然而,似乎按钮只是填充一切?我做错了什么?

       callOutView = UIView(frame: CGRectMake(-70+(self.frame.width/2), -65, 140, 60))
        callOutView!.backgroundColor = UIColor.clearColor()
        callOutView?.clipsToBounds = true
        callOutView?.layer.cornerRadius = 6
        self.addSubview(callOutView!)

        let topView = UIView()
        topView.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.8)
        callOutView?.addSubview(topView)


        let pushButton = UIButton()
        pushButton.backgroundColor = UIColor(rgba: "#09316e").colorWithAlphaComponent(0.8)
        pushButton.setTitle("Se Mere", forState: UIControlState.Normal)
        pushButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
        pushButton.titleLabel?.font = UIFont.systemFontOfSize(8)
        callOutView?.addSubview(pushButton)

        topView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(callOutView!).offset(0)
            make.left.equalTo(callOutView!).offset(0)
            make.bottom.equalTo(pushButton).offset(0)
            make.right.equalTo(callOutView!).offset(0)
            make.height.equalTo(40)

        }

        pushButton.snp_makeConstraints { (make) -> Void in
            make.height.equalTo(20)
            make.top.equalTo(topView).offset(0)
            make.left.equalTo(callOutView!).offset(0)
            make.bottom.equalTo(0).offset(0)
            make.right.equalTo(callOutView!).offset(0)

        }

1 个答案:

答案 0 :(得分:0)

问题在于存在一些相互冲突的约束,这将使自动布局系统破坏其中的一些。

topView.snp_makeConstraints { (make) -> Void in
    ...
    make.bottom.equalTo(pushButton).offset(0)
    ...
}


pushButton.snp_makeConstraints { (make) -> Void in
    ...
    make.top.equalTo(topView).offset(0)
    ...
}

上面的两个约束告诉autolayout系统:

  1. topViewpushButton与上边缘对齐放置。
  2. 放置topViewpushButton,底边对齐。
  3. 如果您将topViewpushButton设置为不同的高度,那么这是不可能的。

    此外,这显然不是你想要的。您想要的是pushButton位于topView正下方。

    以下是修改后的代码,pushButton位于topView正下方:

    topView.snp_makeConstraints { (make) -> Void in
        ...
        make.bottom.equalTo(pushButton.snp_top).offset(0)
        ...
    }
    
    
    pushButton.snp_makeConstraints { (make) -> Void in
        ...
        make.top.equalTo(topView.snp_bottom).offset(0)
        ...
    }