Having trouble getting UIView sizeToFit to do anything meaningful
The documentation is pretty clear on this. -sizeToFit
pretty much calls -sizeThatFits:
(probably with the view's current size as the argument), and the default implementation of -sizeThatFits:
does almost nothing (it just returns its argument).
Some UIView subclasses override -sizeThatFits:
to do something more useful (e.g. UILabel). If you want any other functionality (such as resizing a view to fit its subviews), you should subclass UIView and override -sizeThatFits:
.
If you won't override UIView, u can just use extension.
Swift:
extension UIView { func sizeToFitCustom () { var size = CGSize(width: 0, height: 0) for view in self.subviews { let frame = view.frame let newW = frame.origin.x + frame.width let newH = frame.origin.y + frame.height if newW > size.width { size.width = newW } if newH > size.height { size.height = newH } } self.frame.size = size }}
The same code but 3 times faster:
extension UIView { final func sizeToFitCustom() { var w: CGFloat = 0, h: CGFloat = 0 for view in subviews { if view.frame.origin.x + view.frame.width > w { w = view.frame.origin.x + view.frame.width } if view.frame.origin.y + view.frame.height > h { h = view.frame.origin.y + view.frame.height } } frame.size = CGSize(width: w, height: h) }}
You can do some like that using IB alone (xcode 4.5):
- Click on the
UIView
- in the Size inspector drag
content hugging
to 1 (both horizontal and vertical) - drag
compression resistance
to 1000 (for both) - under the UIView's
constraints
click onWidth
and changepriority
to 250 - Do the same for Height
- You can use the
UIView
'sinset
to control padding for left/right/top/bottom