在iOS 8上自定义UISegmentedControl

iOS 7和8似乎使得定制UISegmentedControl的旧方法无法完全发挥作用。 我一直在设置分频器图像和过去常见的所有内容,但似乎有一些新的状态在以前的iOS版本中不存在,因此有一些奇怪的视觉效果。

在此处输入图像描述

这是我正在使用的代码

// 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) 

这是一些应该立即处理的新状态:

 //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]; 

看来,设计者的图像宽度现在是一件很重要的事情。 它对内容标签的宽度和位置有影响。 所以devider图像应尽可能缩小。