【问题标题】:how to remove border from UISegmentController?如何从 UISegment 控制器中删除边框?
【发布时间】:2015-12-18 00:58:05
【问题描述】:

我想移除 UISegmentController 的边框。如果有可能。否则更改为自定义边框颜色。

【问题讨论】:

  • 你想给它自定义边框吗??
  • 如果你删除边框那么它只会显示文本?
  • 你是要去掉边框还是要自定义??
  • 是的,我想删除边框。如果可能的话。

标签: ios uisegmentedcontrol


【解决方案1】:

更新

案例1 - 自定义segmentedControl中每个元素的borderColor

代码

extension UIView {
    ///Add border color with corners
    func addBorderWithColor(color: UIColor, roundingCorners: UIRectCorner) {
        self.layer.borderWidth = 1
        self.layer.borderColor = color.CGColor
        self.addRoundingCorners(roundingCorners)
    }
    
    ///Use corner radius depending on UIRectCorner
    private func addRoundingCorners(roundingCorners: UIRectCorner) {
        let path = UIBezierPath(roundedRect:self.bounds, byRoundingCorners:roundingCorners, cornerRadii: CGSizeMake(4, 4))
        
        let maskLayer = CAShapeLayer()
        maskLayer.path = path.CGPath
        self.layer.mask = maskLayer
    }
}

let segmentedControl = UISegmentedControl(items: ["Red", "Green", "Blue"])

segmentedControl.subviews[0].addBorderWithColor(UIColor.blueColor(), roundingCorners: [.TopRight, .BottomRight])
segmentedControl.subviews[1].addBorderWithColor(UIColor.greenColor(), roundingCorners: [])
segmentedControl.subviews[2].addBorderWithColor(UIColor.redColor(), roundingCorners: [.TopLeft, .BottomLeft])

segmentedControl.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.blackColor()], forState: UIControlState.Normal)

游乐场

案例 2 - 去除边框

代码

let segmentedControl = UISegmentedControl(items: ["Red", "Green", "Blue"])

//Change Text Attributes (Changing textColor to black)
//**Be sure to manage all the UIControlState for these attributes if you need to customize this for other states
segmentedControl.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.blackColor()], forState: UIControlState.Normal)

//Change tintColor to clear, in order to set border invisible
segmentedControl.tintColor = UIColor.clearColor()

游乐场

原答案

答案是NO
你不能移除UISegmentedControl的边框

您可以通过使用UIButtons 创建自定义控件来实现您想要的。

UISegmentedControl状态下,可以去掉UISegmentedControl中item之间的分隔线,也可以改变tintColor(borderColor)

【讨论】:

  • “EridB”。事实上,你是对的。
  • 实际上完全完全正确,因为分段控件的外观可通过UIAppearanceProtocol 完全自定义——包括移除外边缘。
  • @holex 不,您不能“删除”它。您可以通过将 tintColor 设置为 clearColor 来自定义它,这会将其与文本一起设置为不可见,然后设置 textAttributes 您可以更改 segmentedControl 中项目的 textColor。如果这是 OP 的意思,那么我将编辑 asnwer。 :)
  • @EridB,我不确定你在说什么,OP 的问题是如何删除边框,而不是要求解释你怎么不能这样做;该任务可以通过UIAppearanceProtocol 完成——如果你想更新你的答案,请这样做并向他展示它实际上是如何工作的,但是 OP 没有提出这个问题,因为他想从谁那里得到答案 不知道如何提交。
  • @holex 在这种情况下你是对的,因为它可以解决问题,但是使用 UIApperanceProtocol 需要 UI_APPEARANCE_SELECTOR 选项,这在早期版本的 iOS 中一直是一个流行的问题。因此,在说出UIAppearanceProtocol 一致性之前,您需要检查该选项。我总是倾向于跟进类的公共属性和方法,而不是进行可能导致错误或意外行为的自定义。无论如何感谢您的观点,我已经编辑了答案以符合 OP 的意图:)
【解决方案2】:

要更改分段控件的颜色和文本,请尝试:

Objective-C

NSArray *array = [segmentedControl subviews];

[[array objectAtIndex:2] setTintColor:[UIColor redColor]];
[[array objectAtIndex:1] setTintColor:[UIColor greenColor]];    
[[array objectAtIndex:0] setTintColor:[UIColor blueColor]];

斯威夫特

let array = segmentedControl.subviews
array[2].tintColor = UIColor.redColor()
array[1].tintColor = UIColor.greenColor()
array[0].tintColor = UIColor.blueColor()

请注意,subviews 与用户界面的顺序相反。

你可以用同样的方式自定义边框:

let array = segmentedControl.subviews
array[0].layer.borderWidth = 5 // change thickness of border
array[0].layer.cornerRadius = 4 //change corner radius

【讨论】:

  • 在最后一行,你打错了。 objectAtIndex:1 应该是 objectAtIndex:2
  • 谢谢“njuri”。你已经给出了最好的解决方案。再次感谢
猜你喜欢
  • 2015-10-02
  • 2015-10-17
  • 2014-12-15
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2011-07-11
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多