所以我在做一个游戏,在这个游戏中,我扔下的东西必须被用户在屏幕底部的钉子(三角形)摧毁.

我搞不懂怎么画一个三角形的视图.然而,我已经能够让它像这样工作:

 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)

我们将感谢所有的帮助,

谢谢

亚历克斯

推荐答案

Updated for 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开始

下一部分设置要使用的 colored颜色 .在本例中,255127,0,α0.6

然后在视图控制器中

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.

Swift相关问答推荐

UITableView未显示类数组数据

OBJC代码中Swift 演员的伊瓦尔:原子还是非原子?

格式化单位和度量值.为什么从符号初始化的单位不能产生与静态初始化相同的结果

如何把多个可观测性变成一个完备性?

可选,类似于自定义类型的初始化

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

Result类型的初始值设定项失败?

如何通过 Enum 属性使用新的 #Predicate 宏获取

SwiftUI 中的同一个 ForEach 中是否可以有 2 个数组?

SwiftUI 交易:根据外部状态制作一个动画或静止的按钮

Swift Property Wrappers-Initialization 失败并显示无法将‘Double’类型的值转换为预期的参数类型

如何在 SceneKit 上制作毛玻璃效果

在 macOS (Swift) 上获取 BSD 驱动器名称的最佳方法是什么?

如何在 Swift 中对单个单词进行词形还原

将数据附加到 Firebase 实时数据库后,NavigationLink 将我重定向到上一个视图

Swift 读写图片占用大量内存

Swift 2.0 方法不能标记为@objc,因为参数的类型不能在 Objective-C 中表示

swift中的SequenceType和CollectionType有什么区别?

Swift 2.0 按属性对对象数组进行排序

Swift - 要求实现协议的类是某个类的子类