I want to position a sub UIView (sub_UIView
) as a subview of parent UIView (parent_UIView
). When the parent_UIView
resizing/moving, the sub_UIView
would stay the relative position of the parent_UIView
. For example, the sub_UIView
is at the bottom right corner of the parent_UIView
. When the parent_UIView
is moving, the sub_UIView
would stay at the bottom right corner of the parent_UIView
automatically.
I managed to do this manually by updating the frame of the sub_UIView
when the parent_UIView
's frame moving, but how to do this automatically in iOS? are there any properties for this? (similar to autoresizingmask
for resizing subviews)
Updated old response, that only mentioned resizing masks
In iOS 6, autolayout was added, albeit, kinda ugly to work with XCode in a storyboard/xib. Autolayout is way too big to explain, but the essence of it, is that it's a set of rules between views within the hierarchy. Thus, you can stick the x position of a view to the right border of a parent view. See the Auto Layout Programming Guide
Take a look at the options in the Size Inspector:
This is the equivalent of doing
myView.autoresizingMask = UIViewAutoresizingMaskFlexibleTopMargin |
UIViewAutoresizingMaskFlexibleLeftMargin |
UIViewAutoresizingMaskFlexibleWidth |
UIViewAutoresizingMaskFlexibleHeight;
Notice that there's a difference between doing it by code and doing it through IB. The IB autoresizing settings for the borders work as struts, selecting the right one, for example, means, "my right border is now stuck to the superview's right border".
On the other hand, code does the opposite, where you need to specify which borders are not strut-ed, aka. they are flexible. Height and Width works normally.
If everything fails, don't start doing manual positioning all over the place, I've been in that position, and it just leads to unmaintanable, spaghetti code, where three or more methods are messing with the same view properties.
Instead, prefer to do all your custom positioning on UIView -layoutSubviews
. This method gets called as needed when a setNeedsLayout
has been triggered, for example, when the width a view changes, the subviews get the layout subviews event. Also makes implementing rotating interfaces much easier, since this method gets called for the new width, to determine how the animation will look like.
Keep in mind that layout subviews works after Auto Layout/Auto-resizing masks have been performed.
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