Triangle UIView – Swift

Así que estoy haciendo un juego en el que estoy cayendo objects que deben ser destruidos por un usuario (triángulo) en la parte inferior de la pantalla.

No puedo determinar cómo hacer una UIView que sea un triángulo. Sin embargo, he podido hacer que funcione como un rectángulo como este:

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

Y esto ha funcionado. Pero no puedo pensar cómo hacer un triángulo. La razón por la que lo quiero como UIView es porque estoy usando colisiones en él y para que el usuario lo mueva. He intentado un triángulo PNG, pero detecta la colisión como el borde de la image no el comienzo del triángulo.

He intentado esto pero no funciona …

  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) 

Toda la ayuda será apreciada,

Gracias,

Alex

Actualizado para Swift 3 :

 class TriangleView : UIView { override init(frame: CGRect) { super.init(frame: frame) } requinetworking 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(networking: 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) } requinetworking 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); } } 

Esto comenzará desde MinX, MaxY;
Dibuje una línea desde el principio hasta MaxX, MaxY;
Dibuja una línea de MaxX, MaxY a MaxX / 2, MinY;
Luego cierra la ruta a la location de inicio.

La siguiente parte establece el color que desea usar. En este ejemplo, 255,127,0, Alpha 0.6. Luego completará la ruta que acaba de dibujar arriba con el color establecido.

Luego en su controller de vista

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. } } 

Sin embargo, esto causará el mismo problema ya que el marco de esta vista seguirá siendo un rectángulo. UIKit funciona con rectangularjs, tendría que usar otro marco, como Sprite Kit.

CAShapeLayer puede cambiar la forma de las capas.

  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) 

He intentado un triángulo PNG, pero detecta la colisión como el borde de la image no el comienzo del triángulo.

No hay nada que puedas hacer al respecto si vas a utilizar colisiones de mentalidad simple (por ejemplo, el UIKit Dynamics incorporado, solo hace colisiones visuales rectangulares). Si desea colisiones avanzadas de forma, debe implementarlas usted mismo o debe usar Sprites.

y para que el usuario lo mueva

Esto es mucho más fácil de tratar: simplemente anule el hitTest para esta vista y devuelva nil si el lugar al que toca el usuario está fuera de los bordes de la image del triángulo.