ios - swift ios 通过循环为多个 subview 添加约束

标签 ios swift xcode loops constraints

我是 swift 的新手,我试图学习如何使用循环添加多个 subview 及其约束。我试图遵循类似问题的一些答案,但它不起作用。你能帮我处理我的代码吗?提前谢谢你。

这是我的代码:

    let card = UIView()

    let view2 = UIView()

    view2.backgroundColor = UIColor.greenColor()

    view2.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(view2)

    let leftSideConstraint3 = NSLayoutConstraint(item: view2, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: 0.0)
    let topConstraint3 = NSLayoutConstraint(item: view2, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0.0)
    let widthConstraint3 = NSLayoutConstraint(item: view2, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 1, constant: 0.0)
    let heightConstraint3 = NSLayoutConstraint(item: view2, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1, constant: 0.0)
    view.addConstraints([leftSideConstraint3, topConstraint3, heightConstraint3, widthConstraint3])



    var cards = [UIView](count: 16, repeatedValue: card) // array with 16 cards



    card.layer.borderWidth = 3
    card.layer.borderColor = UIColor.blackColor().CGColor
    card.backgroundColor = UIColor.orangeColor()



    var columnCounter:Int = 0
    var rowCounter:Int = 0


    //Loop through each card in the array
    for index in 0...cards.count-1 {



        // place the card in the view and turn off translateAutoresizingMask
        let thisCard = cards[index]
        thisCard.translatesAutoresizingMaskIntoConstraints = false
        view2.addSubview(thisCard)

        //set the height and width constraints
        let widthConstraint = NSLayoutConstraint(item: thisCard, attribute: .Width, relatedBy: .Equal, toItem: view2, attribute: .Width, multiplier: 0.25, constant: 0)
        let heightConstraint = NSLayoutConstraint(item: thisCard, attribute: .Height, relatedBy: .Equal, toItem: view2, attribute: .Height, multiplier: 0.25, constant: 0)
        view2.addConstraints([heightConstraint, widthConstraint])

        //set the horizontal  position

        if (columnCounter > 0) {

            // card is not in the first column
            let cardOnTheLeft = cards[index-1]

            let leftSideConstraint = NSLayoutConstraint(item: thisCard, attribute: .Left, relatedBy: .Equal, toItem: cardOnTheLeft, attribute: .Right, multiplier: 1, constant: 0)

            //add constraint to the contentView
            view2.addConstraint(leftSideConstraint)

        } else {

            //card is in the first column

            let leftSideConstraint = NSLayoutConstraint(item: thisCard, attribute: .Left, relatedBy: .Equal, toItem: view2, attribute: .Left, multiplier: 1, constant: 0)

            //add constraint to the contentView
            view2.addConstraint(leftSideConstraint)

        }


        //set the vertical position

        if (rowCounter > 0) {

            // card is not in the first row
            let cardOnTop = cards[index-4]

            let topConstraint = NSLayoutConstraint(item: thisCard, attribute: .Top, relatedBy: .Equal, toItem: cardOnTop, attribute: .Bottom, multiplier: 1, constant: 0)

            // add constraint to the contentView
            view2.addConstraint(topConstraint)

        } else {

            //card is in the first row

            let topConstraint = NSLayoutConstraint(item: thisCard, attribute: .Top, relatedBy: .Equal, toItem: view2, attribute: .Top, multiplier: 1, constant: 0)

            //add constraint to the contentView
            view2.addConstraint(topConstraint)

        }



        //increment the column counter
        columnCounter = columnCounter+1

        //if the column counter reaches the fifth column reset it and increase the row counter
        if (columnCounter >= 4) {
            columnCounter = 0
            rowCounter = rowCounter+1
        }




    } // end of the loop

最佳答案

这将创建一个包含 16 个对同一张卡片的引用的数组。

var cards = [UIView](count: 16, repeatedValue: card)

替换为:

var cards = (1...16).map { _ in UIView() }

这将生成一个包含 16 个唯一 UIView 的数组。

关于ios - swift ios 通过循环为多个 subview 添加约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38674322/

相关文章:

ios - MapKit 和谷歌地图

ios - 刚接触IOS开发者中心,如何使用自己的手机运行应用程序?

ios - Swift Playground 无法识别 Cocoa Touch 初始值设定项

arrays - 附加到 [String : Any] dictionary structure 中的数组

ios - 无法在 Firebase 中保留 'posts' 的 'users' 引用

ios - 如何以编程方式在 imageView 底部添加标签?

ios - 将 datePicker 日期和计时器与用户日期和时间匹配 (swift3)

c++ - MacOS 的 "-std=gnu++0x"选项

ios - #ifdef DEBUG 与 #if DEBUG

ios - 开关在 SMSegmentViev 中不起作用