CGPatternCallback вылетает в iOS 12 - PullRequest
       19

CGPatternCallback вылетает в iOS 12

0 голосов
/ 13 сентября 2018

Следующий класс реализует представление с полосатым фоновым рисунком.Он отлично работает в iOS 11, но вылетает с EXC_BAD_ACCESS в iOS 12 при вызове load(as:) в методе обратного вызова.

Приветствуются любые указания на то, что я делаю неправильно.

import UIKit

class LinedView: UIView {
  var colors: [UIColor] = [] {
    didSet {
      setNeedsDisplay()
    }
  }

  override func draw(_ rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext() else { return }

    var patternCallback = CGPatternCallbacks(
      version: 0,
      drawPattern: {pointer, context in
        guard let colors = pointer?.load(as: [UIColor].self) else { return }
        for (index, color) in colors.enumerated() {
          context.setFillColor(color.cgColor)
          context.fill(CGRect(x: CGFloat(index) * 2 + CGFloat(index - 1) + 1, y: 0, width: 2, height: 1))
        }

    },
      releaseInfo: nil
    )

    let width = CGFloat(colors.count * 3)
    withUnsafeMutablePointer(to: &colors) {
      guard let pattern = CGPattern(
        info: $0,
        bounds: .init(x: 0, y: 0, width: width, height: 1),
        matrix: .identity,
        xStep: width + 1,
        yStep: 1,
        tiling: .constantSpacingMinimalDistortion,
        isColored: true,
        callbacks: &patternCallback
        ) else { return }

      if let patternSpace = CGColorSpace(patternBaseSpace: nil) {
        context.setFillColorSpace(patternSpace)
        var alpha: CGFloat = 1
        context.setFillPattern(pattern, colorComponents: &alpha)
        context.fill(rect)
      }
    }
  }
}
...