所以我正在制作一个游戏,其中我正在丢弃的对象必须被用户在屏幕底部的尖峰(三角形)破坏。
我无法弄清楚如何制作一个三角形的UIView。但是我已经能够使它像这样的矩形工作:
let barrier = UIView(frame: CGRect(x:125, y: 650, width: 130, height:20))
barrier.backgroundColor = UIColor.orangeColor()
view.addSubview(barrier)
这已经奏效了。但我无法弄清楚如何制作一个三角形。我希望它作为UIView的原因是因为我在它上面使用碰撞并且让用户移动它。我尝试了一个PNG三角形,但它检测到碰撞是图像的边界而不是三角形的起点。
我试过这个,但它没有用......
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)
任何和所有帮助将不胜感激,
谢谢,
亚历
答案 0 :(得分:76)
更新了 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画一条线;
然后关闭到起始位置的路径。
下一部分设置您要使用的颜色。在这个例子255,127,0,Alpha 0.6 然后将使用设置颜色填充您刚刚绘制的路径。
然后在View Controller中
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。
答案 1 :(得分:6)
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)
答案 2 :(得分:6)
我已经修改了前面的代码,添加了边距和填充颜色作为可检查,并且它适用于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()
}
}
答案 3 :(得分:1)
我尝试了一个PNG三角形,但它将碰撞检测为图像边框而不是三角形的起点。
如果你打算使用简单的碰撞(例如内置的UIKit Dynamics - 它仅 矩形视图碰撞),你无能为力。如果您想要高级形状碰撞,您必须自己实现它们,或者必须使用Sprites。
并且让用户移动它
处理起来要容易得多:只需覆盖此视图的hitTest
,如果用户触摸的位置超出三角形图像的边框,则返回nil
。
答案 4 :(得分:0)
迅速5:
此代码为我提供了不同方面的帮助。 UIView
和CGMutablePath()
的{{1}}
*假设视图的高度和宽度相同。
*将视图的背景颜色设置为clearColor。
A)右侧
CAShapeLayer()
B)左侧
@IBOutlet weak var triangleView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
self.setRightTriangle()
}
func setRightTriangle(){
let heightWidth = triangleView.frame.size.width //you can use triangleView.frame.size.height
let path = CGMutablePath()
path.move(to: CGPoint(x: heightWidth/2, y: 0))
path.addLine(to: CGPoint(x:heightWidth, y: heightWidth/2))
path.addLine(to: CGPoint(x:heightWidth/2, y:heightWidth))
path.addLine(to: CGPoint(x:heightWidth/2, y:0))
let shape = CAShapeLayer()
shape.path = path
shape.fillColor = UIColor.blue.cgColor
triangleView.layer.insertSublayer(shape, at: 0)
}
C)朝上
func setLeftTriangle(){
let heightWidth = triangleView.frame.size.width
let path = CGMutablePath()
path.move(to: CGPoint(x: heightWidth/2, y: 0))
path.addLine(to: CGPoint(x:0, y: heightWidth/2))
path.addLine(to: CGPoint(x:heightWidth/2, y:heightWidth))
path.addLine(to: CGPoint(x:heightWidth/2, y:0))
let shape = CAShapeLayer()
shape.path = path
shape.fillColor = UIColor.blue.cgColor
triangleView.layer.insertSublayer(shape, at: 0)
}
D)下方
func setUpTriangle(){
let heightWidth = triangleView.frame.size.width
let path = CGMutablePath()
path.move(to: CGPoint(x: 0, y: heightWidth))
path.addLine(to: CGPoint(x:heightWidth/2, y: heightWidth/2))
path.addLine(to: CGPoint(x:heightWidth, y:heightWidth))
path.addLine(to: CGPoint(x:0, y:heightWidth))
let shape = CAShapeLayer()
shape.path = path
shape.fillColor = UIColor.blue.cgColor
triangleView.layer.insertSublayer(shape, at: 0)
}
*根据需要更改X的任何Y值。