ios - 在 iOS 8 上自定义 UISegmentedControl

标签 ios uikit uisegmentedcontrol

iOS 7 和 8 似乎使自定义 UISegmentedControl 的旧方法不再完全起作用。我一直像过去一样设置分隔线图像和所有内容,但似乎有一些以前的 iOS 版本中不存在的新状态,因此出现了一些奇怪的视觉效果。

enter image description here

这是我正在使用的代码

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

现在看来,分隔符图像宽度是一个重要的事情。它对内容标签的宽度和位置有影响。因此,deider 图像应该尽可能缩小。

关于ios - 在 iOS 8 上自定义 UISegmentedControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26762383/

相关文章:

iphone - 为 UITableView 过滤内容

ios - Apple Reachability 未显示警报

ios - 有没有办法观察 UIViewPropertyAnimator 中 fractionComplete 的变化

ios - UISegmentedControl 仅在重新访问 ViewController 时更改文本颜色

ios - 使用 UISegmentedControl 在 View 之间切换

iphone - 是否可以在 cocoa 或 iPhone 中将视频编码从 H.263 转换为 H.264

ios - 从两个类访问同一段代码

ios - objective-c 中具有三个按钮(带图标)的自定义单元格

iOS: UIView 子类 init 或 initWithFrame:?

ios - UISegmentedControl 和 UIAppearance 的奇怪行为