簡體   English   中英

Swift NSlayoutConstraint

[英]Swift NSlayoutConstraint

我有一個問題...我真的不明白。 我有一個僅創建UITextLabel的UIView類。我試圖將此類的實例添加到Viewcontroller。 這是我的UIViewClass的樣子:

    class PostLineItem: UIView {


    var labelText : String!
    var labelHeader : String!

    init(labelText: String , labelHeader: String) {
        super.init(frame: CGRect.zeroRect)
        self.labelText = labelText
        self.labelHeader = labelHeader
        let tlb = timeLineBlock()
        //tlb.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.addSubview(tlb)
        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: tlb, attribute: .Height, relatedBy: .Equal, toItem: self, attribute: .Height, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0)
            ])

    }

    required init(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)
        println("required public")
    }


    private func timeLineBlock() -> UIView{

        let viewNew = UIView()
        viewNew.setTranslatesAutoresizingMaskIntoConstraints(false)


        let titleLabel = UILabel()
        titleLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
        titleLabel.font = UIFont(name: "ArialMT", size: 20)
        titleLabel.textColor = UIColor.blackColor()
        titleLabel.text = labelHeader
        titleLabel.numberOfLines = 0
        viewNew.addSubview(titleLabel)
        titleLabel.backgroundColor = UIColor.redColor()

        /* IF I NOT COMMENT THIS PART INSTANCE OF THIS CLASS IS NOT SHOWING UP.
        viewNew.addConstraints([
            NSLayoutConstraint(item: titleLabel, attribute: .Width, relatedBy: .Equal, toItem: viewNew, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: titleLabel, attribute: .Left, relatedBy: .Equal, toItem: viewNew, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: titleLabel, attribute: .Top, relatedBy: .Equal, toItem: viewNew, attribute: .Top, multiplier: 1.0, constant: 0)
            ])
       */ 

        viewNew.backgroundColor = UIColor.greenColor()
        return viewNew

    }

}

這是我的viewController類的一部分,我嘗試在其中實例化PostLineItem實例。

 let guideView = UIView()
    guideView.setTranslatesAutoresizingMaskIntoConstraints(false)
    guideView.backgroundColor = UIColor.blackColor()
    scrollView.addSubview(guideView)

    scrollView.addConstraints([
        NSLayoutConstraint(item: guideView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1.0, constant: 50),
        NSLayoutConstraint(item: guideView, attribute: .Left, relatedBy: .Equal, toItem: scrollView, attribute: .Left, multiplier: 1.0, constant: 0),
        NSLayoutConstraint(item: guideView, attribute: .Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: -30),
        NSLayoutConstraint(item: guideView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant:10)
        ])



guideView.backgroundColor = UIColor.blackColor()


var viewFromAbove = guideView


for post in 1...70 {

    let v = PostLineItem(labelText: "Tst", labelHeader: "Tst2")
    scrollView.addSubview(v)

    NSLayoutConstraint.activateConstraints([
        NSLayoutConstraint(item: v, attribute: .Top, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Bottom, multiplier: 1.0, constant: 15),
        NSLayoutConstraint(item: v, attribute: .Left, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Left, multiplier: 1.0, constant: 0),
        NSLayoutConstraint(item: v, attribute: .Width, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Width, multiplier: 1.0, constant: 0),
                 NSLayoutConstraint(item: v, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 400)
        ])
    viewFromAbove = v
    }

    scrollView.addConstraints([
    NSLayoutConstraint(item: viewFromAbove, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: -10)
    ])

如您所見,首先,我為第一個PostLineItem創建一個guidview,然后添加新實例和約束。

如果我這樣做,PostLineItem類的實例將位於相同的位置並彼此隱藏...我認為,NSLAyoutConstaint無效。

但是,正如您在代碼的注釋部分看到的那樣,如果我創建一個簡單的UILabel,則約束工作正常,並且所有UILabel實例都將位於彼此之下。

更新:在我添加所有答案后,它看起來像這樣.. :(

在此處輸入圖片說明

那小小的紅色矩形是我的PostLineItem實例.. :(

更新-所有代碼。

我想您可能是將約束添加到了錯誤的視圖中。 例如,應該將guideView高度約束添加到guideView ,而不要添加到scrollView 我建議您改用激活約束的新方法。 無需將它們添加到視圖中,只需在NSLayoutConstraint上調用activateConstraints類方法:

NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: guideView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1.0, constant: 24),
            NSLayoutConstraint(item: guideView, attribute: .Left, relatedBy: .Equal, toItem: scrollView, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: guideView, attribute: .Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: guideView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant:4)
            ])

NSLayoutConstraints.activateConstraints([
            NSLayoutConstraint(item: v, attribute: .Top, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Bottom, multiplier: 1.0, constant: 5),
            NSLayoutConstraint(item: v, attribute: .Left, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: v, attribute: .Width, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Width, multiplier: 1.0, constant: 0),
            ])

另外,您缺少對PostLineItem的高度的約束,例如:

NSLayoutConstraint(item: v, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant:10)

在您的PostLineItem初始化中,您需要為timeLineBlock添加約束:

init(labelText: String , labelHeader: String) {
    super.init(frame: CGRect.zeroRect)
    self.labelText = labelText
    self.labelHeader = labelHeader
    let tlb = timeLineBlock()
    self.addSubview(tlb)
    NSLayoutConstraint.activateConstraints([
        NSLayoutConstraint(item: tlb, attribute: .Height, relatedBy: .Equal, toItem: self, attribute: .Height, multiplier: 1.0, constant: 0),
        NSLayoutConstraint(item: tlb, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0),
        NSLayoutConstraint(item: tlb, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1.0, constant: 0),
        NSLayoutConstraint(item: tlb, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0)
    ])
}

這是我的版本。 我得到了更好的結果。 看一下...注意,我完全在Interface Builder中設置了scrollView,只是添加了一個名為scrollView的出口,該出口指向我的scrollView所包含的contentView。 沒關系 其他一切都與您實現時相同。

class PostLineItem: UIView {


    var labelText : String!
    var labelHeader : String!

    init(labelText: String , labelHeader: String) {
        super.init(frame: CGRect.zeroRect)
        self.labelText = labelText
        self.labelHeader = labelHeader
        let tlb = timeLineBlock()
        self.addSubview(tlb)
        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: tlb, attribute: .Height, relatedBy: .Equal, toItem: self, attribute: .Height, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: tlb, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0)
        ])
    }

    required init(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)
        println("required public")
    }


    private func timeLineBlock() -> UIView{

        let viewNew = UIView()
        viewNew.setTranslatesAutoresizingMaskIntoConstraints(false)


        let titleLabel = UILabel()
        titleLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
        titleLabel.font = UIFont(name: "ArialMT", size: 20)
        titleLabel.textColor = UIColor.blackColor()
        titleLabel.text = labelHeader
        titleLabel.numberOfLines = 0
        viewNew.addSubview(titleLabel)
        titleLabel.backgroundColor = UIColor.redColor()

        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: titleLabel, attribute: .Width, relatedBy: .Equal, toItem: viewNew, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: titleLabel, attribute: .Left, relatedBy: .Equal, toItem: viewNew, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: titleLabel, attribute: .Top, relatedBy: .Equal, toItem: viewNew, attribute: .Top, multiplier: 1.0, constant: 0)
        ])

        viewNew.backgroundColor = UIColor.greenColor()
        return viewNew
    }
}

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let guideView = UIView()
        guideView.setTranslatesAutoresizingMaskIntoConstraints(false)
        guideView.backgroundColor = UIColor.blackColor()
        scrollView.addSubview(guideView)
        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: guideView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1.0, constant: 24),
            NSLayoutConstraint(item: guideView, attribute: .Left, relatedBy: .Equal, toItem: scrollView, attribute: .Left, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: guideView, attribute: .Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0),
            NSLayoutConstraint(item: guideView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant:4)
            ])
        guideView.backgroundColor = UIColor.blackColor()
        var viewFromAbove = guideView


        for post in 1...70 {

            let v = PostLineItem(labelText: "Tst", labelHeader: "Tst2")

            //let v = UILabel(frame: CGRectMake(0, 0, 10, 10))
            //v.text = "Tst Now with this its working, and the constraint is fine."

            v.setTranslatesAutoresizingMaskIntoConstraints(false)

            scrollView.addSubview(v)

            NSLayoutConstraint.activateConstraints([
                NSLayoutConstraint(item: v, attribute: .Top, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Bottom, multiplier: 1.0, constant: 5),
                NSLayoutConstraint(item: v, attribute: .Left, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Left, multiplier: 1.0, constant: 0),
                NSLayoutConstraint(item: v, attribute: .Width, relatedBy: .Equal, toItem: viewFromAbove, attribute: .Width, multiplier: 1.0, constant: 0),
                NSLayoutConstraint(item: v, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant:30)
                ])

            viewFromAbove = v
        }
    }
}

iPhone6上面的運行代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM