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.

enter image description here

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







All Articles