将角半径应用于CAShapeLayer会导致视觉瑕疵

时间:2017-08-31 21:27:21

标签: ios swift uiview

我创建了一个CAShapeLayer并将其添加为子图层,而不是直接在view.layer上工作以允许虚线或虚线边框(使用lineDashPattern)。问题是在某些边界宽度和一些角半径值 - 随机垂直线开始出现。放大(如果必须)放在右侧的图片上。

注意:这些线在我的物理测试设备上是垂直的,但在模拟器中是水平的。

Click to see screenshot of test project

我已经创建了一个小型测试项目来证明这一点。在故事板中,我设置了红色正方形和滑块,所有边框工作都在此代码片段的底部完成(为了清晰起见,我已将所有内容都包含在类中):

@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!)
}

有人曾经处理过这个问题吗? UIView或CAShapeLayer上有设置可以摆脱它吗?

0 个答案:

没有答案