Damien Del Russo
Damien Del Russo

Reputation: 1048

UISegmentedControl within UINavigationController UIToolbar not correctly resizing

I am programmatically adding a UISegmentedControl to a UINavigationController's toolbar (I am in a UITableViewController). I want the segmented control to look decent, not filling the entire bar. Also, I want it to rotate with the view and resize. This should be pretty easy but I think I'm missing something. I actually got it to work, but this is not clean code so I am hoping someone can tell me which settings/methods to use for a "proper" implementation.

Getter:

- (UISegmentedControl*)stockFilterSegmentedControl {
if (!_stockFilterSegmentedControl) {
    _stockFilterSegmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"All",@"Holdings", nil]];
    [_stockFilterSegmentedControl addTarget:self action:@selector(stockFilterControlPressed:) forControlEvents:UIControlEventValueChanged];
    _stockFilterSegmentedControl.selectedSegmentIndex = 0;
    _stockFilterSegmentedControl.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    CGRect newFrame = _stockFilterSegmentedControl.frame;
    newFrame.size.height = self.navigationController.toolbar.frame.size.height * .8;
    _stockFilterSegmentedControl.frame = newFrame;
}

return _stockFilterSegmentedControl;
}

Where we insert it:

- (NSArray*)navFooterToolbarArray {
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.stockFilterSegmentedControl];
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *refresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
return [NSArray arrayWithObjects:flexibleSpace, barButtonItem, flexibleSpace, refresh, nil];    
}

- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Stocks";
self.toolbarItems = [self navFooterToolbarArray];
}

And to make it work I had to add:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
NSLog(@"Did autorotate.");
CGRect newFrame = self.stockFilterSegmentedControl.frame;
newFrame.size.height = self.navigationController.toolbar.frame.size.height * .8;
self.stockFilterSegmentedControl.frame = newFrame;
}

What's the right way to do this?

Thanks,

Damien

Upvotes: 0

Views: 1767

Answers (2)

Damien Del Russo
Damien Del Russo

Reputation: 1048

The answer is actually really simple - you set the segmentedControlStyle on the segmented control to UISegmentedControlStyleBar and it will resize perfectly without any drama. Autoresizing masks work as expected.

Thanks,

Damien

Upvotes: 2

Nick Lockwood
Nick Lockwood

Reputation: 41005

All you should really need is something like:

_stockFilterSegmentedControl.frame = CGRectInset(self.navigationController.toolbar.bounds, 5, 5); //set to toolbar rect inset by 5 pixels
_stockFilterSegmentedControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

You then won't have to do anything when the view rotates, it should just automatically resize to fit because of the autoresizingMask.

Upvotes: 1

Related Questions