【问题标题】:Customize UISegmentedControl on iOS 8在 iOS 8 上自定义 UISegmentedControl
【发布时间】:2015-01-01 22:49:21
【问题描述】:

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)

【问题讨论】:

  • 你有没有想过这个问题?我有同样的问题。
  • @JamieForrest 我最终制作了一个自定义控件来完成工作。它的功能不如普通的分段控件,但它适合我的需要。
  • 是的,我也打算这样做。不是一个很好的选择,但似乎是目前唯一的一个。
  • 请检查我的答案,如果您觉得有用,请将其标记为解决方案。
  • @ingaham 它不能解决问题。在 Swift 2.0 中,您的某些语法也不正确。

标签: ios uikit uisegmentedcontrol


【解决方案1】:

现在应该处理一些新的状态:

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

现在看来,分隔符图像宽度很重要。它对内容标签的宽度和位置有影响。因此,分配器图像应尽可能缩小。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多