我有一个自定义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
。
答案 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)
。我相信这就是为什么它在运行应用程序时没有出现的原因。
删除了一些我认为不需要的代码,但如果您愿意,可以将其添加回来。
答案 1 :(得分:0)
你试过吗,
[self.view bringSubviewToFront:TriangleView]
将TriangleView添加为视图控制器的子视图后放置。