ios - 视图周围未对齐的边框
问题描述
我正在尝试在视图周围创建边框。为此,我正在创建一个具有视图大小的 UIBezierPath 的图层,并使用描边颜色创建另一个图层。然后我将贝塞尔图层分配给描边颜色图层并将其作为子图层添加到视图中。
有没有人遇到过这个问题?
class ViewController: UIViewController {
@IBOutlet weak var rectangleView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let bezierLayer = CAShapeLayer()
bezierLayer.bounds = rectangleView.frame
bezierLayer.position = rectangleView.center
bezierLayer.path = UIBezierPath(rect: rectangleView.bounds).cgPath
let borderLayer = CAShapeLayer()
borderLayer.bounds = rectangleView.frame
borderLayer.position = rectangleView.center
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.strokeColor = UIColor.black.cgColor
borderLayer.lineWidth = 1
borderLayer.path = bezierLayer.path
rectangleView.layer.addSublayer(borderLayer)
}
}
如果有人想知道约束可能是错误的,这里是故事板配置:
解决方案
我能够解决它,诀窍是viewDidLayoutSubviews
像这样放置边界实现:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
rectangleView.layer.sublayers?.forEach {
guard let layer = $0 as? CAShapeLayer else { return }
layer.removeFromSuperlayer()
}
let bezierLayer = CAShapeLayer()
bezierLayer.frame = rectangleView.bounds
bezierLayer.path = UIBezierPath(rect: rectangleView.bounds).cgPath
let borderLayer = CAShapeLayer()
borderLayer.frame = rectangleView.bounds
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.strokeColor = UIColor.black.cgColor
borderLayer.lineWidth = 1
borderLayer.path = bezierLayer.path
rectangleView.layer.addSublayer(borderLayer)
}
推荐阅读
- python - 处理检测算法的多个请求 - Inception V2
- for-loop - Clang RecursiveASTVisitor 跳过已经遍历过的 AST 节点
- python - 我可以在可编辑的 tkinter 文本小部件中包含不可删除的字符吗?
- webpack - 使用 Webpack 和 NextJS 将节点模块库拆分为单独的文件
- python - 将数据框绑定到for循环中的变量会将其转换为元组?
- javascript - 如何在 Vue.Js 的 v-for 循环中转义“检测到重复键”?
- python - FTPSHook Airflow(数据通道需要 522 SSL/TLS)
- azure-active-directory - 我们可以在注册应用程序时在 Azure AD 的重定向 URL 中添加 Header 信息吗
- widgetkit - 应用小部件扩展是否需要单独的配置文件?
- webpack - 在 npm run build 之后,Vuetify ui 样式几乎所有东西都坏了