Xcode8 - Swift3下自定义UISegmentedControl边框与背景
嘿,我来帮你搞定UISegmentedControl的自定义外观问题!针对你提到的阴影、高度和背景颜色这三个痛点,我整理了具体的实现方案,直接上代码和实用解释:
1. 自定义背景颜色
UISegmentedControl的背景色分为整体背景和选中分段的背景,你可以全局设置(应用所有控件)或者针对单个控件调整:
// 全局设置(适合全APP统一样式) UISegmentedControl.appearance().backgroundColor = UIColor.systemGray6 UISegmentedControl.appearance().selectedSegmentTintColor = UIColor.systemBlue // 单个控件自定义 let segmentedControl = UISegmentedControl(items: ["首页", "我的", "设置"]) segmentedControl.backgroundColor = UIColor.systemGray6 segmentedControl.selectedSegmentTintColor = UIColor.systemBlue // 顺便调整文字颜色,让样式更协调 segmentedControl.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected) segmentedControl.setTitleTextAttributes([.foregroundColor: UIColor.systemBlue], for: .normal)
如果需要渐变背景这类更复杂的样式,你可以自定义子类,通过layer.backgroundColor或者添加渐变层来实现。
2. 设置自定义高度
默认的UISegmentedControl高度比较固定,有两种简单方法调整:
- 方法一:Auto Layout约束(推荐)
直接给控件添加高度约束,灵活度最高:
segmentedControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ segmentedControl.heightAnchor.constraint(equalToConstant: 50), // 这里改成你要的高度 segmentedControl.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), segmentedControl.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), segmentedControl.topAnchor.constraint(equalTo: view.topAnchor, constant: 100) ])
- 方法二:自定义子类重写固有尺寸
如果你的APP里有多个同高度的分段控件,自定义子类更方便:
class CustomHeightSegmentedControl: UISegmentedControl { override var intrinsicContentSize: CGSize { return CGSize(width: super.intrinsicContentSize.width, height: 50) } }
⚠️ 注意:如果用Auto Layout,一定要把translatesAutoresizingMaskIntoConstraints设为false,避免和系统自带的布局约束冲突。
3. 添加阴影效果
给UISegmentedControl加阴影很简单,但要注意一个容易踩的坑:不要开启clipsToBounds,否则阴影会被裁剪掉。代码示例:
segmentedControl.layer.shadowColor = UIColor.black.cgColor segmentedControl.layer.shadowOffset = CGSize(width: 0, height: 2) // 阴影偏移量,向下2pt segmentedControl.layer.shadowOpacity = 0.3 // 阴影透明度,0-1之间 segmentedControl.layer.shadowRadius = 4 // 阴影模糊半径 segmentedControl.clipsToBounds = false // 关键:必须设为false,阴影才会显示
如果需要更精准的阴影(比如只在底部显示),可以自定义阴影路径:
// 让阴影只在控件底部延伸一点,不会左右也有阴影 let shadowPath = UIBezierPath(rect: segmentedControl.bounds.insetBy(dx: 0, dy: -2)) segmentedControl.layer.shadowPath = shadowPath.cgPath
要是你的控件设置了圆角,记得把阴影路径改成带圆角的,这样阴影会跟着圆角的轮廓走。
额外小技巧:如果需要圆角+边框的组合样式,直接调整layer属性即可:
segmentedControl.layer.cornerRadius = 8 segmentedControl.layer.borderWidth = 1 segmentedControl.layer.borderColor = UIColor.systemBlue.cgColor
内容的提问来源于stack exchange,提问作者Diego Charles
相关产品推荐
相关产品推荐

