【问题标题】:How to create Right Angle View in Swift?如何在 Swift 中创建直角视图?
【发布时间】:2019-04-14 21:50:01
【问题描述】:

我可以使用下面的代码快速创建三角形视图-

class TriangleView: UIView {

    override func draw(_ rect: CGRect) {

        // Get Height and Width
        let layerHeight = layer.frame.height
        let layerWidth = layer.frame.width

        // Create Path
        let bezierPath = UIBezierPath()

        // Draw Points
        bezierPath.move(to: CGPoint(x: 0, y: layerHeight))
        bezierPath.addLine(to: CGPoint(x: layerWidth, y: layerHeight))
        bezierPath.addLine(to: CGPoint(x: layerWidth / 2, y: 0))
        bezierPath.addLine(to: CGPoint(x: 0, y: layerHeight))
        bezierPath.close()

        // Apply Color
        UIColor.red.setFill()
        bezierPath.fill()

        // Mask to Path
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = bezierPath.cgPath
        layer.mask = shapeLayer
    }

}

  override func viewDidLoad() {
        super.viewDidLoad()

        let triangle = TriangleView(frame: CGRect(x: 0, y: 0, width: 55 , height: 60))
        triangle.backgroundColor = .white
        triangle.transform = CGAffineTransform(rotationAngle: .pi * 4.49)
        imageView.addSubview(triangle)

}

现在的问题是我想使用变换属性将其更改为直角三角形。如何做到这一点?

预期结果

当前结果

【问题讨论】:

  • this相关吗?

标签: swift uiview


【解决方案1】:

您当前正在绘制“a”。你想画'b'。

extension UIBezierPath {

    convenience init(rightAngledTriangleInRect: CGRect, offset withOffset: CGFloat) {
        self.init()
        move(to: CGPoint(x: rect.minX, y: rect.minY))
        addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
        addLine(to: CGPoint(x: rect.minX + offset, y: rect.maxY))
        addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
        addLine(to: CGPoint(x: rect.minX, y: rect.minY))
        close()
    }
}

然后使用:

let path = UIBezierPath.init(rightAngledTriangleInRect: rect, withOffset: 20.0)

请注意,对于贝塞尔路径说明,无需在方便的 inits 中添加 self.

如果您要进行大量绘图,我建议您添加一些此类 init 以使生活更轻松。

在您当前的 TriangleView 中使用:

class TriangleView: UIView {

    override func draw(_ rect: CGRect) {

        let path = UIBezierPath.init(rightAngledTriangleInRect: rect, withOffset: 20.0)
        let shape = CAShapeLayer()
        shape.path = path.cgPath

        // Set the mask
        layer.mask = shape
    }
}

【讨论】:

  • 你能用例子描述一下,如何使用这个代码sn-p?
【解决方案2】:

我希望你想要这个部分。

这是代码。

override func draw(_ rect: CGRect) {

    let path = UIBezierPath.init()

    // top left
    path.move(to: .zero)

    // top right
    path.addLine(to: CGPoint(x: bounds.size.width,
                             y: 0))

    // bottom left offset
    path.addLine(to: CGPoint(x: bounds.size.width * 0.1,
                             y: bounds.size.height))

    // bottom left
    path.addLine(to: CGPoint(x: 0,
                             y: bounds.size.height))

    // top left
    path.close()

    // change fill color here.
    UIColor.black.setFill()
    path.fill()
}

结果

我是怎么画的

修改

如果你把代码UIColor.black.setFill()改成

let fillColor = UIColor(red: 0xF9/0xff, green: 0x0D/0xff, blue: 0x5A/0xff, alpha: 1)
    fillColor.setFill()

你得到这个结果。

玩得开心编码。

【讨论】:

    【解决方案3】:

    也有一些简单的方法可以实现这一点,但是对于使用transform,这里是示例代码。使用这个变换而不是你的变换。它是从你的绘图中获得直角三角形的示例代码:

    triangle.transform = CGAffineTransform.identity.rotated(by: CGFloat.pi).translatedBy(x: (triangle.bounds.width / 2), y: 0.0)
    

    你应该注意到CGAffineTransform 从它的原点旋转视图

    【讨论】:

    • 为简单视图工作,但不在表格视图单元格中
    • @iDeveloper tableViewCell.i 测试没有问题。一定要加tableView.addSubView(triangle)
    猜你喜欢
    • 2013-06-13
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多