三angularUIView – Swift

所以我正在制作一个游戏,在这个游戏中,我要扔掉一个用户在屏幕底部被一个尖峰(三angular形)摧毁的物体。

我无法弄清楚如何制作一个三angular形的UIView。 不过,我已经能够使它像这样的矩形工作:

let barrier = UIView(frame: CGRect(x:125, y: 650, width: 130, height:20)) barrier.backgroundColor = UIColor.orangeColor() view.addSubview(barrier) 

而这一直奏效。 但我无法弄清楚如何制作一个三angular形。 我希望它作为一个UIView的原因是因为即时通讯使用冲突和用户移动它。 我尝试过一个PNG三angular形,但它将碰撞检测为图像的边界,而不是三angular形的起点。

我已经尝试过,但它不工作…

  let square = UIView(frame: CGPathMoveToPoint(path, nil, 50, 0), CGPathAddLineToPoint(path, nil, 100, 50), CGPathAddLineToPoint(path, nil, 0, 100)) square.backgroundColor = UIColor.purpleColor() view.addSubview(square) 

任何和所有的帮助将不胜感激,

谢谢,

亚历克斯

更新了Swift 3

 class TriangleView : UIView { override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func draw(_ rect: CGRect) { guard let context = UIGraphicsGetCurrentContext() else { return } context.beginPath() context.move(to: CGPoint(x: rect.minX, y: rect.maxY)) context.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY)) context.addLine(to: CGPoint(x: (rect.maxX / 2.0), y: rect.minY)) context.closePath() context.setFillColor(red: 1.0, green: 0.5, blue: 0.0, alpha: 0.60) context.fillPath() } } 

Swift 2

 import UIKit class TriangleView : UIView { override init(frame: CGRect) { super.init(frame: frame) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func drawRect(rect: CGRect) { var ctx : CGContextRef = UIGraphicsGetCurrentContext() CGContextBeginPath(ctx) CGContextMoveToPoint(ctx, CGRectGetMinX(rect), CGRectGetMaxY(rect)) CGContextAddLineToPoint(ctx, CGRectGetMaxX(rect), CGRectGetMaxY(rect)) CGContextAddLineToPoint(ctx, (CGRectGetMaxX(rect)/2.0), CGRectGetMinY(rect)) CGContextClosePath(ctx) CGContextSetRGBFillColor(ctx, 1.0, 0.5, 0.0, 0.60); CGContextFillPath(ctx); } } 

这将从MinX,MaxY开始;
从开始画一条线到MaxX,MaxY;
从MaxX,MaxY到MaxX / 2,MinY画一条线;
然后closures到开始位置的path。

下一部分设置你想要使用的颜色。 在这个例子中,255,127,0,Alpha 0.6然后用你设置的颜色填充你刚刚绘制的path。

然后在你的视图控制器

Swift 3

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let triangle = TriangleView(frame: CGRect(x: 10, y: 20, width: 25 , height: 30)) triangle.backgroundColor = .white view.addSubview(triangle) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

Swift 2

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let triangle = TriangleView(frame: CGRectMake(10, 20, 25, 30)) triangle.backgroundColor = .whiteColor() view.addSubview(triangle) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

然而,这将导致相同的问题,因为这个视图的框架仍然是一个矩形。 UIKit使用矩形,你将不得不使用另一个框架,如Sprite Kit。

CAShapeLayer它可以改变图层的形状。

  var mask = CAShapeLayer() mask.frame = self.layer.bounds let width = self.layer.frame.size.width let height = self.layer.frame.size.height var path = CGPathCreateMutable() CGPathMoveToPoint(path, nil, 30, 0) CGPathAddLineToPoint(path, nil, width, 0) CGPathAddLineToPoint(path, nil, width, height) CGPathAddLineToPoint(path, nil, 0, height) CGPathAddLineToPoint(path, nil, 30, 0) mask.path = path // CGPathRelease(path); - not needed self.layer.mask = mask var shape = CAShapeLayer() shape.frame = self.bounds shape.path = path shape.lineWidth = 3.0 shape.strokeColor = UIColor.whiteColor().CGColor shape.fillColor = UIColor.clearColor().CGColor self.layer.insertSublayer(shape, atIndex: 0) 

我尝试过一个PNG三angular形,但它将碰撞检测为图像的边界,而不是三angular形的起点。

如果你打算使用头脑简单的碰撞(例如内置的UIKitdynamic – 它只是矩形的视图碰撞),你无能为力。 如果你想要高级的形状碰撞,你必须自己实现它们,否则你必须使用Sprites。

并让用户移动它

这更容易处理:只需重写此视图的hitTest ,并返回nil如果用户触摸的位置在三angular形图像的边界之外。

我已经修改了以前的代码来添加边距和填充颜色作为可检查的,它适用于Swift4:

 import UIKit @IBDesignable class TriangleView : UIView { var _color: UIColor! = UIColor.blue var _margin: CGFloat! = 0 @IBInspectable var margin: Double { get { return Double(_margin)} set { _margin = CGFloat(newValue)} } @IBInspectable var fillColor: UIColor? { get { return _color } set{ _color = newValue } } override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func draw(_ rect: CGRect) { guard let context = UIGraphicsGetCurrentContext() else { return } context.beginPath() context.move(to: CGPoint(x: rect.minX + _margin, y: rect.maxY - _margin)) context.addLine(to: CGPoint(x: rect.maxX - _margin, y: rect.maxY - _margin)) context.addLine(to: CGPoint(x: (rect.maxX / 2.0), y: rect.minY + _margin)) context.closePath() context.setFillColor(_color.cgColor) context.fillPath() } }