UIBezierPath 无法正确呈现
UIBezierPath not rendering properly
我有一个 tablviewcell,里面有 uiview。
根据一些逻辑,我更改了背景颜色并使左右角变圆。
我通过 cellForRowat indexPath 函数使这些视图转角。
这是我的分机。
extension UIView {
func roundCorners(corners: UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
以及我如何使用它
cell?.myCustomView.roundCorners(corners: [.bottomRight,.bottomLeft], radius: 10.0)
iphone宽度为375时正常,
但它无法更新宽度大于 375 的设备。
并且在滚动 tableview 之后,它再次正确地拉伸回所需的宽度。
如何解决这个问题?
您想在视图改变大小时更新路径。在 cellForRowAt
中,单元格尚未通过自动布局完全布局。
所以...
为您的 "rounded corners" 视图创建一个 UIView
子class(简单示例):
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
现在,只要视图改变大小 - 例如首次使用或设备旋转时 - 视图将自动更新路径。
下面是如何在 table 单元格中使用它。在 Storyboard 中,将 "background view" 的 class 设置为 RoundedCornersView
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
class MyTestCell: UITableViewCell {
@IBOutlet var myCustomView: RoundedCornersView!
}
然后,在cellForRowAt
:
let cell = tableView.dequeueReusableCell(withIdentifier: "MyTestCell", for: indexPath) as! MyTestCell
if shouldBeRounded {
cell.myCustomView.corners = [.bottomRight, .bottomLeft]
cell.myCustomView.radius = 10.0
cell.myCustomView.backgroundColor = .green
} else {
cell.myCustomView.corners = []
cell.myCustomView.radius = 0.0
cell.myCustomView.backgroundColor = .white
}
return cell
使用这个:
override func draw(_ rect: CGRect) {
super.draw(rect)
selectedView.roundCorners(corners: [.topLeft, .topRight], radius: 12.0)
}
我有一个 tablviewcell,里面有 uiview。 根据一些逻辑,我更改了背景颜色并使左右角变圆。
我通过 cellForRowat indexPath 函数使这些视图转角。
这是我的分机。
extension UIView {
func roundCorners(corners: UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
以及我如何使用它
cell?.myCustomView.roundCorners(corners: [.bottomRight,.bottomLeft], radius: 10.0)
iphone宽度为375时正常, 但它无法更新宽度大于 375 的设备。
并且在滚动 tableview 之后,它再次正确地拉伸回所需的宽度。
如何解决这个问题?
您想在视图改变大小时更新路径。在 cellForRowAt
中,单元格尚未通过自动布局完全布局。
所以...
为您的 "rounded corners" 视图创建一个 UIView
子class(简单示例):
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
现在,只要视图改变大小 - 例如首次使用或设备旋转时 - 视图将自动更新路径。
下面是如何在 table 单元格中使用它。在 Storyboard 中,将 "background view" 的 class 设置为 RoundedCornersView
class RoundedCornersView: UIView {
var corners: UIRectCorner = UIRectCorner()
var radius: CGFloat = 0.0
override func layoutSubviews() {
super.layoutSubviews()
let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
layer.mask = mask
}
}
class MyTestCell: UITableViewCell {
@IBOutlet var myCustomView: RoundedCornersView!
}
然后,在cellForRowAt
:
let cell = tableView.dequeueReusableCell(withIdentifier: "MyTestCell", for: indexPath) as! MyTestCell
if shouldBeRounded {
cell.myCustomView.corners = [.bottomRight, .bottomLeft]
cell.myCustomView.radius = 10.0
cell.myCustomView.backgroundColor = .green
} else {
cell.myCustomView.corners = []
cell.myCustomView.radius = 0.0
cell.myCustomView.backgroundColor = .white
}
return cell
使用这个:
override func draw(_ rect: CGRect) {
super.draw(rect)
selectedView.roundCorners(corners: [.topLeft, .topRight], radius: 12.0)
}