UIBezierPath 子层不会环绕整个 UIView
BezierPath sublayer does not wrap around the whole UIView
我目前正在尝试在我的 UIView 周围制作一个虚线边框。我参考了之前的post:Dashed line border around UIView
UIView 的左侧有红色虚线,但右侧没有边缘。
这是左边
这是右边
这是我在 viewDidLoad 中执行的代码:
myview.backgroundColor = UIColor.lightGray
myview.layer.cornerRadius = 4
let dottedBorder = CAShapeLayer()
dottedBorder.strokeColor = UIColor.red.cgColor
dottedBorder.lineDashPattern = [4, 4]
dottedBorder.frame = myview.bounds
dottedBorder.fillColor = nil
dottedBorder.path = UIBezierPath(roundedRect: myview.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 4, height: 4)).cgPath
myview.layer.addSublayer(dottedBorder)
假设您使用的是自动版式,您不应该依赖 viewDidLoad
中的视图大小,因为通常它等于您的故事板设备大小(选择的是 SB 编辑器),而不是真实设备。
反正以后可能会变。所有依赖于 frame
/bounds
的计算都需要在 viewDidLayoutSubviews
内完成。像这样:
private let dottedBorder = CAShapeLayer()
override func viewDidLoad() {
super.viewDidLoad()
dottedBorder.strokeColor = UIColor.red.cgColor
dottedBorder.lineDashPattern = [4, 4]
dottedBorder.fillColor = nil
myview.layer.addSublayer(dottedBorder)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
dottedBorder.frame = myview.bounds
dottedBorder.path = UIBezierPath(roundedRect: myview.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 4, height: 4)).cgPath
}
我目前正在尝试在我的 UIView 周围制作一个虚线边框。我参考了之前的post:Dashed line border around UIView
UIView 的左侧有红色虚线,但右侧没有边缘。
这是我在 viewDidLoad 中执行的代码:
myview.backgroundColor = UIColor.lightGray
myview.layer.cornerRadius = 4
let dottedBorder = CAShapeLayer()
dottedBorder.strokeColor = UIColor.red.cgColor
dottedBorder.lineDashPattern = [4, 4]
dottedBorder.frame = myview.bounds
dottedBorder.fillColor = nil
dottedBorder.path = UIBezierPath(roundedRect: myview.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 4, height: 4)).cgPath
myview.layer.addSublayer(dottedBorder)
假设您使用的是自动版式,您不应该依赖 viewDidLoad
中的视图大小,因为通常它等于您的故事板设备大小(选择的是 SB 编辑器),而不是真实设备。
反正以后可能会变。所有依赖于 frame
/bounds
的计算都需要在 viewDidLayoutSubviews
内完成。像这样:
private let dottedBorder = CAShapeLayer()
override func viewDidLoad() {
super.viewDidLoad()
dottedBorder.strokeColor = UIColor.red.cgColor
dottedBorder.lineDashPattern = [4, 4]
dottedBorder.fillColor = nil
myview.layer.addSublayer(dottedBorder)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
dottedBorder.frame = myview.bounds
dottedBorder.path = UIBezierPath(roundedRect: myview.bounds, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: 4, height: 4)).cgPath
}