Отключить смешивание при рисовании с помощью CoreText

Я рисую черный текст на сером фоне с помощью CoreText. Кажется, что система автоматически выполняет смешивание глифов, я бы хотел отключить это поведение, если это возможно, но я не уверен, как это сделать.

это увеличенный скриншот верхней части буквы L. это смешивание, которое я хотел бы отключить

введите здесь описание изображения

Код отрисовки выглядит так:

let para = NSMutableParagraphStyle()
    para.alignment = .center

    let attrString = NSAttributedString(string: Configuration.trainString,
                                        attributes:  [
                                            .font:UIFont.boldSystemFont(ofSize: size.height*0.8),
                                            .paragraphStyle:para
        ])

    let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)

    let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)

    CTFrameDraw(frame, ctx)

    let cgImage = ctx.makeImage()

    return cgImage

есть ли способ сделать это, все еще используя CoreText?

EDIT: возможно это связано, однако я считаю, что этот вопрос все еще актуален. на этот вопрос можно ответить явно с помощью кода, тогда как раньше код не предоставлялся. Я уже округляю путь, используемый фреймсеттером, до интегралов (как и размер шрифта)

полное содержание кода, который будет работать на игровой площадке Swift, размещено ЗДЕСЬ


person Nick    schedule 28.03.2019    source источник
comment
Возможный дубликат абзаца основного текста внутри UIScrollView размыт   -  person Tamás Sengel    schedule 28.03.2019


Ответы (1)


Это может показаться очевидным, но стоит повторить, что CTFrameDraw(_:_:) в конечном итоге просто выполняет операции с CGContext, поэтому его текстовые функции необходимы.

В зависимости от специфики того, что вы хотите, я предлагаю вам поэкспериментировать с функциями сглаживания шрифтов на CGContext, начиная с setAllowsFontSmoothing(_:).

ИЗМЕНИТЬ

Используя вашу игровую площадку, я нашел конкретное решение. Добавьте setAllowsAntialiasing непосредственно перед рисованием текста:

ctx.setAllowsAntialiasing(false)
CTFrameDraw(frame, ctx)
person jjrscott    schedule 29.03.2019