Configure UISegmentedControl on iOS 8
iOS 7 and 8 seem to make the old ways of setting up the UISegmentedControl not completely work. I've been setting separator images and everything I've always had in the past, but there doesn't seem to be any new states in previous versions of iOS and some weird visuals appear as a result.
Here's the code I'm using
// Set divider images
self.setDividerImage(UIImage(named: "SegmentedControlNoneSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlRightSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Selected, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlRightSelected"), forLeftSegmentState: .Normal, rightSegmentState: .Highlighted, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlLeftSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Normal, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Highlighted, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Selected, rightSegmentState: .Selected, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Selected, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlBothSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Highlighted, barMetrics: .Default)
self.setDividerImage(UIImage(named: "SegmentedControlLeftSelected"), forLeftSegmentState: .Highlighted, rightSegmentState: .Normal, barMetrics: .Default)
// Set background images
var normalBackgroundImage = UIImage(named: "SegmentedControlNormal")
self.setBackgroundImage(normalBackgroundImage, forState: .Normal, barMetrics: .Default)
var selectedBackgroundImage = UIImage(named: "SegmentedControlSelected");
self.setBackgroundImage(selectedBackgroundImage, forState: .Selected, barMetrics: .Default)
self.setBackgroundImage(selectedBackgroundImage, forState: .Highlighted, barMetrics: .Default)
self.setBackgroundImage(selectedBackgroundImage, forState: .Disabled, barMetrics: .Default)
self.setBackgroundImage(selectedBackgroundImage, forState: .Application, barMetrics: .Default)
self.setBackgroundImage(selectedBackgroundImage, forState: .Reserved, barMetrics: .Default)
+3
source to share
1 answer
This is the new status that needs to be processed now:
//The highlighted button can be still unselected
[self.mySegmentedControl setBackgroundImage:unselectedBackgroundImage
forState:UIControlStateHighlighted
barMetrics:UIBarMetricsDefault];
//The alredy selected button is stil selected when it is highlighted
[self.mySegmentedControl setBackgroundImage:selectedBackgroundImage
forState:UIControlStateHighlighted|UIControlStateSelected
barMetrics:UIBarMetricsDefault];
//Handle when the right segment is highlighted but the left is selected
[self.mySegmentedControl setDividerImage:leftSelectedImage
forLeftSegmentState:UIControlStateSelected
rightSegmentState:UIControlStateHighlighted
barMetrics:UIBarMetricsDefault];
//Handle when the right segment is already selected and just highlighted and the right is normal
[self.mySegmentedControl setDividerImage:leftSelectedImage
forLeftSegmentState:UIControlStateHighlighted|UIControlStateSelected
rightSegmentState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
//Handle when the left segment is highlighted but the right is selected
[self.mySegmentedControl setDividerImage:rightSelectedImage
forLeftSegmentState:UIControlStateHighlighted
rightSegmentState:UIControlStateSelected
barMetrics:UIBarMetricsDefault];
//Handle when the left segment is already selected and just highlighted and the left is normal
[self.mySegmentedControl setDividerImage:rightSelectedImage
forLeftSegmentState:UIControlStateNormal
rightSegmentState:UIControlStateHighlighted|UIControlStateSelected
barMetrics:UIBarMetricsDefault];
And it looks like the width of the devider image is important right now. This affects the width and position of the content label. So the devider image should be as compressed as possible.
+2
source to share