Ios 将角半径应用于CAShapeLayer会导致视觉瑕疵
我创建了一个CAShapeLayer并将其添加为子层,而不是直接在view.layer上工作,以允许使用虚线或虚线边框(使用lineDashPattern)。问题是,在某些边界宽度和角半径值处,随机垂直线开始出现。放大(如果必须)右侧的图片 注:这些线在我的物理测试设备上是垂直的,但在模拟器上是水平的 我创建了一个小测试项目来演示这一点。在storyboard中,我设置了红方块和滑块,所有的边框工作都在这个代码片段的底部完成(为了清晰起见,我在类中包含了所有内容):Ios 将角半径应用于CAShapeLayer会导致视觉瑕疵,ios,swift,uiview,Ios,Swift,Uiview,我创建了一个CAShapeLayer并将其添加为子层,而不是直接在view.layer上工作,以允许使用虚线或虚线边框(使用lineDashPattern)。问题是,在某些边界宽度和角半径值处,随机垂直线开始出现。放大(如果必须)右侧的图片 注:这些线在我的物理测试设备上是垂直的,但在模拟器上是水平的 我创建了一个小测试项目来演示这一点。在storyboard中,我设置了红方块和滑块,所有的边框工作都在这个代码片段的底部完成(为了清晰起见,我在类中包含了所有内容): 有人处理过这个问题吗?UI
有人处理过这个问题吗?UIView或CAShapeLayer上是否有我可以设置以消除它的设置?尝试以下答案:,如果没有帮助,请尝试更改“干净”分数中的角半径,如0.05、0.1或1,然后查看是否出现瑕疵。在链接中找到的答案均无效。我已尝试应用“testView.layer.masksToBounds=true”、“testView.clipsToBounds=true”和“testView.layoutIfNeeded()”。我还尝试过将cornerRadius值四舍五入到最接近的整数(与最接近的第一个小数点类似),但这并没有什么区别。垂直线瑕疵继续出现。请尝试以下答案:,如果没有帮助,请尝试更改“干净”分数中的角半径,如0.05、0.1或1,然后查看瑕疵是否出现。在链接中找到的答案均无效。我已尝试应用“testView.layer.masksToBounds=true”、“testView.clipsToBounds=true”和“testView.layoutIfNeeded()”。我还尝试过将cornerRadius值四舍五入到最接近的整数(与最接近的第一个小数点类似),但这并没有什么区别。垂直线瑕疵继续出现。
@IBOutlet weak var testView: UIView!
@IBOutlet weak var slider: UISlider!
var border : CAShapeLayer?
override func viewDidLoad() {
super.viewDidLoad()
updateViewCornerRadius(newCornerRadius: 0.0)
slider.addTarget(self, action: #selector(ViewController.onSliderChange), for: UIControlEvents.valueChanged)
}
func onSliderChange() {
updateViewCornerRadius(newCornerRadius: slider.value)
}
func updateViewCornerRadius(newCornerRadius : Float) {
if border != nil {
border?.removeFromSuperlayer()
}
let cornerRadius = CGFloat(newCornerRadius)
testView.layer.cornerRadius = cornerRadius
border = CAShapeLayer()
border!.masksToBounds = true
border!.cornerRadius = cornerRadius
border!.strokeColor = UIColor.black.cgColor
border!.lineDashPattern = [1, 0]
border!.frame = testView.bounds
border!.fillColor = UIColor.clear.cgColor
border!.path = UIBezierPath(roundedRect: testView.bounds, byRoundingCorners: UIRectCorner.allCorners, cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)).cgPath
border!.lineWidth = 12
testView.layer.addSublayer(border!)
}