UIView上的自定义圆角

时间:2016-03-18 18:56:00

标签: ios

所以我已经坚持了一段时间,在线阅读并尝试了许多不同的解决方案,但无法弄清楚我做错了什么。我想要完成的任务应该非常简单:我有一个UIView,我想绕其左下角和右下角,以便它们被剪裁而不是绘制。

这是我到目前为止(vwView是我在屏幕上自定义视图的出口):

func f(data: NSData) {
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
        guard let parseJSON = json as? NSDictionary else {
            print("JSON wasn't an object")
            return
        }
        guard let userId = parseJSON["userID"] as? String else {
            print("userId absent or not a string")
            return
        }
        print("got userId \(userId)")
    } catch {
        print("Could not parse data as JSON: \(error)")
    }
}

我做错了什么?另外:这只是我的原型,因为我真的想在UITableViewCell上做这个,所以如果我需要采取不同的方法,那也可能会有所帮助。

由于

詹姆斯

1 个答案:

答案 0 :(得分:1)

问题是vwView稍后会调整大小以适应屏幕,但您不会更新其新大小的路径。对此没有特别微不足道的解决方案。你基本上需要让vwView成为一个自定义类(如果它还没有)并更新layoutSubviews中的掩码。例如:

public class RoundedBorderView: UIView {

    public var roundedCorners: UIRectCorner = [ .BottomLeft, .BottomRight ] {
        didSet { self.setNeedsLayout() }
    }

    public var cornerRadii: CGSize = CGSizeMake(10, 10) {
        didSet { self.setNeedsLayout() }
    }

    public override func layoutSubviews() {
        super.layoutSubviews()
        updateMask()
    }

    private func updateMask() {
        let mask = maskShapeLayer()
        mask.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: roundedCorners, cornerRadii: cornerRadii).CGPath
    }

    private func maskShapeLayer() -> CAShapeLayer {
        if let mask = layer.mask as? CAShapeLayer {
            return mask
        }
        let mask = CAShapeLayer()
        layer.mask = mask
        return mask
    }

}

vwView的类更改为RoundedBorderView,它将维护自己的遮罩层。