有没有办法摆脱 UISegmentedControl 的圆角或者它是默认行为?
6 回答
您可以做一些非常简单的事情来摆脱 UISegmentedControl 上的圆形垃圾......将样式更改为“7”。我不是在开玩笑。我刚刚想通了:
// Magic number ... (it's cheating, but it works)
mySegmentedBar.segmentedControlStyle = 7;
这与他们在 UISearchBar 的范围栏中使用的控件样式相同,如下所示:
但是,如果有人只想要范围栏,而不需要搜索,他们通常会遇到这样的 UISegmentedControl 垃圾(带有圆角):
或者更糟糕的是,这...
值得庆幸的是,通过切换到 bar 样式“7”,我们得到了 stop bar 的确切外观,没有所有的子类化和 drawRect 黑客:
不,没有 API 可以让您控制段的布局。
您可能可以尝试查看 UISegmentedControl 的 view.subviews 并尝试根据您的需要更改它们。但从个人经验来看,我不建议这样做。如果 Apple 将来更改订单,您的应用程序可能会崩溃。最简单的做法是创建自定义 UIButtons,其行为类似于切换按钮,并像 UISegmentedControls 一样控制它们(有关切换按钮,请参阅如何使用 UIButton 作为切换开关)。
如果您想要不同的外观,您可以将其子类化并在-drawRect:
. 有关使用 Quartz/Core Graphics 进行绘图的参考,请参阅Quartz 2D 编程指南。
通过添加合理宽度的边框,您可以获得方形外观:
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;
经过大量尝试后,我得到了以下解决方案,该解决方案在没有任何背景图像或子类的情况下工作正常:
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];
如果有人仍然感兴趣,这里是 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)
}
}