Рисование точечного фона в Swift - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь получить точечный вид, который я могу использовать в качестве фона.Что-то похожее на это: Image showing dotted background

Но мне кажется, что-то не хватает в моем коде.Я пытался поэкспериментировать с разными размерами точек и всего остального, но пока я просто устанавливаю свой цвет фона на вид, но без точек, независимо от размера, цвета или расстояния.Чего мне не хватает?

class DottedBackgroundView: UIView {

override func draw(_ rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext() else { return }
    UIColor.green.setFill()
    context.fill(rect)

    let drawPattern: CGPatternDrawPatternCallback = { _, context in
        context.addArc(
            center: CGPoint(x: 5, y: 5), radius: 2.5,
            startAngle: 0, endAngle: CGFloat(2.0 * .pi),
            clockwise: false)
        context.setFillColor(UIColor.white.cgColor)
        context.fillPath()
    }

    var callbacks = CGPatternCallbacks(
        version: 0, drawPattern: drawPattern, releaseInfo: nil)

    let pattern = CGPattern(
        info: nil,
        bounds: CGRect(x: 0, y: 0, width: 10, height: 10),
        matrix: .identity,
        xStep: 10,
        yStep: 10,
        tiling: .constantSpacing,
        isColored: true,
        callbacks: &callbacks)

    let patternSpace = CGColorSpace(patternBaseSpace: nil)!
    context.setFillColorSpace(patternSpace)

    var alpha: CGFloat = 1.0
    context.setFillPattern(pattern!, colorComponents: &alpha)
    context.fill(rect)

    context.addArc(
        center: CGPoint(x: 5, y: 5), radius: 5.0,
        startAngle: 0, endAngle: CGFloat(2.0 * .pi),
        clockwise: false)
    }
}

1 Ответ

1 голос
/ 11 марта 2019

У вас есть ошибка.Просто измените вторую строку на UIColor.white.setFill(), а внутри drawPattern измените цвет на черный: context.setFillColor(UIColor.black.cgColor).

Работает.Я установил это представление на раскадровке, но если вы добавляете его из кода, попробуйте следующее:

let dottedView = DottedBackgroundView()
dottedView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(dottedView)

NSLayoutConstraint.activate([
    dottedView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
    dottedView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
    dottedView.topAnchor.constraint(equalTo: self.view.topAnchor),
    dottedView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])

Вам необходимо установить ограничения, потому что ваш пользовательский вид не имеет определенного размера, поэтому он не может правильно изменить размер.

...