Background
I am making a vertical label to use with traditional Mongolian script. Before I was just rotating a UILabel
but there were some performance issues and other complications with this. Now I am working on making a label from scratch. However, I need the vertical label to tell auto layout when its height adjusts (based on string length).
What I have read
I read the Intrinsic Content Size and Views with Intrinsic Content Size documentation. These were more about how to use it, though, and not how to define it in a custom view.
Searching for "ios intrinsic content size for a custom view" only gives me
in Stack Overflow. This particular question didn't even need intrinsic content size because their view was just an assembly of standard views.
What I am trying
What I am trying is my answer below. I am adding this Q&A pair so that it won't take other people as long to find the answer as it took me with the search keywords that I used.
Setting the intrinsic content size of a custom view lets auto layout know how big that view would like to be. In order to set it, you need to override
intrinsicContentSize
.Then call
Whenever your custom view's intrinsic content size changes and the frame should be updated.
Notes
Swift 3 update: Easier Auto Layout: Coding Constraints in iOS 9
Read Writing a Custom Control for iOS 8 using Swift and Auto Layout for an example of how this is done correctly in context.
invalidateIntrinsicContentSize()
.Based on the excellent answer above,
example of a "view with intrinsic height" ...
which you can set as an inspectable
Since it has an intrinsic height, it can (for example) be immediately inserted in a stack view in code:
In contrast, if it was a normal view with no intrinsic height, you'd have to add a height anchor or it would crash:
Note that in the special case of a stack view:
so, setting the intrinsic height works perfectly; since
Remembering that in all normal cases of a subview, many other anchors are needed.