Aashish Nagar
Aashish Nagar

Reputation: 49

Get height of uiview added by autolayout

I am added a view in viewDidAppear method using autolayout. In the end of viewDidAppear trying to find the height of view that I added , I am getting zero?

That view I am adding has a label , height of that label is dynamic

let viewToShowIn = self.view!
let bannerView = UIView()
bannerView.backgroundColor = UIColor.red

let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false

viewToShowIn.addSubview(bannerView)
bannerView.addSubview(label)

let margins = viewToShowIn.layoutMarginsGuide

bannerView.translatesAutoresizingMaskIntoConstraints = false

bannerView.leadingAnchor.constraint(equalTo: viewToShowIn.leadingAnchor, constant: 0).isActive = true
bannerView.trailingAnchor.constraint(equalTo: viewToShowIn.trailingAnchor, constant: 0).isActive = true
let bannerTopConstraint =    bannerView.topAnchor.constraint(equalTo: margins.topAnchor, constant: 0)
bannerTopConstraint.isActive = true

label.font = UIFont.systemFont(ofSize: 20)
label.text = "kjafj kfj fk fjk dakjd k fdjakljf dkfjklsdjf dfsjlkj lkfsdjlkjl sjflksdjfljslf sdfljdslkjflsdjf sldfjlksj"
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
label.textAlignment = .center

label.leadingAnchor.constraint(equalTo: bannerView.leadingAnchor, constant: 20).isActive = true
label.trailingAnchor.constraint(equalTo: bannerView.trailingAnchor, constant: -20).isActive = true
label.topAnchor.constraint(equalTo: bannerView.topAnchor, constant: 10).isActive = true
bannerView.bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 10).isActive = true

Upvotes: 1

Views: 84

Answers (2)

Disha Ladani
Disha Ladani

Reputation: 72

Declare your label and view as global variable like

var viewToShowIn = UIView()
let bannerView = UIView()
let label = UILabel()

Then set constraints in viewDidAppear or viewDidLoad

    viewToShowIn = self.view!
    bannerView.backgroundColor = UIColor.red

    label.translatesAutoresizingMaskIntoConstraints = false

    viewToShowIn.addSubview(bannerView)
    bannerView.addSubview(label)

    let margins = viewToShowIn.layoutMarginsGuide

    bannerView.translatesAutoresizingMaskIntoConstraints = false

    bannerView.leadingAnchor.constraint(equalTo: viewToShowIn.leadingAnchor, constant: 0).isActive = true
    bannerView.trailingAnchor.constraint(equalTo: viewToShowIn.trailingAnchor, constant: 0).isActive = true
    let bannerTopConstraint =    bannerView.topAnchor.constraint(equalTo: margins.topAnchor, constant: 0)
    bannerTopConstraint.isActive = true

    label.font = UIFont.systemFont(ofSize: 20)
    label.text = "kjafj kfj fk fjk dakjd k fdjakljf dkfjklsdjf dfsjlkj lkfsdjlkjl sjflksdjfljslf sdfljdslkjflsdjf sldfjlksj"
    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.textAlignment = .center

    label.leadingAnchor.constraint(equalTo: bannerView.leadingAnchor, constant: 20).isActive = true
    label.trailingAnchor.constraint(equalTo: bannerView.trailingAnchor, constant: -20).isActive = true
    label.topAnchor.constraint(equalTo: bannerView.topAnchor, constant: 10).isActive = true
    bannerView.bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 10).isActive = true

You will get height of your view or label in viewWillLayoutSubviews() or viewDidLayoutSubviews() method

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // GET YOUR HEIGHT HERE
}

Upvotes: 2

Mahendra
Mahendra

Reputation: 8924

After adding all constraints to view just call self.view.layoutIfNeeded()

It will force auto layout engine to calculate view size.

Upvotes: 0

Related Questions