有没有办法摆脱UISegmentedControl的圆角或它是默认行为?
答案 0 :(得分:20)
有一些 非常简单 可以让你自己摆脱UISegmentedControl上的圆形垃圾...将样式更改为“7”。我不是在开玩笑。我只想出了这个:
// Magic number ... (it's cheating, but it works)
mySegmentedBar.segmentedControlStyle = 7;
这与他们在UISearchBar的范围栏中使用的控制样式相同,如下所示:
但如果有人只想要范围栏而不进行搜索,那么他们通常会遇到像这样的UISegmentedControl垃圾(带圆角):
或者更糟糕的是,这......
值得庆幸的是,通过切换到bar样式“7”,我们得到了停止栏的精确外观,没有所有子类和drawRect hackery:
答案 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)
}
}