Re: Hybrid Autolayout/Storyboard
Re: Hybrid Autolayout/Storyboard
- Subject: Re: Hybrid Autolayout/Storyboard
- From: Yingshen Yu <email@hidden>
- Date: Wed, 10 Oct 2012 08:33:09 +0800
There is a way shown in WWDC AutoLayout session. Keep XIB AutoLayout enabled, then subclass the container control and override its updateConstraints method. In the very beginning call [self setAutoTranslateAutoResizingMasks:NO];
Depending on your situation, you might also need to set autoTranslateAutoReaizingMasks to NO for the child controls too.
And you can verify the final constraints by printing [self constraints] in the end of this method.
Hope it helps.
-Jonny
在 2012-10-10,上午1:22,Roland King <email@hidden> 写道:
> Is there a good, supported way to use Autolayout in a sort of hybrid mode where you use IB to add and configure views, put text in labels etc, but actually add the constraints in code using the rather clever constraint string representation at runtime? If you turn Autolayout off for a Storyboard then it's off for everything and you can't use it for anything, I only want to do this for a few views/scenes, some I'm happy to configure in IB, if Autolayout is on then IB adds constraints for everything which means you have to either add outlets for those constraints and remove them, or crawl the view hierarchy and remove them all them before adding your own which seems hopelessly inefficient. I want them not to exist at all for some views until I add them.
>
> The motivation for this is that IB's support for autolayout is a bit .. random. I'm spending a LOT of time messing about trying to thwart the auto-constraint-adding process in some views/scenes where I could express what I want very simply using the string format. IB has a particularly nasty habit of adding fixed width constraints to things as you move them around, width constraints which are totally unnecessary(*) and usually 'auto constraints' which means you can't damned well delete them. Sometimes you can promote them to user constraints and delete them, sometimes that just makes them come back again, sometimes you can lower their priority to 1 and then delete them, for some bizarre reason, sometimes you can't get rid of them at all and end up removing a view, re-adding it and doing the constraints in a different order and that occasionally works. It wastes a sugar load of time and just when you think you got it right, you add one more label, a fixed width arrives randomly somewhere and you have to spend another 10 minutes mucking about getting rid of it. If I could just say 'make the objects, use autolayout, I'll add the constraints myself in code' and then deal with any of the layout exceptions myself, the exceptions being quite rich and easy to understand, I could build things faster and with less frustration. And I want to do this on a per-view or at least per-scene level in a storyboard.
>
> (*)By totally unnecessary I do mean that IB has added an auto constraint which, if you do manage to find a way to remove it by one or other trick, with not one single other constraint in the system changing, not one priority, not one anything, the autolayout is still fully specified and consistent and shows no log messages when laid out, they are constraints which either should not be added at all, or should be added as user constraints for extra specification which can be removed at will. Making the text of long labels shorter is a particularly good example of this, IB bungles this up constantly.
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden