覆盖 drawRect 不渲染

Overriding drawRect not rendering

我正在覆盖 drawRect,我看到我的断点被命中。 我期待显示一系列红色方块,但我只看到背景颜色。

class GameViewController: UIViewController {
    var board: Board!

    override func viewDidLoad() {
        super.viewDidLoad()

        let w = UIScreen.main.bounds.width
        board = Board(frame:  CGRect(x: 0, y: view.frame.size.height - w - 45 , width: w, height: w))
        view.addSubview(board)
    }

}




import UIKit

class Board: UIView {
    var rows = [[Tile]]()
    var w: CGFloat!
    var squareSize: CGFloat!
    var tilesize: CGFloat!
    var sepsize: CGFloat!
    var halfsep: CGFloat!

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = .clear
            //UIColor(colorLiteralRed: 76/255, green: 89/255, blue: 89/255, alpha: 1)
        makeRows()

        configDrawing()
        setNeedsDisplay()
    }

    func configDrawing() {
        w = frame.size.width
        squareSize = w / 7
        tilesize = squareSize * 0.96
        sepsize = squareSize * 0.04
        halfsep = squareSize * 0.5
    }

    override func layoutSubviews() {
        super.layoutSubviews()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func makeRows() {
        for i in 0...6 {
            var row = [Tile]()
            for j in 1...7 {
                let tile = Tile(j, i)
                row.append(tile)
            }
            rows.append(row)
        }
    }

    func update(_ newRows: [[Tile]]) {
        rows = newRows
        //subview?
    }

    override func draw(_ rect: CGRect) {
        //render dividers
        let context = UIGraphicsGetCurrentContext();

        for i in 0..<rows.count {
            let row = rows[i]
            for j in 0..<row.count {
                let tile = rows[i][j]
                context?.beginPath()
                let x = CGFloat(j) //CGFloat(tile.x)
                let y = CGFloat(i) //CGFloat(tile.y)

                context?.setStrokeColor(red: 1, green: 0, blue: 0, alpha: 1)

                let ul = CGPoint(x: (x * squareSize) + halfsep, y: (y * squareSize) + halfsep)
                let ur = CGPoint(x: ((x + 1) * squareSize) - halfsep, y: (y * squareSize) + halfsep)
                let br = CGPoint(x: ((x + 1) * squareSize) - halfsep, y: ((y + 1) * squareSize) - halfsep)
                let bl = CGPoint(x: ((x * squareSize) + halfsep), y: ((y + 1) * squareSize) - halfsep)
                let corners = [ul, ur, br, bl]
                context?.addLines(between: corners)
                context?.strokePath()

            }
        }
//        CGPoint corners[4];

        //render tiles
    }
}

方块应该比完整方块略小 space,所以我应该看到一个 96% 大小的红色方块,其中 4% 由背景线作为网格填充。

我什么也没看到,为什么?

你用 halfsep 的所有地方,你都打算使用 sepsize。正如您所写的那样,整个矩形最终大小为零(它从四面八方插入其大小的一半;1-(1/2+1/2)= 0)。

这是您想要的代码:

let ul = CGPoint(x: (x * squareSize) + sepsize, y: (y * squareSize) + sepsize)
let ur = CGPoint(x: ((x + 1) * squareSize) - sepsize, y: (y * squareSize) + sepsize)
let br = CGPoint(x: ((x + 1) * squareSize) - sepsize, y: ((y + 1) * squareSize) - sepsize)
let bl = CGPoint(x: ((x * squareSize) + sepsize), y: ((y + 1) * squareSize) - sepsize)

您还需要关闭方框:

let corners = [ul, ur, br, bl, ul]

注意最后(重复)ul

不过,这可以简化很多。有一种绘制矩形的内置方法,也有一种绘制 "shrink"(插入)矩形的内置方法。您也可以构建整个路径,然后对其进行一次描边,而不是重新开始路径。

override func draw(_ rect: CGRect) {
    //render dividers
    let context = UIGraphicsGetCurrentContext();

    let size = CGSize(width: squareSize, height: squareSize)
    context?.setStrokeColor(red: 1, green: 0, blue: 0, alpha: 1)
    context?.beginPath()
    for i in 0..<rows.count {
        let row = rows[i]
        for j in 0..<row.count {
//          let tile = rows[i][j] 
            let x = CGFloat(j) //CGFloat(tile.x)
            let y = CGFloat(i) //CGFloat(tile.y)

            let rect = CGRect(origin: CGPoint(x: x * squareSize, y: y * squareSize),
                              size: size)
                .insetBy(dx: sepsize, dy: sepsize)
            context?.addRect(rect)
        }
    }
    context?.strokePath()
    //render tiles
}