I'm working on a keyboard for iOS 8 using Autolayout to place the buttons on the view.
When I'm changing the layout using constraints, everything is appearing correctly on the screen, but when I want to know the view's frame size, I don't get the right size.
For example: I press a key, the keyboard layout changes and layouts everything according to my constraints. Then I want to know the size of any button on the screen - I do that in "viewDidLayoutSubviews" and get that result in the console:
2014-10-29 12:27:09.088 Keyboard[2193:60674] view did layout subviews
2014-10-29 12:27:09.088 Keyboard[2193:60674] {{inf, inf}, {0, 0}}
The button has the correct size and correct position, but when trying to get its frame the size is not set.
Where do I have to put my code when it is not working in viewDidLayoutSubviews?
I found a lot of questions on stackoverflow and other websited, but none of them covered my question.
I encountered a very similar issue (upvoted question) and found beeef's answer to point in the right direction. Given that Apple's documentation says not to call layoutSubviews() directly, I instead did as follows (where mySubView is a direct subview of self.view):
override func viewDidLayoutSubviews() {
// self.view's direct subviews are laid out.
// force my subview to layout its subviews:
self.mySubView.setNeedsLayout()
self.mySubView.layoutIfNeeded()
// here we can get the frame of subviews of mySubView
// and do useful things with that...
}
Just FYI, in my case mySubView is a UIScrollView, and I need to get the frame of one of its subviews, such that I can set the contentOffset accordingly before the view appears. I'm not sure whether viewDidLayoutSubviews() is the best place to do this, but it ensures that mySubView has been laid out.
Yes! I solved that problem myself.
I'm not sure if I got it right, but that's what I think:
My solution now was to manually call .layoutSubviews() on all my views which contains all my buttons of my keyboard. After that, I get the size of all the buttons I want.
Please correct me if I'm wrong.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With