2016-12-29 7 views
0

Я использую Swift 3/Xcode 8 на macOS.Добавление текста в CGContext с помощью Swift

Я переопределять draw в NSView и, используя текущий контекст, я могу рисовать простые фигуры (см код):

класса образца: NSImageView {

override func draw(_ dirtyRect: NSRect) { 
    super.draw(dirtyRect) 
    let context = NSGraphicsContext.current()?.cgContext; 
    let length = CGPoint(x: 100, y: 100) 
    let p1 = CGPoint(x: 200, y: 200) 
    let shape = "square" 


    context!.beginPath() 
    context!.move(to: p1) 

    if shape == "line" { 
     let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y) 
     context!.addLine(to: pointEnd) 
    } else if shape == "square" { 
     let p2 = CGPoint(x: p1.x + length.x, y: p1.y) 
     let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y) 
     let p4 = CGPoint(x: p1.x, y: p1.y + length.y) 
     context!.addLine(to: p2) 
     context!.addLine(to: p3) 
     context!.addLine(to: p4) 
     context!.addLine(to: p1) 
    } 

    context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0) 
    context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1) 
    context!.setLineWidth(2.0) 
    context!.strokePath() 

    let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0) 
    let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0) 
    let rect = CGRect(x: 200, y: 200, width: 30, height: 130) 
    let paragraphStyle = NSMutableParagraphStyle() 
    paragraphStyle.alignment = .center 
    let attr = [NSParagraphStyleAttributeName: paragraphStyle, NSForegroundColorAttributeName: textColor, NSBackgroundColorAttributeName: textColorB, NSFontAttributeName:NSFont.init(name: "HelveticaNeue-Thin", size: 14)] 

    let q: NSString = "hello, world" 
    let center = CGPoint(x: 0, y: 0) 
    q.draw(at: center, withAttributes: attr)                 
} 

выше корректируется чтобы показать весь метод.

Это работает как ожидалось, за исключением текстовой ничьей. Две ничьи, которые я пробовал, показаны в последних двух строках. Первый из них приведен ниже, и он сбой (см. Сообщение в комментарии для этой строки). Второй близок, но требует NSDrawingContext, а не CGContext.

Я также хотел бы нарисовать текст (скажем, прямо под строкой). Я провел много поисков и ничего не нашел. CGContexts, похоже, имеет методы, связанные с рисованием текста, но ни один из них, по-видимому, его не рисует. Чтобы быть ясным, я не нашел ничего, что бы скомпилировать, а тем более бегать.

Примечание: Я новичок в разработке macOS (хотя некоторые IOS). Поэтому я мог бы пропустить что-то очень очевидное.

Проблема была в назначении цвета в атрибутах. Отредактировано кодом, который теперь работает.

+0

"Я не нашел ничего, что бы компилировать" - пожалуйста ** показать код ** если у вас возникли проблемы с получением что-то для компиляции. Мы не можем помочь вам с кодом, который недоступен. (Более того, «ничто, кажется, на самом деле не рисует», похоже, подразумевает, что вам удалось запустить код, но ничего не увидели на экране.) – jtbandes

+0

Проверьте также эти методы: https://developer.apple.com/library/ content/documentation/Cocoa/Conceptual/AttributedStrings/Tasks/DrawingAttrStrings.html – jtbandes

+0

И действительно ли ваш текущий код чертежа работает без вызова 'stroke' /' fill'? – jtbandes

ответ

1

Простой способ нарисовать текст в текущем графическом контексте с помощью NSString draw(at:withAttributes:).

Пример:

class MyView : NSView { 
    override func draw(_ dirtyRect: NSRect) { 
     let atts = [NSFontAttributeName:NSFont.init(name: "Georgia", size: 30)] 
     ("Hello world" as NSString).draw(
      at: NSMakePoint(100,100), 
      withAttributes: atts) 
    } 
} 

Результат:

enter image description here

+0

Я старался, как я помню, но, честно говоря, не помню, как это не сработало для меня. Возможно, было невозможно заставить его работать с cgContext. Поэтому я попробую еще раз и вернусь к вам. –

+0

OK Я попробовал еще раз. Он терпит неудачу с ошибкой «дает непризнанный селектор, отправленный в экземпляр», который, как я подозреваю, является чем-то, что делает, не ссылаясь на контекст. Спасибо за предложение. –

+0

Я действительно не знаю, что вы имеете в виду под этим. Конечно, это работает. Я отредактировал свой ответ, чтобы показать примерный код и видимый чертеж в запущенном приложении. – matt

 Смежные вопросы

  • Нет связанных вопросов^_^