如何创建带有圆角与边框的UIButton?尝试多方法无效求解决方案
按照以下步骤配置,可规避网上常见方案的失效问题,直接实现目标效果:
基础实现代码(适配iOS12及以上)
直接在按钮初始化阶段完成核心配置,不要在布局未完成时提前写死固定圆角值:
// 初始化按钮 let customButton = UIButton(type: .custom) customButton.backgroundColor = .systemBlue // 核心圆角+边框配置 // 圆角值根据需要的弧形大小调整,全圆角则设置为按钮最终高度的1/2 customButton.layer.cornerRadius = 12 // 边框宽度,单位为point customButton.layer.borderWidth = 1.5 // 边框颜色,必须传CGColor类型 customButton.layer.borderColor = UIColor.white.cgColor // *必加配置,漏写会导致圆角、边框完全不生效* customButton.layer.masksToBounds = true
配置完全不生效的高频原因
- 提前在
viewDidLoad中写死固定圆角值:此时AutoLayout还未完成布局,按钮的bounds尺寸为0,设置的cornerRadius没有生效空间。这种场景下可以将圆角配置移到viewDidLayoutSubviews方法中,或者在自定义UIButton子类中重写layoutSubviews方法,在布局完成后动态计算圆角值 - 用
setBackgroundImage(_:for:)设置了拉伸的系统默认图片:图片的绘制层级会覆盖layer层的圆角裁剪效果,这种情况优先用backgroundColor替代背景图设置按钮底色;如果必须用背景图,需要将图片的resizingMode设置为中心拉伸,避免满铺整个绘制区域 - iOS15及以上使用了
UIButton.Configuration配置按钮:这种配置模式下会自动覆盖layer层的默认圆角、边框设置,直接改layer参数会被系统自动重置
iOS15及以上Configuration模式适配写法
如果用新的Configuration API,不要直接修改layer属性,在配置对象层完成圆角和边框设置即可:
var buttonConfig = UIButton.Configuration.filled() buttonConfig.title = "提交" buttonConfig.baseBackgroundColor = .systemBlue buttonConfig.baseForegroundColor = .white // 固定圆角模式 buttonConfig.cornerStyle = .fixed buttonConfig.cornerRadius = 12 // 边框设置 buttonConfig.background.strokeWidth = 1.5 buttonConfig.background.strokeColor = .white let configButton = UIButton(configuration: buttonConfig)
非规整弧形边缘的实现
如果需要实现不是正圆角的异形弧形(比如单侧大弧度、斜切圆角),不要依赖系统的cornerRadius参数,通过自定义贝塞尔曲线绘制路径完成裁剪和边框绘制:
- 自定义UIButton子类,重写
layoutSubviews方法 - 用
UIBezierPath绘制目标异形路径 - 给按钮的主layer添加mask shapeLayer实现异形裁剪
- 单独添加一个shapeLayer绘制路径作为边框,避免边框被裁剪掉
内容的提问来源于stack exchange,提问作者Beth.larson1977
相关产品推荐
相关产品推荐

