【问题标题】:Customizing UISegmentedControl: how change tint color of selected segment's image?自定义 UISegmentedControl:如何更改所选片段图像的色调?
【发布时间】:2015-12-31 04:43:33
【问题描述】:

我已经将这个extension 用于UISegmentedControl,正如你所见here.

但我想UISegementedControl 的工作方式略有不同。当我选择一个段时,我希望所选段的图像将颜色更改为colorGreyLight,而不是将背景颜色更改为colorGreyDark,并将所选段图像更改为UIColor.clearColor()(如您所见here

那么我该怎么做呢?

我的代码

UISegmented 控件扩展:

extension UISegmentedControl {
    func removeBorders() {
        setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Normal, barMetrics: .Default)
        setBackgroundImage(imageWithColor(tintColor), forState: .Selected, barMetrics: .Default)
        setDividerImage(imageWithColor(UIColor.clearColor()), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default)
    }

    // create a 1x1 image with this color
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor);
        CGContextFillRect(context, rect);
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image
    }
}

UISegemented 控制:

    let types = ["rectangle", "circle", "triangle"]
    shapeSelector = UISegmentedControl(items: types)
    shapeSelector.frame = CGRectMake(0, 0, sliderHeight*3 + 30, sliderHeight)
    shapeSelector.center = CGPoint(x: drawToolbar.bounds.width/2, y: sliderCenterY)
    shapeSelector.tintColor = colorGreyDark
    shapeSelector.removeBorders()
    shapeSelector.selectedSegmentIndex = 0 //default: select rectangle
    shapeSelector.addTarget(self, action: "selectShape:", forControlEvents: .ValueChanged)
    shapeSelector.setImage(UIImage(named: "rectangle"), forSegmentAtIndex: 0)
    shapeSelector.setImage(UIImage(named: "circle"), forSegmentAtIndex: 1)
    shapeSelector.setImage(UIImage(named: "triangle"), forSegmentAtIndex: 2)
    shapeSelector.contentMode = UIViewContentMode.ScaleAspectFit
    drawToolbar.addSubview(shapeSelector)

如果我使用的是任何问题:

  • IOS 9.2
  • 斯威夫特 2
  • Xcode 7.2

更新 好的,所以我按照 Keyur 的建议更改了我的代码(如下面的 cmets 标记)

UISegmented 控件扩展:

extension UISegmentedControl {
    func removeBorders() {
        setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Normal, barMetrics: .Default)
        setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Selected, barMetrics: .Default) //change to clear color
        setDividerImage(imageWithColor(UIColor.clearColor()), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default)
    }

    // create a 1x1 image with this color
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor);
        CGContextFillRect(context, rect);
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image
    }
}

UISegemented 控制:

    let types = ["rectangle", "circle", "triangle"]
    shapeSelector = UISegmentedControl(items: types)
    shapeSelector.frame = CGRectMake(0, 0, sliderHeight*3 + 30, sliderHeight)
    shapeSelector.center = CGPoint(x: drawToolbar.bounds.width/2, y: sliderCenterY)
    shapeSelector.tintColor = colorGreyDark
    shapeSelector.removeBorders()
    shapeSelector.selectedSegmentIndex = 0 //default: select rectangle
    (shapeSelector.subviews[0] as UIView).tintColor = colorGreyLight //added this line
    shapeSelector.addTarget(self, action: "selectShape:", forControlEvents: .ValueChanged)
    shapeSelector.setImage(UIImage(named: "rectangle"), forSegmentAtIndex: 0)
    shapeSelector.setImage(UIImage(named: "circle"), forSegmentAtIndex: 1)
    shapeSelector.setImage(UIImage(named: "triangle"), forSegmentAtIndex: 2)
    shapeSelector.contentMode = UIViewContentMode.ScaleAspectFit
    drawToolbar.addSubview(shapeSelector)

selectShape()函数:

func selectShape(sender: UISegmentedControl){
    switch sender.selectedSegmentIndex{
    case 0: //rectangle
        shapeType = "rectangle"
        (sender.subviews[0] as UIView).tintColor = colorGreyLight
        (sender.subviews[1] as UIView).tintColor = colorGreyDark
        (sender.subviews[2] as UIView).tintColor = colorGreyDark
    case 1: //circle
        shapeType = "circle"
        (sender.subviews[0] as UIView).tintColor = colorGreyDark
        (sender.subviews[1] as UIView).tintColor = colorGreyLight
        (sender.subviews[2] as UIView).tintColor = colorGreyDark
    case 2: //triangle
        shapeType = "triangle"
        (sender.subviews[0] as UIView).tintColor = colorGreyDark
        (sender.subviews[1] as UIView).tintColor = colorGreyDark
        (sender.subviews[2] as UIView).tintColor = colorGreyLight
    default:
        shapeType = "rectangle"
        (sender.subviews[0] as UIView).tintColor = colorGreyLight
        (sender.subviews[1] as UIView).tintColor = colorGreyDark
        (sender.subviews[2] as UIView).tintColor = colorGreyDark
    }
}

除非我尝试过,否则所选形状并不总是突出显示的形状,如您所见here。它似乎几乎是随机突出显示形状,我不明白为什么。

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: ios swift uisegmentedcontrol


    【解决方案1】:
    (shapeSelector.subviews[2] as UIView).tintColor = UIColor .redColor()
    (shapeSelector.subviews[1] as UIView).tintColor = UIColor .redColor()
    (shapeSelector.subviews[0] as UIView).tintColor = UIColor .redColor()
    

    【讨论】:

    • 我已按照您的建议更改了我的代码。谢谢你。除了现在选定的形状并不总是突出显示的形状。你知道为什么会这样吗?
    【解决方案2】:
    1. 在您的 removeborders() 函数中设置颜色。

    setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Normal, barMetrics: .Default) setBackgroundImage(imageWithColor(UIColor.lightGrayColor()), forState: .Selected, barMetrics: .Default)

    【讨论】:

      【解决方案3】:

      感谢this post.,我找到了答案

      显然选择的索引不是分配色调颜色的可靠方法。相反,我必须自己跟踪这些细分市场。

      这就是我在创建UISegmentedControl shapeSelector 后所做的:

      var segments: [UIView] = [UIView]()
      for i in 0...shapeSelector.subviews.count-1{
          segments.append(shapeSelector.subviews[i])
      }
      

      在我的UISegmentedControl 的函数中我做了:

      func selectShape(sender: UISegmentedControl){
          let i = sender.selectedSegmentIndex
          for s in segments{
              s.tintColor = colorGreyDark
          }
          segments[i].tintColor = colorGreyLight
      
          switch i{
          case 0:
              shapeType = "rectangle"
          case 1:
              shapeType = "circle"
          case 2:
              shapeType = "triangle"
          default:
              shapeType = "rectangle"
          }
      }
      

      现在一切正常!


      完整代码

      extension UISegmentedControl {
          func removeBorders() {
              setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Normal, barMetrics: .Default)
              setBackgroundImage(imageWithColor(UIColor.clearColor()), forState: .Selected, barMetrics: .Default)
              setDividerImage(imageWithColor(UIColor.clearColor()), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default)
      }
      
          // create a 1x1 image with this color
          private func imageWithColor(color: UIColor) -> UIImage {
              let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
              UIGraphicsBeginImageContext(rect.size)
              let context = UIGraphicsGetCurrentContext()
              CGContextSetFillColorWithColor(context, color.CGColor);
              CGContextFillRect(context, rect);
              let image = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
              return image
          }
      }
      
      class DrawViewController: UIViewController {
      
          var shapeSelector: UISegmentedControl = UISegmentedControl()
          var segments: [UIView] = [UIView]()
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              //set up shape selector
              let types = ["rectangle", "circle", "triangle"]
              shapeSelector = UISegmentedControl(items: types)
              shapeSelector.frame = CGRectMake(shapeTypeLabel.frame.maxX + sliderSpace, 0, sliderHeight*3 + 30, sliderHeight)
              shapeSelector.center.y = shapeTypeLabel.center.y
              shapeSelector.tintColor = colorGreyDark
              shapeSelector.removeBorders()
              shapeSelector.addTarget(self, action: "selectShape:", forControlEvents: .ValueChanged)
              shapeSelector.setImage(UIImage(named: "rectangle"), forSegmentAtIndex: 0)
              shapeSelector.setImage(UIImage(named: "circle"), forSegmentAtIndex: 1)
              shapeSelector.setImage(UIImage(named: "triangle"), forSegmentAtIndex: 2)
              for i in 0...shapeSelector.subviews.count-1{
                  segments.append(shapeSelector.subviews[i])
              }
              shapeSelector.selectedSegmentIndex = 0 //default: select rectangle
              segments[0].tintColor = colorGreyLight
              shapeSelector.contentMode = UIViewContentMode.ScaleAspectFit
              drawToolbar.addSubview(shapeSelector)
          }
      
          func selectShape(sender: UISegmentedControl){
              let i = sender.selectedSegmentIndex
              for s in segments{
                  s.tintColor = colorGreyDark
              }
              segments[i].tintColor = colorGreyLight
      
              switch i{
              case 0:
                  shapeType = "rectangle"
              case 1:
                  shapeType = "circle"
              case 2:
                  shapeType = "triangle"
              default:
                  shapeType = "rectangle"
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多