Как избежать возврата UIGraphicsGetCurrentContext() нуля в Swift?

Я пытаюсь узнать, как получить закругленную подсветку фона с помощью (цвета фона NSAttributedString и закругленных углов )...

Поэтому я следую Руководству Apple по программированию основного текста. и в основном пытаются воссоздать весь код Objective-C в Swift.

Я столкнулся с ошибкой, когда UIGraphicsGetCurrentContext() возвращает nil

Вот мой ViewController, который срабатывает при нажатии кнопки в предыдущем представлении:

import UIKit
import CoreGraphics

public class HighlightPractiveViewController: UIViewController {

  override public func viewDidLoad() {
    drawRect()
  }

  func drawRect() {

    let context: CGContext = UIGraphicsGetCurrentContext()!
    context.translateBy(x: 0, y: view.bounds.size.height)
    context.scaleBy(x: 1.0, y: -1.0)
    context.textMatrix = CGAffineTransform.identity

    let path = CGMutablePath()

    let bounds = CGRect(x: 10.0, y: 10.0, width: 200.0, height: 200.0)
    path.addRect(bounds)


    let textString = NSString(string: "Hello, World!") // CF & NS are toll-free bridged.

    let attrString = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0)

    CFAttributedStringReplaceString(attrString, CFRangeMake(0, 0), textString)

    let rgbColorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
    let components: [CGFloat] = [1.0, 0.0, 0.0, 0.8]
    let red: CGColor = CGColor(colorSpace: rgbColorSpace, components: components)!

    CFAttributedStringSetAttribute(attrString, CFRangeMake(0, 12), kCTForegroundColorAttributeName, red)

    let framesetter = CTFramesetterCreateWithAttributedString(attrString!)
    let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, nil)

    CTFrameDraw(frame, context)
  }
}

Как и где мне правильно вызвать UIGraphicsGetCurrentContext(), чтобы он не возвращал ноль?


person Kevin Wang    schedule 13.09.2018    source источник
comment
В руководстве Apple метод drawRect() является методом UIView, а не UIControllerView. Я предполагаю, что вам нужно создать подкласс UIView и реализовать его метод drawRect, а затем вы можете добавить свое собственное представление в UIViewController в качестве подвида представления UIController.   -  person Alex Nazarov    schedule 13.09.2018


Ответы (1)


Вам не нужно реализовывать метод drawRect() внутри UIViewController. Вы должны сделать это внутри своего пользовательского UIView.

class MyView: UIView {

   override func draw(_ rect: CGRect) {
      super.draw(rect)

      // write what you want to implement here
   }
}

Затем добавьте свой собственный MyView в иерархию представлений UIViewControl.

class HighlightPractiveViewController: UIViewController {

   func viewDidLoad() {
      super.viewDidLoad() // always call super's methods

      let myView = MyView()
      view.addSubview(myView)
   }  
}
person Alex Nazarov    schedule 13.09.2018
comment
Я понимаю! Я добавил override в func draw(_:) в подклассе UIView. А также узнал из документации, что Вы никогда не должны вызывать этот метод [draw(_:)] непосредственно самостоятельно. - person Kevin Wang; 13.09.2018
comment
Да, вам не нужно вызывать этот метод. Библиотека пользовательского интерфейса вызывает его сама перед отображением представления на экране. - person Alex Nazarov; 13.09.2018