Dear list,

I wanted to change the way some components in my app resize, and it seemed 
sensible to use auto-layout to achieve this (because it seemed impossible/hard 
to do with the old springs and struts method).

The view hierarchy is roughly like this:

Window
        - Splitview
                - Outline view
                - Tabview
                        - tab1
                        - tab2
                        - tab3

The view in each tab comes from their own xib and I add them programatically at 
app launch.

The outline view is constrained to have a minimum size and the splitview has a 
higher holding priority on the left pane.

All works well except for tab2. For some reason when I resize the window the 
view in tab2 remains a fixed width and the splitview divider moves, so that the 
outline view resizes. The views in the tabs are all rather similar and I can't 
see that I've got any constraints which are dramatically different on any of 
the three tabs. Of course, I may have, which is partly why I'm writing this 
mail. I'm finding it very tricky to debug the behaviour of auto-layout, so any 
clues in that respect will be gratefully received.

Q1) What could I have done on tab2's view that causes the splitview to move 
rather than the view to resize when I resize the window?

Additionally, I saw in the WWDC2012 videos on the topic that one should never 
call -setFrame: on views which are controlled by auto-layout. Which brings me 
to a side question. When I add the views to the tab content views at app 
launch, I do something like this:

  self.panel = [[PanelViewController alloc] initWithDelegate:self];
  [self.panel.view setFrame:[self.panelContainer bounds]];
  [self.panelContainer addSubview:self.panel.view];

Q2) How should I replace this -setFrame: call for auto-layout? If I simply miss 
it out, the view gets a zero size (at least I assume so since it doesn't 
appear). I've tried adding constraints so that it has fixed offsets of zero 
from its superview, but that caused other strange behaviour. So what's the 
correct procedure? 

Adding these constraints:

  NSArray *constraints = [NSLayoutConstraint 
constraintsWithVisualFormat:@"H:|[view(==superview)]|"
                                                                 
options:NSLayoutFormatAlignAllLeft
                                                                 metrics:nil
                                                                   
views:@{@"view" : self.panel.view, @"superview" : self.panelContainer}
                          ];
  
  [self.panelContainer addConstraints:constraints];
  constraints = [NSLayoutConstraint 
constraintsWithVisualFormat:@"V:|[view(==superview)]|"
                                                        
options:NSLayoutFormatAlignAllBottom
                                                        metrics:nil
                                                          views:@{@"view" : 
self.panel.view, @"superview" : self.panelContainer}
                 ];
  
  [self.panelContainer addConstraints:constraints];

gives me "Unable to simultaneously satisfy constraints" exceptions. I've 
watched the three WWDC2012 videos related to auto-layout but I haven't quite 
found any examples of quite what I want to do, or how to debug the behaviour I 
see.

Many thanks,

Martin
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to