能否改变UISegmentedControl的圆角半径?我已经尝试了下面的方法,这是我们用来改变UIView圆角半径的方法。
self.segmentedControl.layer.cornerRadius = 15.0;
self.segmentedControl.layer.masksToBounds = YES;
如您所见,这种方法无法正常工作,它只能裁剪UISegmentedControl的角落:
能否改变UISegmentedControl的圆角半径?我已经尝试了下面的方法,这是我们用来改变UIView圆角半径的方法。
self.segmentedControl.layer.cornerRadius = 15.0;
self.segmentedControl.layer.masksToBounds = YES;
如您所见,这种方法无法正常工作,它只能裁剪UISegmentedControl的角落:
这应该有效:
self.segmentedControl.layer.cornerRadius = 15.0;
self.segmentedControl.layer.borderColor = [UIColor whiteColor].CGColor;
self.segmentedControl.layer.borderWidth = 1.0f;
self.segmentedControl.layer.masksToBounds = YES;
在设置cornerRadius之后,您需要指定边框。
我决定再试一次,终于完美解决了!!只有一行代码就解决了所有问题!请查看代码:
代码:
class CustomSegmentedControl: UISegmentedControl{
private let segmentInset: CGFloat = 5 //your inset amount
private let segmentImage: UIImage? = UIImage(color: UIColor.red) //your color
override func layoutSubviews(){
super.layoutSubviews()
//background
layer.cornerRadius = bounds.height/2
//foreground
let foregroundIndex = numberOfSegments
if subviews.indices.contains(foregroundIndex), let foregroundImageView = subviews[foregroundIndex] as? UIImageView
{
foregroundImageView.bounds = foregroundImageView.bounds.insetBy(dx: segmentInset, dy: segmentInset)
foregroundImageView.image = segmentImage //substitute with our own colored image
foregroundImageView.layer.removeAnimation(forKey: "SelectionBounds") //this removes the weird scaling animation!
foregroundImageView.layer.masksToBounds = true
foregroundImageView.layer.cornerRadius = foregroundImageView.bounds.height/2
}
}
}
extension UIImage{
//creates a UIImage given a UIColor
public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else { return nil }
self.init(cgImage: cgImage)
}
}
这个想法是使用UIImageView和自己的正方形图像和色调来选择移动的片段,我们想要做的是覆盖它的图像,以便我们可以控制颜色、角半径等。之后,我们想要删除一个苹果默认的三个动画之一(有问题的那一个会在触摸时使段落放大——我使用foregroundImageView.layer.animationKeys()
找出哪些动画影响了移动的片段)。
foregroundImageView.backgroundColor = UIColor.darkGray
这一行。 - Merricat将UISegmentedControl嵌入UIView中,并为UIView设置圆角半径。
Objective-C
outerView.layer.cornerRadius = CGRectGetHeight(outerView.bounds) / 2;
outerView.layer.borderColor = [UIColor blueColor].CGColor;
outerView.layer.borderWidth = 1;
快捷(Swift)
outerView.layer.cornerRadius = CGRectGetHeight(outerView.bounds) / 2
outerView.layer.borderColor = UIColor.blueColor().CGColor
outerView.layer.borderWidth = 1
分段控件不会改变其绘制角落的方式,因此它会继续用自己的方式绘制角落,而你只是将其裁剪掉了。你不能控制分段控件如何绘制其边界形状。如果你真的不喜欢它的绘图方式,你必须从头开始设计自己的替代控件。你能够合法地做到的最接近你所尝试做的事情就是设置分段控件的背景图像。
您可以通过增加其cornerRadius图层或从iOS 13及以上版本设置其maskedCorner属性来更改UISegmentedControl的边角半径。
此示例移除了默认的cornerRadius并将backgroundImage变直:
if #available(iOS 13.0, *) {
segmentedControl.layer.maskedCorners = .init()
} else {
segmentedControl.layer.cornerRadius = 0
}
Source: https://developer.apple.com/documentation/quartzcore/calayer/2877488-maskedcorners
let movingSegment = subviews[numberOfSegments] as? UIimageView
(基本上是段的背景,然后是移动的,然后是前景(即每个段的标题),所以“移动”视图总是在中间)。然后我将Image和highlightedImage设置为空UIImage(),将imageView的边界插入5,并将backgroundColor设置为所需的颜色。 - MerricatlayoutSubviews()
中进行这些更改。请查看下面的答案以查看我的当前结果。 - Merricat已更新以符合Swift 3和Xcode 8.2的兼容性
mySegmentedControl.layer.cornerRadius = 25.0
mySegmentedControl.layer.borderColor = UIColor.white.cgColor
mySegmentedControl.layer.borderWidth = 1.0
mySegmentedControl.layer.masksToBounds = true
layoutSubviews
中设置borderRadius:override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = 2
}
UISegmentedControl
嵌入父视图中,然后将前导、尾随、底部、顶部的约束设置为 -1,以截断 UISegmentedControl
的边框。
最后,应该按照以下方式配置父视图:segmentedControl.superview.clipsToBounds = true
segmentedControl.superview.layer.cornerRadius = 0 //whatever
segmentedControl.superview.layer.borderWidth = 1
segmentedControl.superview.layer.borderColor = segmentedControl.tintColor.CGColor
以下是针对 Yakiv的帖子 的代码转换和工作版本,适用于Swift 4.1和Xcode 9.3。
segmentedOuterView.layer.cornerRadius = segmentedOuterView.bounds.height / 2
segmentedOuterView.layer.borderColor = UIColor.red.cgColor
segmentedOuterView.layer.borderWidth = 1
segmentedOuterView.layer.masksToBounds = true
self.segmentedControl.layer.borderColor = [UIColor whiteColor].CGColor;
self.segmentedControl.layer.borderWidth = 1.0;