【问题标题】:Adding constraints programmatically in UIScrollView with dynamic buttons - Swift使用动态按钮在 UIScrollView 中以编程方式添加约束 - Swift
【发布时间】:2015-07-20 17:52:24
【问题描述】:

我正在尝试以编程方式在我的 ScrollView 中添加约束,但无法正常工作。问题是它不适用于我的标签和按钮的前导和尾随。

我想在滚动视图的第一个标签和标签下方放置例如 10 个动态按钮。

代码是:

var buttons : [UIButton] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    //Create controller and get view
    //var controller = UIViewController()
    var view = self.view
    var tag:String
    var count = 0

    //Create and layout scroll view
    var scrollView = UIScrollView()
    scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addSubview(scrollView)
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0.0))

    //Create and add content view
    var contentView = UIView()
    contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
    scrollView.addSubview(contentView)
    scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0.0))

    //Contraint contentView and view
    view.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0.0))

    //Add Label
    var preguntaLabel = UILabel()
    preguntaLabel.numberOfLines = 0
    preguntaLabel.text = "tenemos al mejor del mundo, que va y hace cuatro goles con el Real Sociedad, y viene acá y no la toca. Vos decís, pero la puta, ¿sos argentino o sueco? Que se dejen de romper las pelotas los que dicen ‘a Messi hay que mimarlo’. A Messi hay que tratarlo como a todo jugador que se pone la camiseta de la Selección. Como el mejor del mundo, para lo bueno y lo malo. Pero ojo que tampoco Messi mató, violó, no hagamos una novela"
    preguntaLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
    contentView.addSubview(preguntaLabel)

    //contraits leading y trailing
    contentView.addConstraint(NSLayoutConstraint(item: preguntaLabel, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 5.0))
    contentView.addConstraint(NSLayoutConstraint(item: preguntaLabel, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 5.0))

    //contraits top
    contentView.addConstraint(NSLayoutConstraint(item: preguntaLabel, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 15.0))

    for var i=0;i<10;i++
    {
        //Create all buttons
        var btn = UIButton.buttonWithType(UIButtonType.System) as! UIButton
        btn.backgroundColor = UIColor.greenColor()
        btn.setTitle("hola"+String(i), forState: UIControlState.Normal)
        btn.titleLabel?.numberOfLines = 0
        buttons.append(btn)
    }
        //Add buttons to view with constraints
        var prevButton:String
        var constH:NSArray
        var constV:NSArray
        var hString:String
        var vString:String
        var index = 0
        for button in buttons{
            button.setTranslatesAutoresizingMaskIntoConstraints(false)
            contentView.addSubview(button)
            //button.bounds.size.height = 90
            button.titleLabel?.numberOfLines = 0
            contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 5.0))
            contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 5.0))
            if(index == 0){
                contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: preguntaLabel, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 8.0))
            }
            else{
                contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: buttons[index-1], attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 8.0))
            }
            if(index == buttons.count-1){
                contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: -8.0))
            }
            index++
        }

}

【问题讨论】:

    标签: swift uiscrollview autolayout constraints


    【解决方案1】:

    问题是您将第一个按钮映射到标签的顶部,因此它没有正确显示实际上您需要将第一个按钮的顶部分配为等于标签的底部:

    if(index == 0)
    {        
        contentView.addConstraint(NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: preguntaLabel, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 8.0))
    }
    

    【讨论】:

    • 感谢您的回答,这项工作但“preguntaLabel”的约束(顶部和尾部)不起作用。只工作领先的约束。 contentView.addConstraint(NSLayoutConstraint(item: preguntaLabel, 属性: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, 属性: NSLayoutAttribute.Trailing, 乘数: 1.0, 常数: 5.0)) contentView.addConstraint(NSLayoutConstraint(item: preguntaLabel ,属性:NSLayoutAttribute.Top,relatedBy:NSLayoutRelation.Equal,toItem:contentView,属性:NSLayoutAttribute.Top,乘数:1.0,常数:15.0))
    • 嗨,您在上面提供的代码正在运行,我对其进行了测试。我认为他们可能会遇到其他问题,如果您使用的是 xocde 的 beta 版本,请使用 YourObjectName 。 translatesAutoresizingMaskIntoConstraints = false
    • 嗨,我有 xcode 6,4。它不是测试版,当我运行项目时,项目看起来像postimg.org/image/4nbx2rt25。得到你的其他结果?感谢您的帮助。
    • ok 实际上也解决了这个问题,因为尾随约束你必须给出负常数,所以把 -15 作为按钮和标签尾随的常数,它完成了把这个约束放在按钮尾随 contentView.addConstraint (NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: -15.0))
    • 非常感谢,这一切都很好。只是出于好奇,为什么尾随一定是负数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2019-06-25
    相关资源
    最近更新 更多