UISegmentedControl没有圆角?

时间:2009-12-02 16:49:40

标签: iphone cocoa-touch uikit uisegmentedcontrol

有没有办法摆脱UISegmentedControl的圆角或它是默认行为?

6 个答案:

答案 0 :(得分:20)

有一些 非常简单 可以让你自己摆脱UISegmentedControl上的圆形垃圾...将样式更改为“7”。我不是在开玩笑。我只想出了这个:

    // Magic number ... (it's cheating, but it works)
  mySegmentedBar.segmentedControlStyle = 7;  

这与他们在UISearchBar的范围栏中使用的控制样式相同,如下所示:

Search Bar With Scope

但如果有人只想要范围栏而不进行搜索,那么他们通常会遇到像这样的UISegmentedControl垃圾(带圆角):

BarStyle

或者更糟糕的是,这......

BezeledStyle

值得庆幸的是,通过切换到bar样式“7”,我们得到了停止栏的精确外观,没有所有子类和drawRect hackery:

enter image description here

答案 1 :(得分:5)

不,没有API可以让您控制细分的布局。

您可以尝试查看UISegmentedControl的view.subviews并尝试根据您的需要更改它们。但从个人经验来看,我不会这么做。如果Apple将来更改订单,您的应用可能会崩溃。最简单的方法是创建自定义UIButtons,其行为与切换按钮一样,并像UISegmentedControls一样控制它们(对于切换按钮,请参阅How to use a UIButton as a toggle switch)。

答案 2 :(得分:1)

如果你想要一个不同的外观,你可以将它子类化并在-drawRect:中自己绘制。有关使用Quartz / Core Graphics绘图的参考,请参阅Quartz 2D Programming Guide

答案 3 :(得分:1)

通过添加宽度合理的边框,您可以获得平方外观:

self.segmentedControl.tintColor = [UIColor brownColor];
self.segmentedControl.layer.cornerRadius = 0.0;
self.segmentedControl.layer.borderColor = [UIColor brownColor].CGColor;
self.segmentedControl.layer.backgroundColor = [UIColor colorWithWhite:1 alpha:0.75].CGColor;
self.segmentedControl.layer.borderWidth = 1.5f;
self.segmentedControl.layer.masksToBounds = YES;

答案 4 :(得分:0)

经过多次尝试后,我得到了解决方案,没有任何背景图像或子类化工作正常:

    mySegmentedControl.tintColor = [UIColor clearColor]; //Clear all border

    //Draw your own border
    mySegmentedControl.layer.borderColor = [UIColor blackColor].CGColor;
    mySegmentedControl.layer.borderWidth = 1.0;

    //Set tint color for selected subview
    UIColor *tintcolor=[UIColor redColor];
    int subViewIndex = 0; //index which is selected
    [[_segmentControl.subviews objectAtIndex:subViewIndex] setTintColor:tintcolor]; 

答案 5 :(得分:0)

如果仍然有人感兴趣,这是Swift 4(iOS 11)中的简单扩展。只需确保在调用此方法之前设置了色彩即可。如果之后更改了颜色,请确保再次调用此方法:

extension UISegmentedControl {

func ignoreCornerRadius() {

    let renderer = UIGraphicsImageRenderer(size: bounds.size)

    let normalImage = renderer.image { (context) in
        tintColor.setStroke()
        context.stroke(bounds)
    }
    let selectedImage = renderer.image { (context) in
        tintColor.setFill()
        context.fill(bounds)
    }

    setBackgroundImage(normalImage, for: .normal, barMetrics: .default)
    setBackgroundImage(selectedImage, for: .selected, barMetrics: .default)

}

}