iOS - 自定义UIView未显示在设备上

时间:2016-03-31 08:47:12

标签: ios swift uiview uibezierpath cashapelayer

我有一个自定义UIView子类,我想在我的UIViewController上添加为子视图。问题是,当我运行应用程序时,即使所有内容都设置正确(在viewDidLoad视图中有一个正确的框架且不是hidden),该视图也不会显示,并显示在Interface Builder中(picture)。在设备上我只得到一个红色的屏幕,中间没有三角形。

这是视图子类:

@IBDesignable
class TriangleView: UIView {

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)

        let path = UIBezierPath()
        let width = rect.size.width
        let height = rect.size.height
        let startingPoint = CGPoint(x: center.x, y: center.y - height / 2)

        path.moveToPoint(startingPoint)
        path.addLineToPoint(CGPoint(x: center.x + width / 2, y: center.y - height / 2))
        path.addLineToPoint(CGPoint(x: center.x, y: center.y + height / 2))
        path.addLineToPoint(CGPoint(x: center.x - width / 2, y: center.y - height / 2))
        path.closePath()

        let shapeLayer = CAShapeLayer()
        shapeLayer.frame = rect
        shapeLayer.position = center
        shapeLayer.path = path.CGPath
        shapeLayer.fillColor = UIColor.whiteColor().CGColor

        layer.mask = shapeLayer

        layer.backgroundColor = UIColor.redColor().CGColor
    }
} 

我没有要显示的任何其他代码,我只是将视图添加到ViewController并将其约束和类设置为TriangleView

2 个答案:

答案 0 :(得分:4)

Swift 3

我致力于简化你拥有的东西。我知道这已经过时了,但这里有一些我觉得可以实现你想要做的事情:

@IBDesignable
class TriangleView: UIView {

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        let width = rect.size.width
        let height = rect.size.height

        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: 0))
        path.addLine(to: CGPoint(x: width, y: 0))
        path.addLine(to: CGPoint(x: width/2, y: height))
        path.close()
        path.stroke()

        let shapeLayer = CAShapeLayer()
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.path = path.cgPath

        layer.addSublayer(shapeLayer)
        layer.backgroundColor = UIColor.red.cgColor
    }
}

一些差异:

  • 我只用3个点代替4个三角形然后关闭它。

  • 前两个点位于UIView的角落。

  • 我添加了layer.addSublayer(shapeLayer)。我相信这就是为什么它在运行应用程序时没有出现的原因。

  • 删除了一些我认为不需要的代码,但如果您愿意,可以将其添加回来。

Simulator

答案 1 :(得分:0)

你试过吗,

[self.view bringSubviewToFront:TriangleView]

将TriangleView添加为视图控制器的子视图后放置。