Как избежать UIGraphicsGetCurrentContext (), возвращая «ноль» в Swift? - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь узнать, как получить округленную подсветку фона с помощью ( 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(), чтобы он не возвращал ноль?

1 Ответ

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

Вам не нужно реализовывать метод 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)
   }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...