简体   繁体   中英

Using a Custom xib in UISTackView

I'm trying to make my life easier by only building one xib to reuse rather than building three views to put into a stackView

I have created my custom xib file and connected it its own custom class:

我的Xib文件称为UserReview.xib

The labels, and images are placed by constraints. I want the labels to be able to auto resize, up to three lines, so the height constraints for the labels are >=, as well as the Content View which also can scale in height (>=)

The UserReview code:

class UserReview: UIView {

@IBOutlet weak var userImage: UIImageView!
@IBOutlet weak var username: UILabel!
@IBOutlet weak var userRating: UILabel!
@IBOutlet weak var reviewText: UILabel!
@IBOutlet weak var prosText: UILabel!
@IBOutlet weak var consText: UILabel!

class func instanceFromNib() -> UIView {
    return UINib(nibName: "UserReview", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}

func setUp(review: Review){
        // TODO set userImage
        username.text = review.username!
        // TODO add rating + color
        reviewText.text = review.content!
        if let pros = review.positive_points {
            prosText.text = pros
        } else {
            prosText.text = "No Positive Points"
        }
        if let cons = review.negative_points {
            consText.text = cons
        } else {
            consText.text = "No Negative Points"
        }

    }

}

The StackView where i am trying to add subViews to also has a height constraint of >= 200 (min one card) but does not seem to resize with more cards added. The Alignment is Fill and Distribution: Equal Spacing

I have tried playing around with the constraints and alignment properties for the StackView containing reviews but the closest i can come to is overlapping Views..

The way i create and add views to the stack view:

        let review1 = UserReview.instanceFromNib() as! UserReview
        let review2 = UserReview.instanceFromNib() as! UserReview
        let review3 = UserReview.instanceFromNib() as! UserReview

        self.reviewStack.addArrangedSubview(review1)
        self.reviewStack.addArrangedSubview(review2)
        self.reviewStack.addArrangedSubview(review3)

From what i understand from this stack question The StackView has issues with the view height? I have tried most of the suggested solutions but encountering different issues..

The result i am trying to get:

想要的结果

(The images are gone for some reason, will check that later.)

First of all remove height constraint from UIStackView because StackView always expands it's height based on the views inside it.

Set all the 4 sides constraints of StackView to it's superview and set intrinsic size as place holder.

Now add your UIView to stack view in the same manner you are doing it now. Do not set height constraint to any UIView label and the UIView itself. Just make sure yo have set top constraint of top most element and bottom constraint of bottom element. This ways auto layout understand how to increase height of all the elements based on their constraints and content.

For detailed understanding you can follow my answer at https://stackoverflow.com/a/57954517/3339966

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM